【问题标题】:Generate a pdf with images on header and footer with iText使用 iText 生成带有页眉和页脚图像的 pdf
【发布时间】:2019-10-07 22:27:20
【问题描述】:

我期待使用 iText 创建一个 pdf。 pdf 将有一个页眉和一个页脚。页眉和页脚都将包含一个图像(公司徽标)。

我期待一个类似的例子。我将第一次使用 iText 库,所以我不知道从哪里开始。

【问题讨论】:

  • 您使用的是哪个 iText 版本?特别是,您使用的是 7.x 还是 5.x 版本?
  • 使用 7x 版本
  • 我的回答有帮助吗?还是还有未解决的问题?

标签: pdf itext pdf-generation itext7


【解决方案1】:

要为使用 iText 7.x 生成的 PDF 添加页眉和页脚,您通常会为页面开始和/或页面结束创建事件侦听器,并在其中添加页眉和页脚内容。

例如,您可以像在this sample on the iText site 中那样做。这里定义了两个事件监听器:

//Header event handler
protected class Header implements IEventHandler {
    String header;
    public Header(String header) {
        this.header = header;
    }
    @Override
    public void handleEvent(Event event) {
        //Retrieve document and
        PdfDocumentEvent docEvent = (PdfDocumentEvent) event;
        PdfDocument pdf = docEvent.getDocument();
        PdfPage page = docEvent.getPage();
        Rectangle pageSize = page.getPageSize();
        PdfCanvas pdfCanvas = new PdfCanvas(
                page.getLastContentStream(), page.getResources(), pdf);
        Canvas canvas = new Canvas(pdfCanvas, pdf, pageSize);
        canvas.setFontSize(18f);
        //Write text at position
        canvas.showTextAligned(header,
                pageSize.getWidth() / 2,
                pageSize.getTop() - 30, TextAlignment.CENTER);
    }
}

此事件处理程序将一个简单的常量字符串作为标题添加到当前页面。同样,您也可以添加图片。

//page X of Y 
protected class PageXofY implements IEventHandler {
    protected PdfFormXObject placeholder;
    protected float side = 20;
    protected float x = 300;
    protected float y = 25;
    protected float space = 4.5f;
    protected float descent = 3;
    public PageXofY(PdfDocument pdf) {
        placeholder =
                new PdfFormXObject(new Rectangle(0, 0, side, side));
    }
    @Override
    public void handleEvent(Event event) {
        PdfDocumentEvent docEvent = (PdfDocumentEvent) event;
        PdfDocument pdf = docEvent.getDocument();
        PdfPage page = docEvent.getPage();
        int pageNumber = pdf.getPageNumber(page);
        Rectangle pageSize = page.getPageSize();
        PdfCanvas pdfCanvas = new PdfCanvas(
                page.getLastContentStream(), page.getResources(), pdf);
        Canvas canvas = new Canvas(pdfCanvas, pdf, pageSize);
        Paragraph p = new Paragraph()
                .add("Page ").add(String.valueOf(pageNumber)).add(" of");
        canvas.showTextAligned(p, x, y, TextAlignment.RIGHT);
        pdfCanvas.addXObject(placeholder, x + space, y - descent);
        pdfCanvas.release();
    }
    public void writeTotal(PdfDocument pdf) {
        Canvas canvas = new Canvas(placeholder, pdf);
        canvas.showTextAligned(String.valueOf(pdf.getNumberOfPages()),
                0, descent, TextAlignment.LEFT);
    }
}

这个事件处理程序有点复杂,它为当前页面添加了 Page x of y 页脚。由于当时 y 的页面总数未知,因此添加了对占位符 XObject 的引用,一旦您知道所有页面都已创建,您可以调用writeTotal 让该方法将当前文档页数写入占位符XObject。

您注册这些事件监听器如下:

PdfWriter writer= new PdfWriter(pdfDest);
PdfDocument pdfDocument = new PdfDocument(writer);

//Create event-handlers
String header = "pdfHtml Header and footer example using page-events";
Header headerHandler = new Header(header);
PageXofY footerHandler = new PageXofY(pdfDocument);

//Assign event-handlers
pdfDocument.addEventHandler(PdfDocumentEvent.START_PAGE,headerHandler);
pdfDocument.addEventHandler(PdfDocumentEvent.END_PAGE,footerHandler);

//Add content
[... here you add the regular page content to the PdfDocument ...]

//Write the total number of pages to the placeholder and close the document
footerHandler.writeTotal(pdfDocument);
pdfDocument.close();

(实际示例使用pdfHTML添加基于HTML的常规页面内容。您也可以这样做,或者您可以直接使用DocumentParagraphText和其他布局类生成内容。 )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-05
    • 2017-02-17
    • 2015-12-05
    • 1970-01-01
    • 2012-11-28
    • 2012-02-25
    • 1970-01-01
    • 2011-02-26
    相关资源
    最近更新 更多