【问题标题】:Itext PDF: Footer is generating only on Last pageItext PDF:页脚仅在最后一页生成
【发布时间】:2019-09-25 11:07:36
【问题描述】:

我在 PDF 中生成 1K 行的列表,每页有 50 行。 我需要在每一页中添加一个 2 行页脚。所以我添加了 PdfPageEventHelper,但它只打印在最后一页并且只有一行。页码也没有打印。我尝试了来自 itext5 网站的示例。还是不行

这是下面的代码。

    public byte[] exportToPDF(List<T> searchResult, String serviceName) throws IOException{

        Document document = new Document(PageSize.A4.rotate(), 25f, 25f, 25f, 50f);
        try (ByteArrayOutputStream out = new ByteArrayOutputStream();)
        {
            PdfWriter writer = PdfWriter.getInstance(document, out);
            document.open();
            PdfPTable table = new PdfPTable(8);
            table.setWidthPercentage(100);
            printDataRows(searchResult, table);
            //Adding Footer
            document.add(table);
            HeaderFooter event = new HeaderFooter();
            writer.setPageEvent(event); 
            document.close();       
            return out.toByteArray();  
    }catch (Exception e)
    {
        e.printStackTrace();
        logger.error(PDF_GEN_ERROR + e);
    }
}

这是事件的代码

static class HeaderFooter extends PdfPageEventHelper
{
public HeaderFooter()
{
    super();
}



@Override
public void onEndPage(PdfWriter writer, Document document)
{

    PdfPTable table = new PdfPTable(3);
    try
    {
    Font regularFonts = FontFactory.getFont(FontFactory.HELVETICA);
    regularFonts.setSize(6);
    table.setTotalWidth(document.right() - document.left());
    table.setLockedWidth(true);
    table.getDefaultCell().setFixedHeight(10);
    table.getDefaultCell().setBorder(0);

    PdfPCell cv1 = new PdfPCell(new Phrase("Project Name", regularFonts));

    cv1.setFixedHeight(8);
    cv1.setBorder(0);
    cv1.setHorizontalAlignment(Element.ALIGN_LEFT);
    table.addCell(cv1);

    PdfPCell cv2 = new PdfPCell(new Phrase(String.format("Page %d of  ", writer.getPageNumber), regularFonts));

    cv2.setFixedHeight(8);
    cv2.setBorder(0);
    cv2.setHorizontalAlignment(Element.ALIGN_CENTER);
    table.addCell(cv2);

    PdfPCell cv3 = new PdfPCell(new Phrase("Product Group", regularFonts));

    cv3.setFixedHeight(8);
    cv3.setBorder(0);
    cv3.setHorizontalAlignment(Element.ALIGN_RIGHT);
    table.addCell(cv3);
    table.completeRow();

    PdfPCell cv21 = new PdfPCell(new Phrase("Printed on " + todaysDate(), regularFonts));

    cv21.setFixedHeight(8);
    cv21.setBorder(0);
    cv21.setHorizontalAlignment(Element.ALIGN_LEFT);
    table.addCell(cv21);

    PdfPCell cv22 = new PdfPCell(new Phrase(""));
    cv22.setBorder(0);
    table.addCell(cv22);

    PdfPCell cv23 = new PdfPCell(new Phrase(new Phrase("Proprietary and Confidential", regularFonts)));

    cv23.setBorder(0);
    cv23.setHorizontalAlignment(Element.ALIGN_LEFT);
    table.addCell(cv23);
    table.completeRow();
    PdfContentByte canvas = writer.getDirectContent();
    canvas.beginMarkedContentSequence(PdfName.ARTIFACT);
    table.writeSelectedRows(0, -1, 34, 40, canvas);
    canvas.endMarkedContentSequence();
    }
    catch (Exception de)
    {
    throw new SystemException(PDF_GEN_ERROR, de);
    }

}
}

【问题讨论】:

    标签: java itext pdf-generation footer


    【解决方案1】:

    在将表格添加到文档后设置事件处理程序:

    PdfWriter writer = PdfWriter.getInstance(document, out);
    document.open();
    ...
    document.add(table);
    HeaderFooter event = new HeaderFooter();
    writer.setPageEvent(event); 
    document.close();
    

    因此,当您设置事件处理程序时,除了最后一个页面之外的所有页面都已编写完毕,您的事件处理程序只会在最后一页被调用。

    要让页面事件处理程序检索所有页面的事件,请尽早设置,例如

    PdfWriter writer = PdfWriter.getInstance(document, out);
    HeaderFooter event = new HeaderFooter();
    writer.setPageEvent(event); 
    document.open();
    ...
    document.add(table);
    document.close();
    

    这样,每个页面都会调用页面事件处理程序。

    【讨论】:

    • 谢谢。我已经弄清楚了那部分。但它仍然只显示一行。
    • 你能分享你的代码输出示例吗?我也不明白为什么只画了一条线,但也许分析一个例子会有所帮助。
    • 我已经解决了这个问题。我重新排列了坐标和行高,现在重新排列了它的打印。感谢您的帮助
    猜你喜欢
    • 2013-11-18
    • 1970-01-01
    • 2014-04-04
    • 1970-01-01
    • 2012-11-28
    • 1970-01-01
    • 2019-10-07
    • 1970-01-01
    相关资源
    最近更新 更多