【发布时间】:2011-02-21 13:13:35
【问题描述】:
我正在使用 iText 5.0.5 创建一个 pdf 输出。
我正在从数据库中读取字节形式的数据,然后使用 HTMLWorker 将其添加到文档中以生成 pdf。
但是我无法在该 pdf 文档的每一页上添加页眉。
请帮忙。
【问题讨论】:
标签: java pdf-generation itext
我正在使用 iText 5.0.5 创建一个 pdf 输出。
我正在从数据库中读取字节形式的数据,然后使用 HTMLWorker 将其添加到文档中以生成 pdf。
但是我无法在该 pdf 文档的每一页上添加页眉。
请帮忙。
【问题讨论】:
标签: java pdf-generation itext
1) 最新的 iText 是 5.0.6。
2) 创建页眉页脚需要使用PdfPageEvent接口。这通常通过从 PdfPageEventHelper 派生并仅覆盖您需要的方法来完成。
在PdfPageEvent 中,您必须使用PdfContentByte 绘制到PDF。好消息是您可以使用 ColumnText 将对齐的文本添加到给定的边界框中,它会为您处理换行符。
public class HeaderFooterPageEvent extends PdfPageEventHelper {
private String headerStr, footerStr;
private Rectangle hBox, fBox;
public HeaderFooterPageEvent(String hStr, Rectangle _hBox, String fString, Rectangle _fBox) {
headerStr = hStr;
hBox = _hBox;
footerStr = fStr;
fBox = _fBox;
}
public onEndPage(PdfWriter writer, Document doc) {
// draw the header text.
ColumnText.showTextAligned(writer.getDirectContent(),
Element.ALIGN_RIGHT, headerStr, hBox.getRight(), hBox.getTop, 0);
// draw the footer text.
ColumnText.showTextAligned(writer.getDirectContent(),
Element.ALIGN_RIGHT, footerStr, fBox.getRight(), fBox.getTop, 0);
}
}
如果您的页眉和页脚是 HTML,这将无法正常工作。为此,您将不得不做一些迂回的骇客。
1) 创建一个新的 Document/PdfWriter,其页边距与标题的大小(高度和宽度)相匹配。
2) 将所有标题 HTML 呈现到该页面中。
3) 保存 pdf。
4) 将该 PDF 页面导入到您的其他文档中,然后绘制它:
public onEndPage(PdfWriter writer, Document doc) {
PdfReader reader = new PdfReader(headerPDFPath);
PdfImportedPage headerPageImport = writer.getImportedPage(reader, 1); // 1 -> first page
PdfContentByte cb = writer.getDirectContent();
cb.addTemplate(headerPageImport, hBox.bottom(), hBox.left());
}
【讨论】: