header 在使用 itext 创建的 pdf 文档的第一页上不可见
header is not visible on first page of pdf document created with itext
我正在尝试将 header 的页脚添加到报告的每一页,但第一页上没有 header。我正在覆盖 PdfPageEventHelper 的 onStartPage 和 onEndPage 方法。
我的代码:
public class HeaderFooterPageEvent extends PdfPageEventHelper {
public void onStartPage(PdfWriter writer, Document document) {
Image leftUpper = Image.getInstance("leftUpper.png");
leftUpper.setAbsolutePosition(0, 0);
Chunk chunk = new Chunk(leftUpper, 0, -45);
HeaderFooter header = new HeaderFooter(new Phrase(chunk), false);
header.setBorder(Rectangle.NO_BORDER);
document.setHeader(header);
}
public void onEndPage(PdfWriter writer, Document document) {
Image img = Image.getInstance("reportFooter.png");
img.setAbsolutePosition(0, 0);
img.scaleAbsolute(595, 50)
writer.getDirectContent().addImage(img);
}
}
页脚工作正常,但首页上的 header 缺失。
我究竟做错了什么?
你的代码真奇怪。您将过时的 HeaderFooter
功能(很久以前就已从 iText 中删除)与较新的页面事件功能混合在一起。
如果要使用过时的HeaderFooter
class,则不应引入页面事件。在这种情况下,您的错误是您没有在 document.open()
之前设置 header。请注意,如果您选择此选项,则不应在商业环境中使用您的应用程序,因为您使用的 iText 版本不适合商业用途,如 Open Source beta 上的解释(以及其他) StackExchange.
如果你想使用页面事件(推荐这个),你违反了基本规则之一:不要在onStartPage()
方法中添加任何内容。所有这些都在免费电子书 The Best iText Questions on Whosebug 中进行了解释,您可以在其中找到对问题(和相应答案)的参考,例如:
- How to add text as a header or footer?
- How can I add an image to all pages of my PDF?
- "'System.WhosebugException" in "OnEndPage" event handler
- How to add multiple headers and footers in pdf using itext
- How to add a table as a header?
- 还有更多...
您的 onStartPage()
方法包含多个错误。请丢弃该代码,并调整您的 onEndPage()
方法:
public void onEndPage(PdfWriter writer, Document document) {
Image img = Image.getInstance("reportFooter.png");
img.setAbsolutePosition(0, 0);
img.scaleAbsolute(595, 50)
writer.getDirectContent().addImage(img);
}
您的 onEndPage()
方法在页面底部添加图像:该图像用作页脚。如果你还想添加一个header,你需要像这样修改这个方法:
public void onEndPage(PdfWriter writer, Document document) {
Image header = Image.getInstance("reportHeader.png");
header.setAbsolutePosition(792, 0);
header.scaleAbsolute(595, 50)
writer.getDirectContent().addImage(header);
Image footer = Image.getInstance("reportFooter.png");
footer.setAbsolutePosition(0, 0);
footer.scaleAbsolute(595, 50)
writer.getDirectContent().addImage(footer);
}
在此代码段中,我假设页面大小为 A4:842 x 595 个用户单位,并且有 50 个用户单位的边距,因为我定义了 header 和页脚的尺寸50 个用户单位为 595。我在 y = 0
处添加页脚,在 y = 792
处添加 header(即 842 - 50
)。如果您为文档定义的边距小于 50,您的内容和 header 或页脚将重叠。
我正在尝试将 header 的页脚添加到报告的每一页,但第一页上没有 header。我正在覆盖 PdfPageEventHelper 的 onStartPage 和 onEndPage 方法。 我的代码:
public class HeaderFooterPageEvent extends PdfPageEventHelper {
public void onStartPage(PdfWriter writer, Document document) {
Image leftUpper = Image.getInstance("leftUpper.png");
leftUpper.setAbsolutePosition(0, 0);
Chunk chunk = new Chunk(leftUpper, 0, -45);
HeaderFooter header = new HeaderFooter(new Phrase(chunk), false);
header.setBorder(Rectangle.NO_BORDER);
document.setHeader(header);
}
public void onEndPage(PdfWriter writer, Document document) {
Image img = Image.getInstance("reportFooter.png");
img.setAbsolutePosition(0, 0);
img.scaleAbsolute(595, 50)
writer.getDirectContent().addImage(img);
}
}
页脚工作正常,但首页上的 header 缺失。 我究竟做错了什么?
你的代码真奇怪。您将过时的 HeaderFooter
功能(很久以前就已从 iText 中删除)与较新的页面事件功能混合在一起。
如果要使用过时的HeaderFooter
class,则不应引入页面事件。在这种情况下,您的错误是您没有在 document.open()
之前设置 header。请注意,如果您选择此选项,则不应在商业环境中使用您的应用程序,因为您使用的 iText 版本不适合商业用途,如 Open Source beta 上的解释(以及其他) StackExchange.
如果你想使用页面事件(推荐这个),你违反了基本规则之一:不要在onStartPage()
方法中添加任何内容。所有这些都在免费电子书 The Best iText Questions on Whosebug 中进行了解释,您可以在其中找到对问题(和相应答案)的参考,例如:
- How to add text as a header or footer?
- How can I add an image to all pages of my PDF?
- "'System.WhosebugException" in "OnEndPage" event handler
- How to add multiple headers and footers in pdf using itext
- How to add a table as a header?
- 还有更多...
您的 onStartPage()
方法包含多个错误。请丢弃该代码,并调整您的 onEndPage()
方法:
public void onEndPage(PdfWriter writer, Document document) {
Image img = Image.getInstance("reportFooter.png");
img.setAbsolutePosition(0, 0);
img.scaleAbsolute(595, 50)
writer.getDirectContent().addImage(img);
}
您的 onEndPage()
方法在页面底部添加图像:该图像用作页脚。如果你还想添加一个header,你需要像这样修改这个方法:
public void onEndPage(PdfWriter writer, Document document) {
Image header = Image.getInstance("reportHeader.png");
header.setAbsolutePosition(792, 0);
header.scaleAbsolute(595, 50)
writer.getDirectContent().addImage(header);
Image footer = Image.getInstance("reportFooter.png");
footer.setAbsolutePosition(0, 0);
footer.scaleAbsolute(595, 50)
writer.getDirectContent().addImage(footer);
}
在此代码段中,我假设页面大小为 A4:842 x 595 个用户单位,并且有 50 个用户单位的边距,因为我定义了 header 和页脚的尺寸50 个用户单位为 595。我在 y = 0
处添加页脚,在 y = 792
处添加 header(即 842 - 50
)。如果您为文档定义的边距小于 50,您的内容和 header 或页脚将重叠。