【问题标题】:header is not visible on first page of pdf document created with itext标题在使用 itext 创建的 pdf 文档的第一页上不可见
【发布时间】:2015-08-10 08:37:18
【问题描述】:

我正在尝试为报告中的每一页添加页眉和页脚,但在第一页上没有页眉。我正在覆盖 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);
}

}

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

【问题讨论】:

    标签: java pdf pdf-generation itext


    【解决方案1】:

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

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

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

    您的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() 方法在页面底部添加了一个图像:该图像用作您的页脚。如果您还想添加标题,则需要像这样调整此方法:

    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);
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多