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

如何使用Python的ReportLab生成文本不可选中的PDF文件

ReportLab生成不可选中文本的实现方案

核心实现方式:文本转矢量路径绘制

该方案无需生成静态图片,全程矢量渲染无分辨率损失,完美适配动态变化的字符串需求:

  • 实现原理:将字符串转换为PDF矢量路径对象,PDF阅读器仅会将其识别为图形内容,不会识别为可选中文本,从根源上避免被选中复制。

修改后的示例代码如下:

from StringIO import StringIO
from reportlab.pdfgen import canvas
from reportlab.graphics.shapes import Drawing, TextPath
from reportlab.graphics import renderPDF

buffer = StringIO()
c = canvas.Canvas(buffer)

# 替换原有的canvas.drawString调用
# 可按需调整字体、字号、颜色等参数,和原生drawString参数逻辑一致
text_path = TextPath(30, 30, "Hello world!", fontName="Helvetica", fontSize=12)
# 将路径添加到矢量绘图对象后渲染到画布
drawing = Drawing(0, 0)
drawing.add(text_path)
renderPDF.draw(drawing, c, 0, 0)

c.save()

可选补充防护:设置PDF禁止复制权限

如果需要额外增加防护,可以同时为PDF设置内容复制权限限制,和路径渲染方案搭配形成双重防护:

注意:仅设置权限的方案容易被破解工具绕过,仅作为补充方案使用,不建议单独使用。

权限设置示例代码:

from StringIO import StringIO
from reportlab.pdfgen import canvas
from reportlab.lib import pdfencrypt
from reportlab.graphics.shapes import Drawing, TextPath
from reportlab.graphics import renderPDF

buffer = StringIO()
# 初始化加密规则:无用户密码,禁止复制内容
encrypt_rule = pdfencrypt.StandardEncryption(userPassword="", canCopy=0)
c = canvas.Canvas(buffer, encrypt=encrypt_rule)

# 此处省略绘制文本路径的代码,和上文一致

c.save()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 12:48:02