首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当使用itext java库复制时,pdf文件大小大大增加。

当使用itext java库复制时,pdf文件大小大大增加。
EN

Stack Overflow用户
提问于 2016-12-16 11:24:57
回答 1查看 3K关注 0票数 4

我试图复制现有的pdf文件到一些新的文件,使用itextpdf库在Java。我正在使用5.5.10版本的itextpdf。我面临着两种不同的问题: PDFStamper和PdfCopy。当我使用PDFStamper类时,我观察到新的文件大小大幅度增加,尽管没有添加任何新的项。这是代码块:

代码语言:javascript
复制
    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遵循了两种方法:

  1. 一页一页地复制。
  2. 在pdfcopy对象上调用setMergeFields(),然后调用pdfcopy.addDocument(阅读器);

但这两种方法的问题在于,它正在从pdf文件中丢弃一些非内容元数据,因此,当Adobe阅读器打开时,新的pdf正在崩溃。例如,我的pdf包含字典对象PdfName.S。在这种情况下,新创建的pdf文件只有2KB (原来是1.6MB),这显然意味着没有任何东西被复制到文档中,并且它被破坏了。

我最初的要求非常简单:复制现有的pdf到新的pdf文件,不增加大小,不丢弃必要的项目。显然,它不像,复制,粘贴,然后重命名。因为在下一步,我有一些处理与pdf内容有关。任何帮助都将不胜感激。

操作系统: Windows 10 Pro Java : 1.8.101文本: 5.5.10

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-18 21:30:43

PdfStamper的使用

你的代码

你的代码

代码语言:javascript
复制
PdfStamper stamper = new PdfStamper(reader,new FileOutputStream(dest)) ;
stamper.close() ;

本质上告诉iText复制原始PDF,丢弃未使用的对象,并使用iText的默认压缩设置。

iText的默认压缩设置包括不使用压缩的交叉引用和对象流(在PDF1.5中引入),而是使用比较老的交叉引用表和单独压缩对象的技术。

另一方面,示例文件确实使用了这些技术。因此,它是更好的压缩。

全压缩代码

您也可以告诉iText使用这些改进的压缩技术,如下所示:

代码语言:javascript
复制
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的大小。

附加模式代码

如果您想保持对原始对象存储方式的忠诚度,可以使用追加模式,它以相同的方式复制原始文件,并以所谓的增量更新的形式添加更改,如下所示:

代码语言:javascript
复制
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,保持内容和注释的原样,但忽略其他页面级别和所有文档级别的信息。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41183349

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档