在IText 7中为所有PDF页面使用单个模板

时间:2018-03-21 10:02:58

标签: itext7

我有以下 PDF模板,它应该与我正在创建的PDF中添加的所有页面保持一致

enter image description here

问题在于,我只为 Page 1 获取此模板,而其余页面仅使用空白模板,以下是代码现在使用,

PdfDocument pdfDoc = new PdfDocument(new PdfReader(SRC),new PdfWriter(baosPDF));

PageSize ps = new PageSize(900, 780);

// Initialize document
Document document = new Document(pdfDoc, ps);
document.setMargins(80f, 20f, 50f, 20f);

PdfFont font = PdfFontFactory.createFont(StandardFonts.HELVETICA);
PdfFont bold = PdfFontFactory.createFont(StandardFonts.HELVETICA_BOLD);
for(int i = 0; i < 10; i++){
    document.add(new Paragraph("Some Content"));
    document.add(new AreaBreak(AreaBreakType.NEXT_PAGE));
}
document.close();

我已经提到了这个itextsharp add 1 page template to all pages示例,但我需要一些特定于Itext 7的内容,因为它与5.x.x版本有很大差异

如何让我的PDF让图像中显示的单个模板对所有页面都是通用的?

1 个答案:

答案 0 :(得分:2)

正如评论中所述,您需要按照chapter 7 of the tutorial

中的说明创建IEventHandler

这是PDF到HTML教程(chapter 4)的一个例子。

class Background implements IEventHandler {
    PdfXObject stationery;

    public Background(PdfDocument pdf, String src) throws IOException {
        PdfDocument template = new PdfDocument(new PdfReader(src));
        PdfPage page = template.getPage(1);
        stationery = page.copyAsFormXObject(pdf);
        template.close();
    }

    @Override
    public void handleEvent(Event event) {
        PdfDocumentEvent docEvent = (PdfDocumentEvent) event;
        PdfDocument pdf = docEvent.getDocument();
        PdfPage page = docEvent.getPage();
        PdfCanvas pdfCanvas = new PdfCanvas(
            page.newContentStreamBefore(), page.getResources(), pdf);
        pdfCanvas.addXObject(stationery, 0, 0);
        Rectangle rect = new Rectangle(36, 32, 36, 64);
        Canvas canvas = new Canvas(pdfCanvas, pdf, rect);
        canvas.add(
            new Paragraph(String.valueOf(pdf.getNumberOfPages()))
                .setFontSize(48).setFontColor(Color.WHITE));
        canvas.close();
    }
}

如您所见,我们在构造函数中读取模板,然后在handleEvent()方法中将其绘制到Canvas中。在此示例中,我们还以白色添加页码,您可以删除所有这些行。

public void handleEvent(Event event) {
    PdfDocumentEvent docEvent = (PdfDocumentEvent) event;
    PdfDocument pdf = docEvent.getDocument();
    PdfPage page = docEvent.getPage();
    PdfCanvas pdfCanvas = new PdfCanvas(
        page.newContentStreamBefore(), page.getResources(), pdf);
    pdfCanvas.addXObject(stationery, 0, 0);
}

显然,您还需要声明处理程序:

PdfDocument pdf = new PdfDocument(writer);
IEventHandler handler = new Background(pdf, stationery);
pdf.addEventHandler(PdfDocumentEvent.START_PAGE, handler);