【问题标题】:Adding page footer to pdf using itext使用 itext 将页脚添加到 pdf
【发布时间】:2015-06-04 06:03:32
【问题描述】:

我可以使用 java 和 itext 创建一个带有页眉和正文内容的 pdf 文件。您可以在文件共享站点by clicking on this link 查看生成的文件。

如何更改下面的代码,以便在页面底部创建页脚?我希望页脚显示“MyCity、MyState、MyPostalCode MyPhoneNumber”。我还希望页脚在其上方有一行,就像在上面的示例链接中页眉在其上方有一行一样。

这是在上面的链接中生成示例 PDF 的代码:

public class HeaderFooter {

    public static final String RESULT = "C:\\path\\to\\headerfooter.pdf";

    public static void main(String[] args) throws SQLException, DocumentException, IOException {

        Document document = new Document(PageSize.A4, 36, 36, 54, 36);
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        PdfWriter.getInstance(document, baos);
        document.open();
        document.add(new Paragraph(""));
        document.add(Chunk.NEWLINE);
        document.add(new Paragraph("First paragraph."));
        document.add(new Paragraph("Second paragraph."));
        document.add(new Paragraph("Third paragraph."));
        document.newPage();
        document.close();

        PdfReader reader = new PdfReader(baos.toByteArray());
        PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(RESULT));
        int n = reader.getNumberOfPages();
        for (int i = 1; i <= n; i++) {
            getHeader(i, n).writeSelectedRows(0, -1, 34, 803, stamper.getOverContent(i));
        }
        stamper.close();
        reader.close();
    }

    public static PdfPTable getHeader(int x, int y) {
        PdfPTable table = new PdfPTable(2);
        table.setTotalWidth(527);
        table.setLockedWidth(true);
        table.getDefaultCell().setFixedHeight(20);
        table.getDefaultCell().setBorder(Rectangle.BOTTOM);
        table.addCell("This is the Document's Title.");
        table.getDefaultCell().setHorizontalAlignment(Element.ALIGN_RIGHT);
        return table;
    }
}

对于任何想要花一分钟时间让上述代码在他们的计算机上运行的人,添加到 pom.xml 的 maven 依赖项是:

  <dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itextpdf</artifactId>
    <version>5.5.5</version>
  </dependency>

【问题讨论】:

  • 你知道writeSelectedRows参数的含义吧?因此,它应该是相当明显的......提示:您的34, 803 是添加标题表的坐标。对于页脚表,使用相当小的 y 坐标。

标签: java pdf pdf-generation itext


【解决方案1】:

您复制/粘贴了我为我的书编写的 TwoPasses 示例中的代码。请注意,您不应该复制/粘贴其他人编写的代码,而无需注明出处(例如找到代码的链接)。这是我在对 iText 进行代码审查时学到的东西(参见我为 Founder Institute 展示的幻灯片 "Startup Legal and IP")。

另外:当您复制/粘贴在书的上下文中编写的代码时,请确保您像真正的开发人员一样阅读您复制/粘贴的代码应该执行的操作。例如:在你作为灵感的书中,也有PdfCalendar的例子。

在此示例中,我们还使用writeSelectedRows() 方法创建了一个在绝对位置添加的表。就像你一样,我们使用setTotalWidth() 方法定义了一个宽度,这意味着我们可以使用getTotalHeight() 方法询问表格的高度。

PdfCalendar 示例中,我们将此值用作writeSelectedRows() 方法的参数:

table.writeSelectedRows(0, -1, 169, table.getTotalHeight() + 20, canvas);

在这种情况下,x 的值为 169,该值是通过将页面宽度(横向 A4 = 842)减去表格宽度(我们定义为 504)除以二:338 / 2 = 169。

对于y,我们取了表格的高度(可能会根据一个月中的天数而变化),并添加 20 个用户单位作为底部边距。

您选择了 34 作为 x 的值,这没问题,但 y 的值选择了 806,如果您希望表格作为页脚,这很奇怪:806 通常位于页面顶部(尤其是因为您将页面大小定义为PageSize.A4)。

如果您从头开始创建文档并且想要添加页眉和页脚,您可能希望一次性完成并使用页面事件添加页脚。

【讨论】:

  • 嗯,投反对票?我提供的解决方案不正确吗?
  • 嗨@CodeMed 请解释为什么提供的解决方案不适合您。
  • @santiago 我不知道,但另一方面,OP 从未接受过答案,所以我真的很想知道我的答案有什么问题。如果它不正确,那就这样吧。如果它是正确的,OP 可以通过接受答案来判断。
  • OP 没有义务接受任何答案,无论正确与否。由于反对票是匿名的,因此除非他们发表评论(他们不必这样做),否则不可能知道是谁做的。
  • @santiago 是的,匿名投票是一种害虫。在过去的 24 小时内,我失去了 16 个代表点,即使是在诸如 stackoverflow.com/questions/12604171/… 这样的完全真实的问题上也是如此。这些显然是仇恨投票,不是来自理解问题的人,而是来自那些认为他们可以通过投票来伤害我的人。他们不明白这是多么荒谬。这可能会给他们一种力量感。
猜你喜欢
  • 2015-12-05
  • 2014-02-17
  • 1970-01-01
  • 2023-03-12
  • 2013-11-20
  • 2018-01-30
  • 1970-01-01
  • 1970-01-01
  • 2020-04-26
相关资源
最近更新 更多