PDFBox复制PDF注释后文件大小翻倍,求原因及解决办法
为什么PDFBox复制注释后文件大小翻倍?
这个问题我做PDF处理时也碰到过,本质是PDFBox的默认保存机制和PDF文件的结构特性导致的,咱们一步步拆解:
问题根源
- PDFBox默认采用增量保存:当你调用
pdf.save()直接覆盖原文件时,PDFBox不会完全重写整个文档,而是把新增的注释、更新的页面元数据等内容追加到原文件末尾,原文件里的旧数据(比如原来的页面内容、旧的注释字典)并不会被删除。相当于原文件内容+新修改内容都留在了输出文件里,自然大小就翻倍了。 - Adobe Reader的优化机制:Adobe打开文件后重新保存时,会对PDF做全面的结构优化——它会重新整理所有PDF对象,移除冗余的旧数据、压缩未压缩的对象、清理不再使用的资源,所以文件大小会恢复到正常水平。
解决办法
这里给你几个实用的方案,按需选择:
1. 使用完全保存模式(最简单)
PDFBox提供了SaveMode.FULL选项,强制完全重写整个文档,而不是增量追加。修改你的保存代码即可:
import org.apache.pdfbox.pdmodel.SaveMode; import java.io.FileOutputStream; // ... 你的加载、添加注释代码 ... pdf.save(new FileOutputStream("test1.pdf"), SaveMode.FULL); pdf.close();
这样保存后的文件会直接生成全新的PDF结构,不会残留旧数据,大小就正常了。
2. 创建新文档复制内容(更稳妥)
如果担心原文档的旧数据干扰,可以创建一个全新的PDDocument,把原页面和要添加的注释都复制过去,再保存:
PDDocument originalPdf = PDDocument.load(new File("test1.pdf")); PDDocument annotatedPdf = PDDocument.load(new File("test/test1.pdf")); // 创建新文档 PDDocument newPdf = new PDDocument(); // 复制原页面到新文档 PDPage targetPage = originalPdf.getPage(0); newPdf.addPage(targetPage); // 添加要复制的注释 PDAnnotation annotation = annotatedPdf.getPage(0).getAnnotations().get(0); newPdf.getPage(0).getAnnotations().add(annotation); // 保存新文档 newPdf.save("test1.pdf"); // 别忘了关闭所有文档 originalPdf.close(); annotatedPdf.close(); newPdf.close();
3. 事后优化文件(适合批量处理)
如果已经生成了大文件,也可以用PDFBox的PDFOptimizer工具做后期优化,它能压缩图片、清理冗余数据:
import org.apache.pdfbox.tools.PDFOptimizer; // 先保存修改后的文件 pdf.save("test1_temp.pdf"); pdf.close(); // 优化文件 PDFOptimizer optimizer = new PDFOptimizer(); optimizer.setCompressImages(true); // 开启图片压缩 optimizer.setImageQuality(0.8f); // 图片质量(按需调整) optimizer.optimize(new File("test1_temp.pdf"), new File("test1.pdf"));
内容的提问来源于stack exchange,提问作者TheDiamondDoge
相关产品推荐
相关产品推荐

