使用 iText 在页眉和页脚上生成带有图像的 pdf
Generate a pdf with images on header and footer with iText
我期待使用 iText 创建 pdf。
pdf 将有页眉和页脚。页眉和页脚中都会有一个图像(公司徽标)。
我期待着类似的例子。我将第一次使用 iText 库,所以我不确定从哪里开始。
要将 header 和页脚添加到您使用 iText 7.x 生成的 PDF,您通常会为页面开始 and/or 创建事件侦听器,页面结束并添加 header 和页脚内容 there-in.
例如,您可以像 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);
}
}
此事件处理程序将一个简单的常量字符串作为 header 添加到当前页面。同样你也可以添加图片。
//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();
(实际例子是在HTML的基础上使用pdfHTML添加常规页面内容。你也可以这样做,也可以直接使用Document
生成内容, Paragraph
、Text
和其他布局 类。)
我期待使用 iText 创建 pdf。 pdf 将有页眉和页脚。页眉和页脚中都会有一个图像(公司徽标)。
我期待着类似的例子。我将第一次使用 iText 库,所以我不确定从哪里开始。
要将 header 和页脚添加到您使用 iText 7.x 生成的 PDF,您通常会为页面开始 and/or 创建事件侦听器,页面结束并添加 header 和页脚内容 there-in.
例如,您可以像 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);
}
}
此事件处理程序将一个简单的常量字符串作为 header 添加到当前页面。同样你也可以添加图片。
//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();
(实际例子是在HTML的基础上使用pdfHTML添加常规页面内容。你也可以这样做,也可以直接使用Document
生成内容, Paragraph
、Text
和其他布局 类。)