【问题标题】:Rectangular header and footer block on every page of PDF using OpenPDF使用 OpenPDF 的 PDF 每一页上的矩形页眉和页脚块
【发布时间】:2021-03-06 21:31:49
【问题描述】:

我正在使用 OpenPDF 生成 PDF 发票报告。在 PDF 上,我必须在每一页上为页眉/页脚设置一个矩形块。我使用HeaderFooter 类在每个页面上添加页眉/页脚,但这仅适用于Phrase

HeaderFooter header = new HeaderFooter(new Phrase("This is a Header."), false);

有没有办法使用HeaderFooter 类为页眉/页脚设置一个具有高度和宽度的矩形块?

这是我对每一页的期望:

【问题讨论】:

    标签: pdf pdf-generation openpdf


    【解决方案1】:

    您可以通过创建自定义PdfPageEvent 来做到这一点,您可以在新页面完成时添加元素(onEndPage-事件)。最简单的方法是在独立类或匿名类中扩展PdfPageEventHelper。首先,定义矩形并设置样式。其次,使用回调中的PdfWriter 将它们添加到页面。

    这是一个演示如何操作的演示:

    Document document = new Document(PageSize.A4, 40, 40, 200, 200);
    PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("output.pdf"));
    
    // footer
    final Rectangle footer = new Rectangle(30, 30, PageSize.A4.getRight(30), 180);
    footer.setBorder(Rectangle.BOX);
    footer.setBorderColor(Color.BLACK);
    footer.setBorderWidth(2);
    
    // header
    final Rectangle header = new Rectangle(footer);
    header.setTop(PageSize.A4.getTop(30));
    header.setBottom(PageSize.A4.getTop(180));
    
    // content-box
    final Rectangle box = new Rectangle(footer);
    box.setTop(document.top());
    box.setBottom(document.bottom());
    
    // create and register page event to add the rectangles
    writer.setPageEvent(new PdfPageEventHelper() {
        @Override
        public void onEndPage(PdfWriter writer, Document document) {
            PdfContentByte cb = writer.getDirectContent();
            cb.rectangle(header);
            cb.rectangle(footer);
            cb.rectangle(box);
        }
    });
    
    document.open();
    document.add(new Paragraph(LOREM_IPSUM)); // just some constant filler text
    document.close();
    

    结果如下:

    【讨论】:

    • 只是两个注意事项,iText 开发人员过去建议不要在 onStartPage 中添加内容,仅在 onEndPage 中添加内容,并且永远不要添加到 Document,但始终添加到 PdfWriter。在onStartPage 中添加Document 可能会在边界情况下导致不需要的伪影。
    • @mkl 我编辑了我的答案,按照您的建议使用 PdfWriteronEndPage 中添加内容。感谢您让我了解这些事实,我真的很感激。也许这些注释可以添加到 OpenPDF 的 JavaDoc 中以供将来参考。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-01
    相关资源
    最近更新 更多