我正在使用 iText 生成 PDF。我创建了一个自定义 PdfPageEventHelper 来为每个页面添加页眉(和页脚)。
我的问题是我不知道如何添加图像,因此它显示在“标题框”中。我只知道如何将图像添加到文档内容本身(如果这是有道理的)。
这是一些代码片段......
public static void main(String[] args) {
Rectangle headerBox = new Rectangle(36, 54, 559, 788);
/* ... */
Document document = new Document(PageSize.A4, 36, 36, 154, 54);
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(FILENAME));
HeaderFooter event = new HeaderFooter();
writer.setBoxSize("headerBox", headerBox);
writer.setPageEvent(event);
document.open();
addContent();
document.close();
}
static class HeaderFooter extends PdfPageEventHelper {
public void onEndPage(PdfWriter writer, Document document) {
Rectangle rect = writer.getBoxSize("headerBox");
// add header text
ColumnText.showTextAligned(writer.getDirectContent(),
Element.ALIGN_RIGHT, new Phrase("Hello", fontHeader1),
rect.getLeft(), rect.getTop(), 0);
// add header image
try {
Image img = Image.getInstance("c:/mylogo.PNG");
img.scaleToFit(100,100);
document.add(img);
} catch (Exception x) {
x.printStackTrace();
}
}
}
关于将图像添加到标题的适当方式的任何建议都非常感谢!!
抢
4 回答
你犯了两个重大错误。
您正在为每个新页面创建对象的新实例。这将导致臃肿的 PDF,因为图像字节将被添加为与页面一样多的次数。请在
onEndPage()
方法之外创建Image
对象,然后重复使用它。这样,图像字节将仅添加到 PDF 一次。如文档所述,作为参数传递给
onEndPage()
方法的Document
应被视为 read-only 参数。禁止向其添加内容。它与您使用new Document(PageSize.A4, 36, 36, 154, 54)
创建的对象不同。实际上,它是由PdfWriter
实例内部创建的PdfDocument
类的实例。要添加图像,您需要从编写器获取PdfContentByte
,并使用addImage()
添加图像。阅读文档可以轻松避免这样的错误。阅读我的书iText 在行动中可以节省大量时间。
你能试一下吗
代替
里面
onPageEnd
?我已经为图像设置了绝对位置和对齐方式(在这种情况下,我将图像放在标题中)
我还调整了文档边距,以便在文档的页眉和页脚中分隔空格。
在页面顶部添加图像的通用解决方案。我们也可以通过将图像置于顶部来实现。它可能会修复您的要求
}