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

时间:2019-01-30 11:09:02

标签: java itext7

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

他们有一个非常奇怪的模板。他们希望在开始的第一页上打印特定的表,而在每隔一页的开始处,他们要打印其他内容。因此,我需要知道页面何时更改,以便在页面的开头打印相应的表格。

在阅读了各种资料之后,我最终正常地创建了第一页,然后添加了一个页眉事件处理程序,该处理程序检查页码并始终执行,除了第一页。

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();
    }

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

Header Overlaps With Content

有人曾经遇到过这些问题并找到了可行的解决方案吗?我执行正确吗?有没有更好的方法来达到相同的结果?

预先感谢

Toutoudakis Michail

1 个答案:

答案 0 :(得分:1)

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

请查看下面的代码段,尤其是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如下: enter image description here

但是,还有另一种解决方案。将至少一个元素添加到文档后,即可更改默认文档的边距。所做的更改将应用​​于之后创建的所有页面(在您的情况下,这些页面是第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