如何使用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
相关产品推荐
相关产品推荐

