如何用Python将含文本与条码的PDF设为不可选中(只读/扁平化)
解决HTML生成PDF的文本/图片不可选中问题
针对你用HTML生成PDF后,需要让文本和条码图片无法被选中的需求,之前的fillpdf、pypdftk没效果的话,可以试试下面几个实用方案:
方案1:全页面光栅化(最彻底)
把PDF的每一页转成图片,再重新封装成PDF,这样整个文档都是纯图片层,完全无法选中内容。用Python实现的话,结合pdf2image(依赖Poppler工具)和img2pdf效率最高:
from pdf2image import convert_from_path import img2pdf import os # 把PDF转成图片列表,设置300DPI保证清晰度 pages = convert_from_path("input.pdf", dpi=300) temp_img_paths = [] for idx, page in enumerate(pages): img_path = f"temp_page_{idx}.png" page.save(img_path, "PNG") temp_img_paths.append(img_path) # 把图片合并成新PDF with open("output_protected.pdf", "wb") as f: f.write(img2pdf.convert(temp_img_paths)) # 清理临时文件 for path in temp_img_paths: os.remove(path)
如果没有安装依赖,先执行:pip install pdf2image img2pdf,同时要确保系统里有Poppler(Windows可以下载预编译包,Linux直接装poppler-utils,Mac用brew装poppler)。
方案2:用Ghostscript一键光栅化
如果不想写代码,直接用Ghostscript命令行处理,这是业内常用的PDF处理工具,效果稳定:
gs -sDEVICE=pdfwrite -dNOPAUSE -dBATCH -dSAFER -dPDFSETTINGS=/prepress -o output_protected.pdf input.pdf
这个命令会把原PDF的所有内容光栅化,生成的PDF里没有可选中的文本或图片,同时能保证较好的清晰度。
方案3:设置PDF权限(适合不需要彻底光栅化的场景)
如果只是想限制文本选择,而非完全转成图片,可以通过修改PDF的权限位实现。用PyPDF2就能做到:
from PyPDF2 import PdfReader, PdfWriter reader = PdfReader("input.pdf") writer = PdfWriter() # 复制所有页面 for page in reader.pages: writer.add_page(page) # 设置权限:禁止内容复制、禁止修改文档,允许打印和注释修改 # 权限位是二进制掩码,0b1111111111110010 对应上述权限 writer.encrypt( user_password="", # 打开不需要密码 owner_password="your_owner_password", # 拥有者密码,用于修改权限 permissions_flag=0b1111111111110010 ) with open("output_protected.pdf", "wb") as f: writer.write(f)
注意:这种权限限制依赖PDF阅读器的合规性,部分工具可以绕过,所以如果需要彻底禁止选中,优先选前两个光栅化方案。
内容的提问来源于stack exchange,提问作者Ajay Gidwani
相关产品推荐
相关产品推荐

