iTextSharp创build页脚页面#

我试图在PDF文档的每个页面上使用iTextSharp格式的Page#of#在iText页面和书上的教程之后创build一个页脚。 虽然我不断得到cb.SetFontAndSize(helv,12)的exception; – 对象引用未设置为对象。 任何人都可以看到问题? 代码如下。

谢谢,罗布

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(); } } 

以下是向每个页面添加总页码的好例子 。

编辑 :这是从该网站的代码,以防万一它消失:

 using System; using System.Collections.Generic; using System.Text; using iTextSharp.text.pdf; using iTextSharp.text; namespace PDF_Tests { public class TwoColumnHeaderFooter :PdfPageEventHelper { // This is the contentbyte object of the writer PdfContentByte cb; // we will put the final number of pages in a template PdfTemplate template; // this is the BaseFont we are going to use for the header / footer BaseFont bf = null; // This keeps track of the creation time DateTime PrintTime = DateTime.Now; #region Properties private string _Title; public string Title { get { return _Title; } set { _Title = value; } } private string _HeaderLeft; public string HeaderLeft { get { return _HeaderLeft; } set { _HeaderLeft = value; } } private string _HeaderRight; public string HeaderRight { get { return _HeaderRight; } set { _HeaderRight = value; } } private Font _HeaderFont; public Font HeaderFont { get { return _HeaderFont; } set { _HeaderFont = value; } } private Font _FooterFont; public Font FooterFont { get { return _FooterFont; } set { _FooterFont = value; } } #endregion // we override the onOpenDocument method public override void OnOpenDocument(PdfWriter writer, Document document) { try { PrintTime = DateTime.Now; bf = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED); cb = writer.DirectContent; template = cb.CreateTemplate(50, 50); } catch (DocumentException de) { } catch (System.IO.IOException ioe) { } } public override void OnStartPage(PdfWriter writer, Document document) { base.OnStartPage(writer, document); Rectangle pageSize = document.PageSize; if (Title != string.Empty) { cb.BeginText(); cb.SetFontAndSize(bf, 15); cb.SetRGBColorFill(50, 50, 200); cb.SetTextMatrix(pageSize.GetLeft(40), pageSize.GetTop(40)); cb.ShowText(Title); cb.EndText(); } if (HeaderLeft + HeaderRight != string.Empty) { PdfPTable HeaderTable = new PdfPTable(2); HeaderTable.DefaultCell.VerticalAlignment = Element.ALIGN_MIDDLE; HeaderTable.TotalWidth = pageSize.Width - 80; HeaderTable.SetWidthPercentage(new float[] { 45, 45 }, pageSize); PdfPCell HeaderLeftCell = new PdfPCell(new Phrase(8, HeaderLeft, HeaderFont)); HeaderLeftCell.Padding = 5; HeaderLeftCell.PaddingBottom = 8; HeaderLeftCell.BorderWidthRight = 0; HeaderTable.AddCell(HeaderLeftCell); PdfPCell HeaderRightCell = new PdfPCell(new Phrase(8, HeaderRight, HeaderFont)); HeaderRightCell.HorizontalAlignment = PdfPCell.ALIGN_RIGHT; HeaderRightCell.Padding = 5; HeaderRightCell.PaddingBottom = 8; HeaderRightCell.BorderWidthLeft = 0; HeaderTable.AddCell(HeaderRightCell); cb.SetRGBColorFill(0, 0, 0); HeaderTable.WriteSelectedRows(0, -1, pageSize.GetLeft(40), pageSize.GetTop(50), cb); } } public override void OnEndPage(PdfWriter writer, Document document) { base.OnEndPage(writer, document); int pageN = writer.PageNumber; String text = "Page " + pageN + " of "; float len = bf.GetWidthPoint(text, 8); Rectangle pageSize = document.PageSize; cb.SetRGBColorFill(100, 100, 100); cb.BeginText(); cb.SetFontAndSize(bf, 8); cb.SetTextMatrix(pageSize.GetLeft(40), pageSize.GetBottom(30)); cb.ShowText(text); cb.EndText(); cb.AddTemplate(template, pageSize.GetLeft(40) + len, pageSize.GetBottom(30)); cb.BeginText(); cb.SetFontAndSize(bf, 8); cb.ShowTextAligned(PdfContentByte.ALIGN_RIGHT, "Printed On " + PrintTime.ToString(), pageSize.GetRight(40), pageSize.GetBottom(30), 0); cb.EndText(); } public override void OnCloseDocument(PdfWriter writer, Document document) { base.OnCloseDocument(writer, document); template.BeginText(); template.SetFontAndSize(bf, 8); template.SetTextMatrix(0, 0); template.ShowText("" + (writer.PageNumber - 1)); template.EndText(); } } } 

并附上适用的代码:

 // Our custom Header and Footer is done using Event Handler TwoColumnHeaderFooter PageEventHandler = new TwoColumnHeaderFooter(); PDFWriter.PageEvent = PageEventHandler; // Define the page header PageEventHandler.Title = Title; PageEventHandler.HeaderFont = FontFactory.GetFont(BaseFont.COURIER_BOLD, 10, Font.BOLD); PageEventHandler.HeaderLeft = "Group"; PageEventHandler.HeaderRight = "1"; 

上面的代码是正确的,唯一的问题是,它没有被执行。 为此你必须在你已经编写了一个下载PDF代码的地方创build一个实例。 例:

 MyPdfPageEventHelpPageNo pageeventhandler = new MyPdfPageEventHelpPageNo(); writer.PageEvent = pageeventhandler; 

作家意味着PDF作家(一个实例)。

在你重写的每一个方法中,你可以添加一个对其基本方法的调用:

 base.OnStartPage(writer, document); base.OnEndPage(writer, document); base.OnCloseDocument(writer, document);