首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >页眉页脚事件无法按预期工作

页眉页脚事件无法按预期工作
EN

Stack Overflow用户
提问于 2022-11-11 13:48:40
回答 1查看 39关注 0票数 0

我正在尝试使用带有页眉和页脚的iText7生成PDF。然而,这些代码并不像预期的那样起作用。这是我的密码。

代码语言:javascript
复制
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中添加表,但我肯定要添加.

我是不是遗漏了什么?有人能帮上忙吗。

EN

回答 1

Stack Overflow用户

发布于 2022-11-11 16:17:18

根据一条评论,你基本上有两个问题:

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

1.为什么页眉不添加到第1页

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

代码语言:javascript
复制
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中的表格时,标题中添加了一个矩形。

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

代码语言:javascript
复制
Rectangle rectangle = new Rectangle(35, 740, 520, 100);
pdfCanvas.rectangle(rectangle);

它通常不会显示,因为您没有使用创建的矩形路径进行任何操作。你不填充这条路,也不抚摸这条路,你只需要定义它,让它在空中飘荡。如果以后添加的内容导致当前路径被抚摸,这可能会使PDF查看器最终也会触及您定义的悬空路径。可能添加表包括这样的路径抚摸指令。

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

最初,您的代码生成以下内容:

人们可以清楚地看到第1页缺少的标题和第2页标题周围的矩形线。

现在我们把这两个

代码语言:javascript
复制
pdfDoc.addNewPage(PageSize.A4);

台词。结果:

人们可以看到,在第1页中,标题区域发生了一些事情:在第2页上,有一个被抚摸的矩形,我们现在有一个填充的矩形。

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

代码语言:javascript
复制
pdfCanvas.rectangle(rectangle);

事件侦听器中的行。结果:

我们在所有页面上看到预期的页眉,没有奇怪的抚摸或填充矩形。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74403467

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档