【问题标题】:iText - add content to the bottom of an existing pageiText - 将内容添加到现有页面的底部
【发布时间】:2012-11-08 01:47:39
【问题描述】:

我想在 PDF 文件的每一页中添加一段文本。 This answer in SO 工作正常。但是,文本被添加到页面顶部。我想将我的文字添加到每一页的底部。我该怎么做?

这是代码的相关部分。

    while (iteratorPDFReader.hasNext()) {
        PdfReader pdfReader = iteratorPDFReader.next();

        // Create a new page in the target for each source page.
        while (pageOfCurrentReaderPDF < pdfReader.getNumberOfPages()) {
            document.newPage();
            pageOfCurrentReaderPDF++;
            currentPageNumber++;
            page = writer.getImportedPage(pdfReader, pageOfCurrentReaderPDF);
            cb.addTemplate(page, 0, 0);

            document.add(new Paragraph("My Text here"));  //As per the SO answer

        }
        pageOfCurrentReaderPDF = 0;
    }

代码是一个函数的一部分,它接受一个文件夹,读取其中的 PDF 文件并将它们合并到一个文件中。所以,我想在上面的循环本身中添加文本,而不是再次迭代文件。

【问题讨论】:

    标签: java itext


    【解决方案1】:

    也许this 可能会在这里提供帮助...我怀疑您想要执行以下操作:

    cb.addTemplate(page, 0, 0);
    
    document.add(new Paragraph("My Text here"));  
    document.setFooter(new HeaderFooter("Footnote goes here"));
    }
    pageOfCurrentReaderPDF = 0;
    

    【讨论】:

    • 该技术自 2005 年以来一直没有记录。在 2006 年编写的书中故意省略了该技术,并在 2008 年或 2009 年从 iText 中删除了该功能。
    • 是的,我的 jar 没有 HeaderFooter 类。
    • @BrunoLowagie 链接的文档有你的技术,但我提出的 sn-p 似乎更清晰。
    【解决方案2】:

    如果你想自动为每个页面添加内容,你需要一个页面事件。 这在我的书“iText in Action - Second Edition”的第 5 章中有解释。 如果您没有这本书的副本,您可以参考示例here。 您也可以通过查找关键字Header / Footer来找到解决方案。

    您所指的示例乍一看并不正确。当然,您可以使用“两遍”,一个用于创建内容,另一个用于添加页眉或页脚,但建议的解决方案与推荐的解决方案不同:http://itextpdf.com/examples/iia.php?id=118

    您正在复制您的问题中的错误:您到底为什么要将刚刚创建的文档导入到新文档中,从而丢弃您添加到该文档中的所有可能的交互性?这没有任何意义。令人难以置信的是,这个答案获得了如此多的赞成票。我是 iText 的原始开发者,我对这个答案一点也不满意!

    在您的情况下,可能不需要先在内存中创建文档,然后再添加页脚。看看http://itextpdf.com/examples/iia.php?id=104

    您需要创建一个PdfPageEvent 实现(例如使用PdfPageEventHelper)并且您需要实现onEndPage() 方法。

    记录在案的警告:

    • 不要使用onStartPage()添加内容,
    • 不要向传递给页面事件的Document 对象添加任何内容,
    • 除非您指定不同的页面大小,否则左下角的坐标为x = 0; y = 0。添加页脚时需要考虑到这一点。页脚的 y 值低于页眉的 y 值。

    更多信息:查阅我的书。

    【讨论】:

    • 感谢您的详细解答!我不拥有这本书,但我一直在参考这些例子。我上面粘贴的代码是由示例代码形成的。正如我所解释的,我有一些文件需要附加一些内容(每页不同),然后合并到一个 PDF 中。这是整个函数 pastebin.com/Xn8JzrAz 的 pastebin 是否使用了比应有的更多资源?
    • 这是奇怪的代码。请阅读manning.com/lowagie2/samplechapter6.pdf 了解如何正确连接 PDF 的完整概述。在您的代码中,您丢弃了原始文档中存在的所有可能的交互性(链接、注释等)。 p188 上的示例(标题为“使用 PdfCopy 添加内容”)以更好的方式解决了这个问题。
    • ;) 好的,虽然我将其发布为答案,但@BrunoLowagie 还在此处的评论中引用了最符合要求的示例...
    • 对“我是 iText 的原始开发者”投了反对票。评论你的代码。
    【解决方案3】:

    查看 iText in Action,第 2 版的 chapter 6,尤其是第 6.4.1 小节:连接和拆分 PDF 文档。

    清单 6.22,ConcatenateStamp.java,向您展示了如何从多个其他 PDF 的页面副本(在您的情况下为所有页面)创建 PDF;该示例还添加了一个新的“Y 页 X”页脚;这演示了如何在合并源文件时在页面上的给定位置添加内容。

    【讨论】:

    • 示例中的 ColumnText.showTextAligned 行给了我一个空指针错误。知道为什么吗?
    • 示例不应失败。我一到办公室就会运行它来检查。您是按原样尝试该示例,还是已经根据您的用例对其进行了调整?在后一种情况下:如何?
    • 我刚刚运行了这个示例(使用最新版本的 iText 和 iText in Action,第 2 版中的示例),它完美地执行。因此,您运行它的方式一定有问题。
    猜你喜欢
    • 1970-01-01
    • 2018-11-11
    • 2011-03-21
    • 1970-01-01
    • 2014-04-01
    • 1970-01-01
    • 2020-11-03
    • 2015-04-19
    • 1970-01-01
    相关资源
    最近更新 更多