【发布时间】:2010-11-05 04:18:59
【问题描述】:
我正在尝试使用 iTextSharp 在 PDF 文档的每个页面上创建一个页脚,格式为 Page # of # 按照 iText 页面和书中的教程。虽然我一直在 cb.SetFontAndSize(helv, 12); - 对象引用未设置为对象。任何人都可以看到这个问题吗?代码如下。
谢谢, 抢
public class MyPdfPageEventHelpPageNo : iTextSharp.text.pdf.PdfPageEventHelper
{
protected PdfTemplate total;
protected BaseFont helv;
private bool settingFont = false;
public override void OnOpenDocument(PdfWriter writer, Document document)
{
total = writer.DirectContent.CreateTemplate(100, 100);
total.BoundingBox = new Rectangle(-20, -20, 100, 100);
helv = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.WINANSI, BaseFont.NOT_EMBEDDED);
}
public override void OnEndPage(PdfWriter writer, Document document)
{
PdfContentByte cb = writer.DirectContent;
cb.SaveState();
string text = "Page " + writer.PageNumber + " of ";
float textBase = document.Bottom - 20;
float textSize = 12; //helv.GetWidthPoint(text, 12);
cb.BeginText();
cb.SetFontAndSize(helv, 12);
if ((writer.PageNumber % 2) == 1)
{
cb.SetTextMatrix(document.Left, textBase);
cb.ShowText(text);
cb.EndText();
cb.AddTemplate(total, document.Left + textSize, textBase);
}
else
{
float adjust = helv.GetWidthPoint("0", 12);
cb.SetTextMatrix(document.Right - textSize - adjust, textBase);
cb.ShowText(text);
cb.EndText();
cb.AddTemplate(total, document.Right - adjust, textBase);
}
cb.RestoreState();
}
public override void OnCloseDocument(PdfWriter writer, Document document)
{
total.BeginText();
total.SetFontAndSize(helv, 12);
total.SetTextMatrix(0, 0);
int pageNumber = writer.PageNumber - 1;
total.ShowText(Convert.ToString(pageNumber));
total.EndText();
}
}
【问题讨论】:
-
OnDocumentLoad 是否真的在 OnPageEnd 之前被调用?
-
单步执行代码时,是否正确定义了 helv?
-
我看得太深了,错过了显而易见的事情,你们都是对的,OnOpenDocument 没有被调用,所以在 OnEndPage helv 什么都不是。我将其追溯到一个愚蠢的错误,因为我在主流程中构建页面事件太晚了。感谢您的帮助。
标签: c# .net pdf itextsharp itext