【问题标题】:Header Footer events not working as expected页眉页脚事件未按预期工作
【发布时间】:2022-11-13 22:41:52
【问题描述】:

我正在尝试使用带有页眉和页脚的 iText7 生成 PDF。但是,代码无法按预期工作。这是我的代码。

import com.itextpdf.kernel.colors.DeviceRgb;
import com.itextpdf.kernel.events.Event;
import com.itextpdf.kernel.events.IEventHandler;
import com.itextpdf.kernel.events.PdfDocumentEvent;
import com.itextpdf.kernel.geom.PageSize;
import com.itextpdf.kernel.geom.Rectangle;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.kernel.pdf.canvas.PdfCanvas;
import com.itextpdf.layout.Canvas;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.borders.Border;
import com.itextpdf.layout.element.Cell;
import com.itextpdf.layout.element.List;
import com.itextpdf.layout.element.Paragraph;
import com.itextpdf.layout.element.Table;
import com.itextpdf.layout.property.TextAlignment;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;

import java.io.IOException;
import java.util.Properties;


class TextHeaderEventHandler implements IEventHandler {

    @Override
    public void handleEvent(Event event) {
        PdfDocumentEvent docEvent = (PdfDocumentEvent) event;
        PdfCanvas pdfCanvas = new PdfCanvas(docEvent.getPage());

        Rectangle rectangle = new Rectangle(35, 740, 520, 100);
        pdfCanvas.rectangle(rectangle);

        Canvas canvas = new Canvas(pdfCanvas, rectangle).setFontSize(7);
        // load logo image here and add
        // canvas.add(image);

        canvas.add(new Paragraph("My custom header line goes here."));

        // bottom line
        canvas.add(new Paragraph("---------------------------------------------------------------------"));
    }
}


class TextFooterEventHandler implements IEventHandler {

    @Override
    public void handleEvent(Event event) {

        PdfDocumentEvent docEvent = (PdfDocumentEvent) event;
        PdfCanvas pdfCanvas = new PdfCanvas(docEvent.getPage());

        Rectangle rectangle = new Rectangle(35, 30, 520, 50);
        pdfCanvas.rectangle(rectangle);

        Canvas canvas = new Canvas(pdfCanvas, rectangle).setFontSize(7);
        // bottom line
        canvas.add(new Paragraph("---------------------------------------------------------------------"));

        // footer text
        canvas.add(new Paragraph("My custom footer line goes here."));
    }
}

/**
 * https://turkogluc.com/java-creating-pdf-reports-with-itext/
 */
public class HeaderFooter {

    private static final Logger logger = LogManager.getLogger(HeaderFooter.class);

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

        Properties log4jProperties = new Properties();
        log4jProperties.put("log4j.appender.ConsoleAppender", "org.apache.log4j.ConsoleAppender");
        log4jProperties.put("log4j.appender.ConsoleAppender.layout", "org.apache.log4j.PatternLayout");
        log4jProperties.put("log4j.appender.ConsoleAppender.layout.ConversionPattern", "%d [%t] %-5p %c - %m%n");
        log4jProperties.put("log4j.rootLogger", "DEBUG, ConsoleAppender");
        PropertyConfigurator.configure(log4jProperties);

        HeaderFooter main = new HeaderFooter();
        main.generatePdf();
    }

    public void generatePdf() throws IOException {
        // Creating a PdfWriter
        String dest = "/tmp/example.pdf";
        PdfWriter writer = new PdfWriter(dest);

        // Creating a PdfDocument
        PdfDocument pdfDoc = new PdfDocument(writer);

        // Creating a Document
        Document document = new Document(pdfDoc);
        document.setFontSize(10);

        pdfDoc.addNewPage(PageSize.A4);
        document.setMargins(80, 36, 80, 36);
        pdfDoc.addEventHandler(PdfDocumentEvent.START_PAGE, new TextHeaderEventHandler());
        pdfDoc.addEventHandler(PdfDocumentEvent.END_PAGE, new TextFooterEventHandler());

        // Adding a new page
        pdfDoc.addNewPage(PageSize.A4);
        // document.setMargins(80, 36, 60, 36);

        String content = "Lorem ipsum dolor sit amet...jjjj";
        Paragraph paragraph = new Paragraph(content);
        paragraph.setFontSize(14);
        paragraph.setTextAlignment(TextAlignment.CENTER);
        paragraph.setBorder(Border.NO_BORDER);
        paragraph.setFirstLineIndent(20);
        paragraph.setItalic();
        paragraph.setBold();
        paragraph.setBackgroundColor(new DeviceRgb(245, 245, 245));
        paragraph.setMargin(10);
        paragraph.setPaddingLeft(10);
        paragraph.setPaddingRight(10);
        paragraph.setWidth(1000);
        paragraph.setHeight(100);
        document.add(paragraph);

        int listIndex = 1;
        List list = new List();
        for (int i = 0; i < 10; i++, listIndex++) {
            list.add("Java --> " + listIndex);
            list.add("Go");
            list.add("React");
            list.add("Apache Kafka");
            list.add("Jenkins");
            list.add("Elastic Search");
        }
        document.add(list);

        // adding a table adds a rectangle into the header part
        Table table = new Table(new float[]{150F, 150F, 150F, 150F});
        table.addCell(new Cell().add(new Paragraph("Id")));
        table.addCell(new Cell().add(new Paragraph("Name")));
        table.addCell(new Cell().add(new Paragraph("Location")));
        table.addCell(new Cell().add(new Paragraph("Date")));

        table.addCell(new Cell().add(new Paragraph("1000")));
        table.addCell(new Cell().add(new Paragraph("Item-1")));
        table.addCell(new Cell().add(new Paragraph("Istanbul")));
        table.addCell(new Cell().add(new Paragraph("01/12/2020")));

        table.addCell(new Cell().add(new Paragraph("1005")));
        table.addCell(new Cell().add(new Paragraph("Item-2")));
        table.addCell(new Cell().add(new Paragraph("Warsaw")));
        table.addCell(new Cell().add(new Paragraph("05/12/2020")));
        document.add(table);

        // extra list
        list = new List();
        for (int i = 0; i < 10; i++, listIndex++) {
            list.add("Java --> " + listIndex);
            list.add("Go");
            list.add("React");
            list.add("Apache Kafka");
            list.add("Jenkins");
            list.add("Elastic Search");
        }
        document.add(list);

        // Closing the document
        document.close();
    }
}

我看到以下问题。

  • 没有为首页生成页眉,但生成了页脚。

  • 当我有一个表格时,一个矩形会随机添加到任何表格的标题中 页。

  • 当我删除表格时,矩形消失了。但是这种方式将能够添加表 pdf,但我绝对想添加。

我错过了什么吗?任何人都可以在这里帮忙。

【问题讨论】:

  • 欢迎来到stackoverflow!最好能一点一点地缩小问题范围,按照minimal reproducible example写出来。略过你的问题,考虑到问题的数量,它有点压倒性。
  • 感谢@BagusTesa 的信息,我有 2 个问题。 1. 为什么页眉没有添加到第 1 页 2. 当我在 pdf 中使用表格时,为什么在页眉中添加了一个矩形。

标签: java itext7


【解决方案1】:

根据评论,您基本上有两个问题:

感谢@BagusTesa 的信息,我有 2 个问题。 1. 为什么页眉没有添加到第 1 页 2. 当我在 pdf 中使用表格时,为什么在页眉中添加了一个矩形。

1.为什么标题没有被添加到第1页

您首先添加新页面,然后才注册事件侦听器:

pdfDoc.addNewPage(PageSize.A4);
document.setMargins(80, 36, 80, 36);
pdfDoc.addEventHandler(PdfDocumentEvent.START_PAGE, new TextHeaderEventHandler());
pdfDoc.addEventHandler(PdfDocumentEvent.END_PAGE, new TextFooterEventHandler());

因此,当第一页的START_PAGE 事件被触发时,还没有侦听器来绘制页眉。

如果您希望 TextHeaderEventHandler 也适用于第一页,请注册它创建任何页面。

实际上,您只是通过自动创建所需页面的Document 实例添加内容。你为什么要打电话给addNewPage?最好没有那个。

2. 为什么我在pdf中使用表格时在标题中添加了一个矩形。

好吧,首先有一个矩形,因为您创建了一个矩形路径:

Rectangle rectangle = new Rectangle(35, 740, 520, 100);
pdfCanvas.rectangle(rectangle);

它通常不会显示,因为您没有对您创建的矩形路径做任何事情。你不填充路径或描边路径,你只是定义它并让它悬在空中。如果您稍后添加的内容导致当前路径被描边,这可能会使 PDF 查看器最终也描边您定义的悬空路径。可能添加表格包括这样的路径抚摸指令。

将这些发现应用于您的代码

最初你的代码会产生这个:

可以清楚地看到第 1 页上缺少的页眉和第 2 页页眉周围的矩形线。

现在我们删除这两个

pdfDoc.addNewPage(PageSize.A4);

线。结果:

人们看到在第 1 页的页眉区域发生了一些变化:在第 2 页上有一个描边矩形的地方,我们现在有一个填充矩形。

因此,让我们现在处理矩形并删除两个

pdfCanvas.rectangle(rectangle);

来自事件侦听器的行。结果:

我们在所有页面上都看到了预期的标题,没有奇怪的描边或填充矩形。

【讨论】:

  • 嗨@mkl,感谢您的回复。但是,即使我删除 pdfDoc.addNewPage(PageSize.A4);在设置 EventHandler 之前调用,没有添加标题。事实上,它甚至不尊重第一页的上边距。
  • 您正在通过 Document 实例添加。你为什么打电话给addNewPage?请尝试不这样做。
  • 不幸的是,删除所有 addNewPage 调用不起作用。我仍然有同样的问题。
  • @KiranKyle“不幸的是,删除所有 addNewPage 调用不起作用。我仍然有同样的问题”- 好的,所以我复制了您的代码,删除了所有addNewPage 调用和所有pdfCanvas.rectangle(rectangle) 调用(请参阅我对第二个部分问题的回答)。结果:所有页面上的页眉和页脚,没有奇怪的框,请参阅我的答案中的附加部分“将这些发现应用于您的代码”。你到底还有什么问题?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-04
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
  • 2022-08-17
  • 1970-01-01
相关资源
最近更新 更多