header 在使用 itext 创建的 pdf 文档的第一页上不可见

header is not visible on first page of pdf document created with itext

我正在尝试将 header 的页脚添加到报告的每一页,但第一页上没有 header。我正在覆盖 PdfPageEventHelper 的 onStartPage 和 onEndPage 方法。 我的代码:

public class HeaderFooterPageEvent extends PdfPageEventHelper {

public void onStartPage(PdfWriter writer, Document document) {
    Image leftUpper = Image.getInstance("leftUpper.png");
    leftUpper.setAbsolutePosition(0, 0);
    Chunk chunk = new Chunk(leftUpper, 0, -45);
    HeaderFooter header = new HeaderFooter(new Phrase(chunk), false);
    header.setBorder(Rectangle.NO_BORDER);
    document.setHeader(header);
}

public void onEndPage(PdfWriter writer, Document document) {
    Image img = Image.getInstance("reportFooter.png");
    img.setAbsolutePosition(0, 0);
    img.scaleAbsolute(595, 50)
    writer.getDirectContent().addImage(img);
}

}

页脚工作正常,但首页上的 header 缺失。 我究竟做错了什么?

你的代码真奇怪。您将过时的 HeaderFooter 功能(很久以前就已从 iText 中删除)与较新的页面事件功能混合在一起。

如果要使用过时的HeaderFooterclass,则不应引入页面事件。在这种情况下,您的错误是您没有在 document.open() 之前设置 header。请注意,如果您选择此选项,则不应在商业环境中使用您的应用程序,因为您使用的 iText 版本不适合商业用途,如 Open Source beta 上的解释(以及其他) StackExchange.

如果你想使用页面事件(推荐这个),你违反了基本规则之一:不要在onStartPage()方法中添加任何内容。所有这些都在免费电子书 The Best iText Questions on Whosebug 中进行了解释,您可以在其中找到对问题(和相应答案)的参考,例如:

您的 onStartPage() 方法包含多个错误。请丢弃该代码,并调整您的 onEndPage() 方法:

public void onEndPage(PdfWriter writer, Document document) {
    Image img = Image.getInstance("reportFooter.png");
    img.setAbsolutePosition(0, 0);
    img.scaleAbsolute(595, 50)
    writer.getDirectContent().addImage(img);
}

您的 onEndPage() 方法在页面底部添加图像:该图像用作页脚。如果你还想添加一个header,你需要像这样修改这个方法:

public void onEndPage(PdfWriter writer, Document document) {
    Image header = Image.getInstance("reportHeader.png");
    header.setAbsolutePosition(792, 0);
    header.scaleAbsolute(595, 50)
    writer.getDirectContent().addImage(header);
    Image footer = Image.getInstance("reportFooter.png");
    footer.setAbsolutePosition(0, 0);
    footer.scaleAbsolute(595, 50)
    writer.getDirectContent().addImage(footer);
}

在此代码段中,我假设页面大小为 A4:842 x 595 个用户单位,并且有 50 个用户单位的边距,因为我定义了 header 和页脚的尺寸50 个用户单位为 595。我在 y = 0 处添加页脚,在 y = 792 处添加 header(即 842 - 50)。如果您为文档定义的边距小于 50,您的内容和 header 或页脚将重叠。