如何用Python将文件夹内可搜索PDF转为无损不可搜索PDF?
解决可搜索PDF转不可搜索PDF时的画质损失问题(批量处理方案)
方案一:优化PyMuPDF参数,保证画质
你之前用PyMuPDF出现画质下降,大概率是默认分辨率设置过低。调整渲染参数后可以大幅提升输出画质,以下是批量处理脚本:
首先安装依赖:
pip install pymupdf
批量处理脚本:
import os import fitz # PyMuPDF def convert_to_non_searchable(input_pdf, output_pdf, dpi=300): doc = fitz.open(input_pdf) new_doc = fitz.open() # 计算缩放比例:PDF默认DPI为72,300DPI是兼顾画质和体积的最优值 zoom = dpi / 72 matrix = fitz.Matrix(zoom, zoom) for page in doc: # 高分辨率渲染页面为图像 pix = page.get_pixmap(matrix=matrix, alpha=False) # 将图像插入新PDF页面 new_page = new_doc.new_page(width=pix.width, height=pix.height) new_page.insert_image(new_page.rect, pixmap=pix) new_doc.save(output_pdf) new_doc.close() doc.close() def batch_process(input_folder, output_folder, dpi=300): os.makedirs(output_folder, exist_ok=True) for filename in os.listdir(input_folder): if filename.lower().endswith('.pdf'): input_path = os.path.join(input_folder, filename) output_path = os.path.join(output_folder, f"non_searchable_{filename}") print(f"处理中:{filename}") convert_to_non_searchable(input_path, output_path, dpi) print("所有文件处理完成!") # 替换为你的文件夹路径 if __name__ == "__main__": INPUT_DIR = "你的输入PDF文件夹路径" OUTPUT_DIR = "你的输出文件夹路径" batch_process(INPUT_DIR, OUTPUT_DIR, dpi=300)
- 若需更高画质,可将
dpi设为600(文件体积会相应增大) alpha=False关闭透明通道,避免不必要的体积浪费
方案二:用Ghostscript批量处理(无需poppler)
如果你更倾向用Ghostscript,它对PDF画质的控制更精准,且转换效率更高:
先安装Ghostscript
- Windows:官网下载安装包,将安装路径添加到系统
PATH环境变量 - macOS:终端执行
brew install ghostscript - Linux:终端执行
apt install ghostscript(Debian/Ubuntu)或yum install ghostscript(CentOS)
批量调用脚本
import os import subprocess def gs_convert(input_pdf, output_pdf, dpi=300): # Ghostscript核心命令,保证高画质转换 cmd = [ "gs", "-dNOPAUSE", "-dBATCH", "-sDEVICE=pdfwrite", f"-r{dpi}", "-dPDFSETTINGS=/prepress", # 印刷级画质配置 "-dEmbedAllFonts=false", # 转图像后无需嵌入字体 "-sOutputFile=" + output_pdf, input_pdf ] subprocess.run(cmd, check=True) def batch_process_gs(input_folder, output_folder, dpi=300): os.makedirs(output_folder, exist_ok=True) for filename in os.listdir(input_folder): if filename.lower().endswith('.pdf'): input_path = os.path.join(input_folder, filename) output_path = os.path.join(output_folder, f"non_searchable_{filename}") print(f"处理中:{filename}") gs_convert(input_path, output_path, dpi) print("所有文件处理完成!") # 替换为你的文件夹路径 if __name__ == "__main__": INPUT_DIR = "你的输入PDF文件夹路径" OUTPUT_DIR = "你的输出文件夹路径" batch_process_gs(INPUT_DIR, OUTPUT_DIR, dpi=300)
-dPDFSETTINGS=/prepress对应高画质,若想减小体积可改为/default(画质略降)或/screen(适合快速查看)
内容的提问来源于stack exchange,提问作者AlfredWithoutBatman
相关产品推荐
相关产品推荐

