如何在超出给定矩形区域时将内容写入新页面(itext7)

How to write content to a new page when it exceeds the given rectangle area (itext7)

如何获取当前页码?

用例:使用itext5编写的应用需要使用itext7重写。 我们的应用程序为我们客户的每月账单生成 PDF 文件。

pdf 的结构:

  1. 创建文档:

     PdfWriter writer = new PdfWriter(new FileOutputStream(filename));
     PdfDocument pdfDocument = new PdfDocument(writer);
     Document document = new Document(pdfDocument, PageSize.A4);
     document.setMargins(82, 35, 0, 38);
     buildBody(pdfData, document, writer);
     pdfDocument.addEventHandler(PdfDocumentEvent.START_PAGE, new PdfStartPageHandler<>(pdfData, document, this));
     pdfDocument.addEventHandler(PdfDocumentEvent.END_PAGE, new PdfEndPageHandler(document));
     buildBodyContent(pdfData, document, writer);
     document.close();
    

2.Each IEventHandler 实例具有此格式(矩形值除外):

public void handleEvent(Event event) {
  document.add(lineSeparatorHeader);
  document.add(paragraphInfo); // 
  document.add(lineSeparatorHeader);
}

paragraphInfo - 是一个 Paragraph(),它由一个 table 和两列组成

lineSeparatorHeader - 是一个 LineSeparator()

  1. buildBody(pdfData, document, writer) 必须填写我的 pdf 页面的 body。

我的问题是我不知道如何处理内容超出矩形大小的情况。我希望它创建一个新页面,生成一个具有相同尺寸的新矩形并继续在那里书写。

一个。是需要在每个页面上的 header B. 是 body 其内容可能会占据一个以上的页面。如果它占用超过一页,新页面还必须包含 header 和页脚。 C. 是页脚

综合大家的想法和评论中的一些建议,可以做到以下几点:

  1. 通过在 Document 实例上设置页边距为页脚和页眉保留 space,确保不会放置添加到 Document 的内容他们。

  2. 像您已经完成的那样添加页脚和页眉事件。

    PdfDocument pdfDoc = new PdfDocument(new PdfWriter(outFileName));
    Document doc = new Document(pdfDoc);
    
    int headerHeight = 100;
    int footerHeight = 200;
    
    float[] oldMargins = new float[] {doc.getTopMargin(), doc.getRightMargin(), doc.getBottomMargin(),
            doc.getLeftMargin()};
    doc.setMargins(doc.getTopMargin() + headerHeight, doc.getRightMargin(), doc.getBottomMargin() + footerHeight,
            doc.getLeftMargin());
    
    pdfDoc.addEventHandler(PdfDocumentEvent.START_PAGE, new IEventHandler() {
        @Override
        public void handleEvent(Event event) {
            PdfDocumentEvent pdfDocumentEvent = (PdfDocumentEvent) event;
            PdfPage page = pdfDocumentEvent.getPage();
            Rectangle pageRectangle = page.getPageSize();
            Rectangle headerArea = new Rectangle(oldMargins[3], pageRectangle.getTop() - oldMargins[0] - headerHeight,
                    pageRectangle.getWidth() - oldMargins[1] - oldMargins[3], headerHeight);
            new Canvas(page, headerArea).add(
                    new Div()
                            .setHeight(headerArea.getHeight())
                            .setWidth(headerArea.getWidth())
                            .setBackgroundColor(ColorConstants.RED))
                    .close();
        }
    });
    pdfDoc.addEventHandler(PdfDocumentEvent.END_PAGE, new IEventHandler(){
        @Override
        public void handleEvent(Event event) {
            PdfDocumentEvent pdfDocumentEvent = (PdfDocumentEvent) event;
            PdfPage page = pdfDocumentEvent.getPage();
            Rectangle pageRectangle = page.getPageSize();
            Rectangle footerArea = new Rectangle(oldMargins[3], pageRectangle.getBottom() + oldMargins[2],
                    pageRectangle.getWidth() - oldMargins[1] - oldMargins[3], footerHeight);
            new Canvas(page, footerArea).add(
                    new Div()
                            .setHeight(footerArea.getHeight())
                            .setWidth(footerArea.getWidth())
                            .setBackgroundColor(ColorConstants.YELLOW))
                    .close();
        }
    });
    
    for (int i = 0; i < 100; i++) {
        doc.add(new Paragraph("I'm body's paragraph #" + i));
    }
    
    doc.close();
    

生成的 PDF 看起来符合预期(没有内容溢出页脚和页眉):