You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django项目中使用Reportlab的pdfencrypt为PDF添加打开密码

解决方案

你只需要将加密实例作为encrypt参数传入doc.build()方法即可,具体修改如下:

  1. 首先确保导入对应的依赖:
from reportlab.lib import pdfencrypt
  1. 找到原代码中doc.build(elements)这一行,替换为以下内容:
encrypt = pdfencrypt.StandardEncryption("password", canPrint=0)
doc.build(elements, encrypt=encrypt)

修改后完整可运行代码

from reportlab.lib import pdfencrypt
# 保留你原来的其他导入内容即可

def pdf_view(request):
    response = HttpResponse(content_type='application/pdf')
    response['Content-Disposition'] = 'attachment; filename="members.pdf"'
    elements = []
    doc = SimpleDocTemplate(response, rightMargin=0.5 * cm, leftMargin=6.5 * cm, topMargin=0.3 * cm, bottomMargin=0)
    rows = []
    users = User.objects.all()
    for user in users:
        rows.append((
            user.username,
            user.email,
            user.first_name,
            user.last_name,
            formats.date_format(user.date_joined, "SHORT_DATETIME_FORMAT"),
            formats.date_format(user.subscriptions.current_period_end, "SHORT_DATETIME_FORMAT")
        ))
    table = Table(rows, colWidths=46 * mm, rowHeights=30, repeatRows=1)
    table.setStyle([
        ('GRID', (0, 0), (-1, -1), 0.25, colors.black),
        ("ALIGN", (0, 0), (-1, -1), "LEFT"),
    ])
    # 原代码此处重复创建了Table对象,会导致上方设置的样式失效,已删除重复代码
    elements.append(table)
    # 新增加密逻辑
    encrypt = pdfencrypt.StandardEncryption("password", canPrint=0)
    doc.build(elements, encrypt=encrypt)
    return response

补充说明

  • canPrint=0表示禁止用户打印该PDF文件,如需放开打印权限可修改为canPrint=1
  • 你可以将固定密码替换为动态生成的专属密码,实现不同用户生成的PDF密码不同

内容的提问来源于stack exchange,提问作者Biju

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 20:06:10