当前位置: 首页 > 知识库问答 >
问题:

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

公西季
2023-03-14
    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() ;

我希望在复制现有的pdf文件时,文件大小大致相同。我不明白为什么尺寸会增加这么多。

我也试过PdfCopy类。我使用PDFcopy遵循了2种方法:

  1. 逐页复制。
  2. 对pdfcopy对象调用setMergeFields(),然后调用pdfcopy.AddDocument(reader);

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

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

操作系统:Windows 10 Pro Java:1.8.101 itext:5.5.10

谢谢

共有1个答案

聂迪
2023-03-14

您的代码

PdfStamper stamper = new PdfStamper(reader,new FileOutputStream(dest)) ;
stamper.close() ;

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

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

PdfReader reader = new PdfReader(resourceStream);
PdfStamper stamper = new PdfStamper(reader, outputStream);
stamper.setFullCompression();

stamper.close();

(stamping.java测试方法teststampacrojscompressed)

这将导致文件的大小小于4 MB。

如果您希望保持对原始对象存储方式的忠实,则可以使用append模式,该模式相同地复制原始文件,并以所谓的增量更新的形式添加更改,如下所示:

PdfReader reader = new PdfReader(resourceStream);
PdfStamper stamper = new PdfStamper(reader, outputStream, '\0', true);

stamper.close();

您注意到pdfcopy

正在丢弃一些非内容元数据

当然有。pdfcopy旨在将页面从一个PDF复制到另一个PDF,保持内容和注释原样,但忽略其他页面级和所有文档级信息。

 类似资料:
  • 我只使用了库中的几个实际类,即: 提前道谢。

  • 问题内容: 在Windows上的Python中,我可以通过创建一个大文件 现在大约是1 GB。但是,在Linux上,这将返回。 有没有办法在Linux上获得与Windows相同的行为?也就是说,能够使用?来增加文件的大小。 问题答案: 至少在POSIX系统上,不能用于增加(或减小)文件的大小。的功能是将文件的一部分映射到内存。合乎逻辑的是,您请求映射的东西应该确实存在!坦白说,我真的很惊讶您实际上

  • 问题内容: 我正在使用JVM标志运行Java进程,并看到以下输出: 有没有办法解决这个问题? 问题答案: 当无法满足Java堆的分配或永久生成时,命令行选项告诉HotSpot VM生成堆转储。使用此选项运行不会产生任何开销,因此对于OutOfMemoryError需要很长时间才能浮出水面的生产系统很有用。 为了解决您面临的特定问题,可以使用以下纠正措施之一: 措施1: XX:HeapDumpSeg

  • 我正在创建一个简单的文件复制应用程序供我个人使用。但是当我运行这个程序时,输出文件比源文件稍大。我根据文件大小使用缓冲区,如下所示 如果文件大小小于9KB,则缓冲区为512字节 源代码 } 文件大小比较…:<源文件:“龙珠84集mp4”。。。。。文件大小:8,59,93580字节 目标文件:“sample.mp4”。。。。。文件szie:8,70,31808字节 用于运行程序的命令 此问题中使用和

  • 本文向大家介绍C# FileStream复制大文件,包括了C# FileStream复制大文件的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了C# FileStream复制大文件的具体代码,供大家参考,具体内容如下 即每次复制文件的一小段,以节省总内存开销。当然,本机复制也可以采用.NET内部的System.IO.File.Copy方法。 以上就是本文的全部内容,希望对大家的学习有所

  • 问题内容: 我目前正在实现使用jersey rest上传文件的功能。我想设置一个允许的最大文件大小,这对我来说似乎是很常见的要求。 我的第一种方法是使用Jerseys FormDataContentDisposition,它应该包含我可能需要的有关文件的所有信息。但是似乎缺少所有信息,除了文件名,包括文件大小。 这是我的休息方法: 由于返回的大小始终为“ -1”,因此不起作用! 我使用一个非常简单