作为我的延续先前的问题我一直在尝试 PDF 的页眉和页脚功能。经过一番讨论后,我更改了 PdfPageEventHelper 类上的大量代码。以下是我所拥有的:
public class ReportHeaderFooter : PdfPageEventHelper
{
public string HeaderTitle { get; set; }
public IReportsAccessor ReportsAccessor { get; set; }
private Image footerImg;
private Image headerImg;
private BaseColor headerColor;
private PdfPTable tblHeader;
public ReportHeaderFooter(IReportsAccessor reportsAccessor)
{
this.ReportsAccessor = reportsAccessor;
var rootPath = ConfigurationManager.AppSettings["SaveFileRootPath"];
headerColor = new BaseColor(System.Drawing.ColorTranslator.FromHtml("#ffffff")); // Not really but I don't want to give away the color
}
public override void OnOpenDocument(PdfWriter writer, Document document)
{
base.OnOpenDocument(writer, document);
// Set the initial header image...
var headerImgInfo = ReportsAccessor.GetImage(4);
headerImg = Image.GetInstance(headerImgInfo.ReportImage);
// Set the initial footer image...
var footerImgInfo = ReportsAccessor.GetImage(2);
footerImg = Image.GetInstance(footerImgInfo.ReportImage);
// Create the header table...
tblHeader = new PdfPTable(2)
{
TotalWidth = document.Right,
};
tblHeader.SetWidths(new float[2] { document.Right - 70f, 70f });
PdfPCell titleCell = new PdfPCell(new Phrase(HeaderTitle))
{
BackgroundColor = headerColor
};
tblHeader.AddCell(titleCell);
PdfPCell imgCell = new PdfPCell(headerImg)
{
BackgroundColor = headerColor,
HorizontalAlignment = PdfPCell.ALIGN_RIGHT,
};
tblHeader.AddCell(imgCell);
}
public override void OnEndPage(PdfWriter writer, Document document)
{
base.OnEndPage(writer, document);
// Add the header table to the tops of the documents...
document.Add(tblHeader);
// Create the image at the footer.
footerImg.SetAbsolutePosition(0, document.Bottom);
document.Add(footerImg);
}
但是,当我到达其中一页上的 document.Add(tblHeader) 行时(这是一个相当大的 pdf(可能有 10 页))。我收到堆栈溢出异常)。
我在这里做错了什么(如果有的话)?我问的最后一个问题我收到了礼貌的 RTM,但是,在阅读了大量文档后,我不明白为什么相对简单的东西会导致堆栈溢出。请帮助我理解。
正如官方文档中提到的,严格禁止将内容添加到document
页面事件中的对象。那document
object is not the Document
您在主代码中使用的对象。相反,它是一个内部PdfDocument
传递给事件的实例只读目的。
如果你想在页面事件中添加表格,你应该使用writeSelectedRows()
方法。请下载免费电子书StackOverflow 上最好的 iText 问题并查看有关事件的章节。
您将找到以下问题的参考资料:
-
“OnEndPage”事件处理程序中的“'System.StackOverflowException”(这就是你所问的;阅读这本书会对你有所帮助)
- 使用itext在pdf页脚中创建包含2行的表格
- 如何添加表格作为标题?
阅读免费的文档可以为您(和我们)节省大量时间;-)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)