我试图复制现有的pdf文件到一些新的文件,使用itextpdf库在Java。我正在使用5.5.10版本的itextpdf。我面临着两种不同的问题: PDFStamper和PdfCopy。当我使用PDFStamper类时,我观察到新的文件大小大幅度增加,尽管没有添加任何新的项。这是代码块:
String currFile="C:\misc\pdffiles\AcroJS.pdf" ;
String dest = "C:\misc\pdffiles\AcroJS_copy.pdf" ;
PdfReader reader = new PdfReader(currFile) ;
PdfStamper stamper = new PdfStamper(reader,new FileOutputStream(dest)) ;
stamper.close() ;
reader.close() ;一些观察结果是:7 MB (原始)到13 MB (Approx,新文件),116 KB > 119 KB (Approx)
当我只是复制现有的pdf文件时,我希望文件大小大致相同。我不知道为什么尺寸会增加那么多。
我也上过PdfCopy课。我使用PdfCopy遵循了两种方法:
但这两种方法的问题在于,它正在从pdf文件中丢弃一些非内容元数据,因此,当Adobe阅读器打开时,新的pdf正在崩溃。例如,我的pdf包含字典对象PdfName.S。在这种情况下,新创建的pdf文件只有2KB (原来是1.6MB),这显然意味着没有任何东西被复制到文档中,并且它被破坏了。
我最初的要求非常简单:复制现有的pdf到新的pdf文件,不增加大小,不丢弃必要的项目。显然,它不像,复制,粘贴,然后重命名。因为在下一步,我有一些处理与pdf内容有关。任何帮助都将不胜感激。
操作系统: Windows 10 Pro Java : 1.8.101文本: 5.5.10
谢谢
发布于 2016-12-18 21:30:43
PdfStamper的使用
你的代码
你的代码
PdfStamper stamper = new PdfStamper(reader,new FileOutputStream(dest)) ;
stamper.close() ;本质上告诉iText复制原始PDF,丢弃未使用的对象,并使用iText的默认压缩设置。
iText的默认压缩设置包括不使用压缩的交叉引用和对象流(在PDF1.5中引入),而是使用比较老的交叉引用表和单独压缩对象的技术。
另一方面,示例文件确实使用了这些技术。因此,它是更好的压缩。
全压缩代码
您也可以告诉iText使用这些改进的压缩技术,如下所示:
PdfReader reader = new PdfReader(resourceStream);
PdfStamper stamper = new PdfStamper(reader, outputStream);
stamper.setFullCompression();
stamper.close();(https://github.com/mkl-public/testarea-itext5/blob/master/src/test/java/mkl/testarea/itext5/stamp/Stamping.java#L120测试方法testStampAcroJSCompressed__)
这导致文件小于4MB的大小。
附加模式代码
如果您想保持对原始对象存储方式的忠诚度,可以使用追加模式,它以相同的方式复制原始文件,并以所谓的增量更新的形式添加更改,如下所示:
PdfReader reader = new PdfReader(resourceStream);
PdfStamper stamper = new PdfStamper(reader, outputStream, '\0', true);
stamper.close();(https://github.com/mkl-public/testarea-itext5/blob/master/src/test/java/mkl/testarea/itext5/stamp/Stamping.java#L95测试方法testStampAcroJSAppended__)
这会导致文件略大于原始文件。
PdfCopy的使用
你观察到PdfCopy
正在丢弃一些非内容元数据。
当然有了。PdfCopy旨在将页面从一个PDF复制到另一个PDF,保持内容和注释的原样,但忽略其他页面级别和所有文档级别的信息。
https://stackoverflow.com/questions/41183349
复制相似问题