【问题标题】:How to add content to an existing PDF document smoothly?如何将内容顺利添加到现有的 PDF 文档中?
【发布时间】:2012-03-01 01:31:04
【问题描述】:

要求是: 我有一个现有的 PDF 文档。我想在 PDF 文档的开头(第一页)插入一个段落,该段落是对某些内容的摘要。

我正在使用 itext2.1.5 库来导入现有的 PDF 文档并进行插入操作。我已经有了解决方案,但不是很满意。 我目前的方法是缩小现有的第一页,使其看起来更小,占用更少的空间,然后将新段落放在它上面。但是客户对这个解决方案并不满意,他们认为整个新PDF文档的字体大小不一致(第一页的字体大小看起来比其他页面小,因为缩小了)。

所以我想知道是否有更好的方法来实现这一目标,即像在 Word 文档中那样顺利地将一些内容插入现有 PDF 中?

谢谢!

编辑: 为什么我投了反对票?

【问题讨论】:

    标签: java pdf-generation itext


    【解决方案1】:

    实际上没有任何实用的方法可以做到这一点。与任何类型的文档一样,理论上可以对 PDF 进行任何更改,但这样做更像是尝试在没有源代码的情况下调试程序;即使是目标代码中的微小更改也会迫使您移动所有内容,并且您必须编辑各种非人工可编辑的东西,因此实际上,唯一的解决方案是修改源代码,然后重新编译。

    PDF 是page description language;它的目的是准确地指定页面的外观,并且必须非常详细地做到这一点,以至于每个平台上的每个 PDF 阅读器都会产生完全相同的产品。这不仅包括页面内容(文本、图像等)和格式(文本加粗、居中等),还包括字体本身、每个对象的精确 XY 坐标以及各种其他细节如此神秘,我只能猜测它们可能是什么,除非他们正在创作 PDF 阅读器,否则任何人都不应该处理这些细节。

    要向现有 PDF 添加一段文本,您必须了解其中的每一个细节,并且必须重新计算其中的大部分内容以容纳额外的段落。这除了令人麻木之外,还需要重新发明大量非平凡的逻辑来弄清楚页面上所有内容的确切位置。

    不值得。

    如果您要处理的所有文档都具有完全相同的布局,并且您有一个模板或有能力创建一个类似的模板,那么您可以通过编程方式从 PDF 中提取文本内容,并使用它加上您的新段落以填写模板,然后将其呈现为 PDF。对于第一步(提取文本),Apache PDFBox,一个用于处理 PDF 文档的开源 Java 库,是一个流行的选择。

    如果文档完全不同,那么您必须坚持让您的客户以透明格式向您提供文档;也就是说,它描述了文档的内容和格式,而不是如何准确呈现它的细节。您可以在功能齐全的文字处理器(纯文本、富文本格式、OpenDocument、Office Open XML)中编辑的任何内容都符合条件。所有这些格式都存在 Java 库(尽管我不知道它们有多好),并且它们受到 Microsoft Word 和 LibreOffice 的支持,因此您的客户可能首先以其中一种格式创建了文档。

    【讨论】:

    • 谢谢泰蒙!三个问题:1. 有没有规定不能修改现有PDF的格式、内容、字体等,所以我可以给客户看。 2.你有从PDF中提取文本的例子吗?我认为客户的 PDF 仅包含几行文本,但不是很确定。 3. 什么样的可编辑格式被广泛使用并在Java中有定义好的api库?
    • @GrantZhu 我已经扩展了我的答案。没有规范说明这一点,因为这不是编辑 PDF 不切实际的原因,但我提供了一个解释,希望您可以以某种形式向您的客户提供。
    • @GrantZhu 没问题。仅供参考,如果您的问题已得到解答,您可以点击复选标记接受答案。
    【解决方案2】:

    如果您必须缩小现有 PDF 内容以适应新内容并且客户不喜欢缩小字体,那么您无法通过这种方式解决问题。提供相互冲突的要求将是一项壮举。

    如果源 PDF 是静态的(或很少更改),那么您可能应该模仿它们并简单地按需生成完整的 PDF,允许您需要添加(插入段落)。如果您可以编写必要的布局或Docmosis 或JODReports,则可以扩展您对 iText 的使用。

    如果您的源 PDF 不同或动态,那么正如 Taymon 所说,您没有太多机会。 如果您使用“PDF 的目的”之类的搜索字符串搜索网络,您会发现一些很好的参考信息,说明为什么它不容易编辑。

    【讨论】:

    • 谢谢jowierun。收缩不是要求的一部分,这是我的实现,因为我找不到更好的方法。客户只关心结果。感谢您的推荐。
    猜你喜欢
    • 2011-03-21
    • 2015-06-23
    • 1970-01-01
    • 2014-07-13
    • 2020-12-09
    • 2021-09-13
    • 2014-07-06
    • 2015-11-23
    • 2013-04-04
    相关资源
    最近更新 更多