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

2024-05-28

我正在尝试使用 Java 中的 itextpdf 库将现有的 pdf 文件复制到一些新文件中。我使用的是 itextpdf 5.5.10 版本。我在两种方式上都面临着不同的问题: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(大约,新文件),116 KB > 119 KB(大约)

当我复制现有的 pdf 文件时,我期望文件大小大致相同。我无法弄清楚为什么尺寸会增加那么多。

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

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

但这两种方法的问题在于,它会丢弃 pdf 文件中的一些非内容元数据,因此新的 pdf 在由 Adob​​e reader 打开时会被破坏。例如我的 pdf 包含字典对象 PdfName.S 。在这种情况下,新创建的 pdf 文件只有 2KB(原始文件为 1.6 MB),这显然意味着没有任何内容复制到文档中,并且它已损坏。

我最初的要求很简单:将现有的pdf复制到新的pdf文件,不增加大小,不扔掉必要的项目。显然它不像复制、粘贴然后重命名。因为下一步我要对pdf内容进行一些处理。任何帮助都感激不尽。

操作系统:Windows 10 专业版 爪哇:1.8.101 文本:5.5.10

thanks


Use of PdfStamper

你的代码

你的代码

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

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

iText 的默认压缩设置包括not使用压缩交叉引用和对象流(在 PDF 1.5 中引入),但使用交叉引用表和单独压缩对象的旧技术。

另一方面,示例文件确实使用了这些技术。因此,它的压缩效果要好得多。

全压缩代码

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

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

stamper.close();

(冲压.java https://github.com/mkl-public/testarea-itext5/blob/master/src/test/java/mkl/testarea/itext5/stamp/Stamping.java#L120测试方法testStampAcroJSCompressed)

这会导致文件大小小于 4 MB。

使用附加模式的代码

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

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

stamper.close();

(冲压.java https://github.com/mkl-public/testarea-itext5/blob/master/src/test/java/mkl/testarea/itext5/stamp/Stamping.java#L95测试方法testStampAcroJSAppended)

这会产生比原始文件稍大的文件。

Use of PdfCopy

你观察到PdfCopy

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

当然可以。PdfCopy旨在复制pages从一个 PDF 到另一个 PDF,保持内容和注释不变,但忽略其他页面级和所有文档级信息。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用itext java库复制时pdf文件大小大大增加 的相关文章

随机推荐

  • 如何在 Popup div 中加载 iframe 内容?

    如何在 Popup div 中加载 iframe 内容 单击每个链接时将打开弹出 div 从每个链接 页面 url 将加载到弹出 div 内的 iframe href document ready function openpop clic
  • 如何使用固定宽度的卡片制作卡片组?

    我想做一个响应式的卡牌 https getbootstrap com docs 4 0 components card card decks使用引导4固定宽度卡片 https getbootstrap com docs 4 0 compon
  • 使用键盘快捷键浏览代码[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 I m starting to feel the need to run fastly through code with keybo
  • 您如何构建 SVN 存储库? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 什么是更好的 A server 1080 repo projectA trunk branches branch1 branches branc
  • PHP:如何将信息返回到等待的脚本并继续处理

    假设有两个脚本Requester php和Provider php Requester需要Provider进行处理并向其发出http请求 Provider php data data 在这种情况下 Provider 很快就找到了答案 但为了
  • 不要使用对象作为类型

    我收到 lint 错误 不要使用对象作为类型 当我使用对象作为类型时 示例如下 export const myFunc obj object string gt return obj toString 知道我应该为具有未知属性的对象赋予什么
  • 向 Python 函数添加属性的最佳方法

    以计算数学函数的 Python 函数为例 def func x a b c Return the value of the quadratic function ax 2 bx c return a x 2 b x c 假设我想以函数属性的
  • 正则表达式 - 如何从引号之间提取文本并排除引号

    我需要正则表达式方面的帮助 我需要创建一个规则来保留引号之间的所有内容并排除引号 例如 我要这个 STRING ID 0 Stringtext 变成了 Stringtext Thanks 做到这一点的方法是使用捕获组 然而 不同的语言处理捕
  • Google BigQuery 底层架构

    所以我大约 10 分钟前才开始摆弄 Google BigQuery 我想知道是否有人知道他们用来存储数据的底层架构 例如 这只是他们自己的下一代 BigTable 基础设施吗 另外 他们在索引 索引重建等方面使用什么样的策略是否清楚 我只是
  • .NET 的 C 代码解析器

    有谁知道 NET 的 C 解析器库吗 我打算将 C 代码解析为某种形式的对象图 这样我就可以将其转换为不同的语言 ANTLR 可以做你想做的事 它有一个 C 预处理器和 ANSI C 语法 https github com antlr gr
  • 使用 TLS PSK 加密时如何正确检测流结束?

    我已经准备好了一个简单的 TLS PSK 客户端测试用例 https github com afarber jetty newbie tree master TlsPskClient2 src main java de afarber tl
  • .ko 文件是如何构建的

    我正在尝试将我自己的驱动程序移植到Beagle 板 xm arm cortex A8 在移植时我试图弄清楚如何 ko文件实际构建 在我们的Makefile我们只有一个命令来构建 o file 怎样是一个 ko文件已建立 使用Linux 2
  • SQL FORMAT 函数错误

    这个SQL select FORMAT lNum from rpt myView 产生以下错误 参数数据类型 varchar 对于格式的参数 1 无效 功能 lNum is a varchar 10 运行 SQL Server 2012 v
  • 以点值检测 iPhone 6/6+ 屏幕尺寸

    鉴于新发布的 iPhone 6屏幕尺寸 http www apple com iphone compare iPhone 6 1334h 750w 2x in points 667h 375w iPhone 6 1920 1080 3x i
  • 通过 cli 部署到远程 Glassfish 实例

    我正在尝试通过命令行自动将 Java EE 应用程序从构建服务器 Jenkins 部署到远程 Glassfish 服务器 目前我正在使用 asadmin 它工作得很好 但这个选项要求我在构建服务器上也安装 Glassfish 我想避免这样做
  • 如何在 PL/pgSQL 中“执行”CTE 查询?

    我尝试在下面的代码示例中模拟我的问题 在下面的代码中 我正在做一个select from test在一个程序中 众所周知 我们必须使用perform关键字为此 这很好用 perform from test 但是 如果我尝试将这个简单查询重写
  • 使用启用了两步身份验证的 python 脚本从 nextcloud 下载文件

    我设置了一个 nextcloud 实例 我想使用 python 脚本从那里下载文件 我的 nextcloud 实例对所有用户强制执行两步身份验证 我希望它保持这种状态 我梦想的场景是使用requests库 因此请按照此处的文档进行操作htt
  • 检测Android N版本代码

    是否可以检测用户是否运行 Android N 我有一台装有 Android N 开发者预览版的 Nexus 6 如果我尝试获取构建版本Build VERSION SDK INT 它返回 23 等于 Android Marshmallow Q
  • 如何“切换”枚举变体?

    我想编写一个函数 将提供的值切换 切换到枚举中的下一个值并在末尾环绕 enum Direction NORTH SOUTH EAST WEST 例如 NORTH gt SOUTH SOUTH gt EAST EAST gt WEST WES
  • 使用itext java库复制时pdf文件大小大大增加

    我正在尝试使用 Java 中的 itextpdf 库将现有的 pdf 文件复制到一些新文件中 我使用的是 itextpdf 5 5 10 版本 我在两种方式上都面临着不同的问题 PDFStamper 和 PdfCopy 当我使用 PDFSt