IText 7 如何在不重叠页面内容的情况下添加 Div 或 Header 中的段落?

IText 7 How To Add Div or Paragraph in Header Without Overlapping Page Content?

我面临以下问题,但我尚未找到任何解决方案。我正在为医学实验室实施一个平台。他们希望将每个事件的报告写入系统,然后从系统生成并打印出来。我正在使用 itext 7 来完成这个。但是我面临以下问题。

他们有一个非常奇怪的模板。在开头的第一页上,他们想要打印特定的 table,而在其他每一页的开头,他们想要打印其他内容。所以我需要知道页面何时更改以便在页面开头打印相应的 table.

阅读各种资料后,我最终正常创建了第一页,然后添加了一个 header 事件处理程序来检查页码并始终执行,但第 1 页除外。

public class VariableHeaderEventHandler implements IEventHandler {


    @Override
    public void handleEvent(Event event) {
        System.out.println("THIS IS ME: HEADER EVENT HANDLER STARTED.....");
        PdfDocumentEvent documentEvent = (PdfDocumentEvent) event;
        PdfDocument pdfDoc = documentEvent.getDocument();
        PdfPage page = documentEvent.getPage();
        Rectangle pageSize = page.getPageSize();
        int pageNumber = pdfDoc.getPageNumber(page);

        if (pageNumber == 1) return; //Do nothing in the first page...

        System.out.println("Page size: " + pageSize.getHeight());

        Rectangle rectangle = new Rectangle(pageSize.getLeft() + 30, pageSize.getHeight()-234, pageSize.getWidth() - 60, 200);


        PdfCanvas pdfCanvas = new PdfCanvas(page.newContentStreamBefore(), page.getResources(), pdfDoc);
        pdfCanvas.rectangle(rectangle);
        pdfCanvas.setFontAndSize(FontsAndStyles.getRegularFont(), 10);
        Canvas canvas = new Canvas(pdfCanvas, pdfDoc, rectangle);

        Div header = new Div();

        Paragraph paragraph = new Paragraph();

        Text text = new Text("Διαγνωστικό Εργαστήριο Ιστοπαθολογίας και Μοριακής Παθολογοανατομικής").addStyle(FontsAndStyles.getBoldStyle());
        paragraph.add(text);
        paragraph.add(new Text("\n"));
        text = new Text("Μοριακή Διάγνωση σε Συνεργασία με").addStyle(FontsAndStyles.getBoldStyle());
        paragraph.add(text);
        paragraph.add(new Text("\n"));
        text = new Text("Γκούρβας Βίκτωρας, M.D., Ph.D.").addStyle(FontsAndStyles.getBoldStyle());
        paragraph.add(text);
        paragraph.add(new Text("\n"));
        text = new Text("Τσιμισκή 33, Τ.Κ. 54624, ΘΕΣΣΑΛΟΝΙΚΗ").addStyle(FontsAndStyles.getNormalStyle());
        paragraph.add(text);
        paragraph.add(new Text("\n"));
        text = new Text("Τήλ/Φάξ: 2311292924 Κιν.: 6932104909 e-mail: vgourvas@gmail.com").addStyle(FontsAndStyles.getNormalStyle());
        paragraph.add(text);
        header.add(paragraph);

//        =============Horizontal Line BOLD============
        SolidLine solidLine = new SolidLine((float) 1.5);
        header.add(new LineSeparator(solidLine));
//        ========Horizontal Line BOLD End==========


        text = new Text("ΠΑΘΟΛΟΓΟΑΝΑΤΟΜΙΚΗ ΕΞΕΤΑΣΗ").addStyle(FontsAndStyles.getBoldStyle());
        paragraph = new Paragraph().add(text);


        header.add(paragraph);
        header.setTextAlignment(TextAlignment.CENTER);
        canvas.add(header);
        canvas.close();
    }

但是我现在面临的问题是 header 内容重叠,我不知道如何设置每页不同的页边距。例如,第 2 页及以后的表格我想要不同的 topMargin。

有没有人以前遇到过这些问题并找到了可行的解决方案?我实施正确吗?是否有更好的方法来实现相同的结果?

提前致谢,

Toutoudakis Michail

您应该创建自己的自定义文档呈现器并减少用于放置除第一个页面之外的每个页面的内容的区域。

请查看下面的代码片段,尤其是 updateCurrentArea 方法。

    class CustomDocumentRenderer extends DocumentRenderer {
    public CustomDocumentRenderer(Document document) {
        super(document);
    }

    @Override
    public IRenderer getNextRenderer() {
        return new CustomDocumentRenderer(this.document);
    }

    @Override
    protected LayoutArea updateCurrentArea(LayoutResult overflowResult) {
        LayoutArea area = super.updateCurrentArea(overflowResult);
        if (currentPageNumber > 1) {
            area.setBBox(area.getBBox().decreaseHeight(200));
        }  
        return area;
    }
}

然后只需在您的文档上设置渲染器:

    Document doc = new Document(pdfDoc);
    doc.setRenderer(new CustomDocumentRenderer(doc));

我为您的文档获得的 pdf 如下所示:

但是还有另一种解决方案。向文档添加至少一个元素后,您可以更改默认文档的页边距。更改将应用​​于之后创建的所有页面(在您的情况下,这些页面是第 2、3、...)

        doc.add(new Paragraph("At least one element should be added. Otherwise the first page wouldn't be created and changing of the default margins would affect it."));
    doc.setMargins(200, 36, 36, 36);
    // now you can be sure that all the next pages would have new margins