在 IText 7 中对所有 PDF 页面使用单一模板
Using Single Template for all PDF Pages in IText 7
我有以下 PDF 模板,它应该与我正在创建的 PDF 中添加的所有 页面 一致,
问题是,我只为 第 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 具有如图所示的单一模板,以便所有页面通用?
如评论中所述,您需要创建一个 IEventHandler
,如 chapter 7 of the tutorial
中所述
这是从 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);
我有以下 PDF 模板,它应该与我正在创建的 PDF 中添加的所有 页面 一致,
问题是,我只为 第 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 具有如图所示的单一模板,以便所有页面通用?
如评论中所述,您需要创建一个 IEventHandler
,如 chapter 7 of the tutorial
这是从 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);