Python合并PDF时如何合并重复字体以减小文件体积?
解决PDF合并后字体重复导致体积暴涨的问题
问题原因
你用pypdf合并450个PDF时,每个源文件里的字体哪怕是同一款,都会被单独嵌入到最终PDF中,pypdf默认不会自动去重合并重复的字体资源,这就导致字体数量暴增到613个,占了95%的文件体积。而Acrobat打印生成PDF时,会重新梳理文档资源,自动合并重复字体、子集化字体甚至转成轮廓,所以体积会大幅缩小。
解决方案
方案1:改用PyMuPDF(fitz)合并(推荐)
PyMuPDF在合并PDF时会自动优化资源,包括合并重复字体,同时支持压缩,能直接解决体积问题:
import fitz def merge_pdfs(pdf_paths, output_file): # 创建空的合并文档 merged_doc = fitz.open() for pdf_path in pdf_paths: # 逐个打开源PDF并插入到合并文档中 with fitz.open(pdf_path) as source_doc: merged_doc.insert_pdf(source_doc) # 保存时启用垃圾清理和压缩:garbage=4清理所有无用资源,deflate=True压缩流 merged_doc.save(output_file, garbage=4, deflate=True) merged_doc.close()
方案2:优化pypdf的合并逻辑
如果坚持使用pypdf,可以通过启用压缩和资源优化来尝试减少体积(效果可能弱于PyMuPDF):
import pypdf from pypdf import PdfReader def merge(folder_path, pdf_paths, output_file): merger = pypdf.PdfWriter() # 启用默认压缩模式 merger.set_compression_mode(pypdf.CompressionMode.DEFAULT) for pdf_path in pdf_paths: reader = PdfReader(open(pdf_path, 'rb')) # 追加文档,关闭大纲导入以减少额外资源 merger.append(reader, import_outline=False) # 优化文档,合并重复的资源对象(包括字体) merger.optimize() merger.write(output_file) merger.close()
方案3:合并后用Ghostscript优化(需安装Ghostscript)
如果允许使用外部工具,Ghostscript是处理PDF体积的专业工具,能达到和Acrobat打印类似的效果:
# 命令行执行,merged.pdf是合并后的大文件,optimized.pdf是优化后的小文件 gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/screen -dNOPAUSE -dBATCH -sOutputFile=optimized.pdf merged.pdf
/screen参数针对屏幕显示优化,会压缩图像、合并重复字体,视觉效果满足需求,体积大幅降低。
内容的提问来源于stack exchange,提问作者Ryan Schunk
相关产品推荐
相关产品推荐

