我不能插入一些“页X”的内容.到我的PDF页脚使用iTextSharp
本文关键字:我的 PDF iTextSharp 插入 不能 | 更新日期: 2023-09-27 18:06:48
我在iTextSharp很新的,我有以下情况:我正在创建一个PDF,包含一个页眉和一个页脚(对于页眉和页脚的创建,我使用一个扩展PdfPageEventHelper的类,我已经覆盖了OnStartPage()和OnEndPage()方法,它工作得很好)。
现在我的问题是,我必须插入作为页X的Y到我的页脚。其中X**为当前**页码, Y为总页码。Y的值不是固定的(因为我的PDF的长度事先不知道,因为它取决于内容的长度,并且不同的PDF可能不同)。我该如何处理这种情况?(在每个页脚插入正确的Y值?)
在线搜索我已经找到了这个教程(这是Java ittext ,但也许它不是那么不同于iTextSharp版本):http://itextpdf.com/examples/iia.php?id=104
在这个例子中,它创建了一个PDF,它的头包含类似于Page X of Y的内容。
我正试图理解这个例子(并将其翻译为iTextSharp),但我对它的工作方式有一些疑问(如果它是我问题的真正解决方案)。
根据我的理解,它执行以下操作:
在扩展PdfPageEventHelper的类中声明了一个PdfTemplate对象
PdfTemplate total;
我想也许它处理了我的PDF文档中的总页数,但是阅读官方文档我没有太多关于这个类究竟做什么的信息:http://api.itextpdf.com/itext/com/itextpdf/text/pdf/PdfTemplate.html
我试图做一些类似的东西到我的类扩展PdfPageEventHelper,但我不能这样做。
这是我不工作的代码:
public class PdfHeaderFooter : PdfPageEventHelper
{
// The template with the total number of pages:
PdfTemplate total;
private static int numPagina = 1;
public Image CellImage;
private string folderImages;
private string _sourceId;
public PdfHeaderFooter(string _folderImages, string sourceId)
{
folderImages = _folderImages;
_sourceId = sourceId;
}
/* Creates the PdfTemplate that will hold the total number of pages.
* Write on top of document
* */
public override void OnOpenDocument(PdfWriter writer, Document document)
{
base.OnOpenDocument(writer, document);
// (Nobili) Page Number:
total = writer.DirectContent.CreateTemplate(30, 16);
//PdfPTable tabFot = new PdfPTable(new float[] { 1F });
PdfPTable tabFot = new PdfPTable(2);
tabFot.WidthPercentage = 98;
tabFot.SpacingAfter = 10F;
PdfPCell cell;
//tabFot.TotalWidth = 300F;
cell = new PdfPCell(new Phrase("Header"));
tabFot.AddCell(cell);
tabFot.WriteSelectedRows(0, -1, 150, document.Top, writer.DirectContent);
}
// write on end of each page
public override void OnEndPage(PdfWriter writer, Document document)
{
base.OnEndPage(writer, document);
int pageN = writer.PageNumber;
String text = "Page " + pageN + " of ";
//PdfPTable tabFoot = new PdfPTable(new float[] { 1F });
PdfPTable tabFoot = new PdfPTable(3);
tabFoot.TotalWidth = document.Right - document.Left;
tabFoot.DefaultCell.Border = PdfPCell.NO_BORDER;
tabFoot.DefaultCell.CellEvent = new RoundedBorder();
PdfPTable innerTable = new PdfPTable(2);
innerTable.SetWidths(new int[] { 247, 246 });
innerTable.TotalWidth = document.Right - document.Left;
innerTable.DefaultCell.Border = PdfPCell.NO_BORDER;
PdfPCell innerCellLeft = new PdfPCell(new Phrase("Early Warning - Bollettino")) { Border = PdfPCell.NO_BORDER, Padding = 5, MinimumHeight = 20, HorizontalAlignment = Element.ALIGN_LEFT };
//PdfPCell innerCellRight = new PdfPCell(new Phrase("Pag. " + numPagina + "/5")) { Border = PdfPCell.NO_BORDER, Padding = 5, MinimumHeight = 20, HorizontalAlignment = Element.ALIGN_RIGHT };
PdfPCell innerCellCenter = new PdfPCell(new Phrase(text)) { Border = PdfPCell.NO_BORDER, Padding = 5, MinimumHeight = 20, HorizontalAlignment = Element.ALIGN_RIGHT };
PdfPCell innerCellRight = new PdfPCell(Image.GetInstance(total)) { Border = PdfPCell.NO_BORDER, Padding = 5, MinimumHeight = 20, HorizontalAlignment = Element.ALIGN_RIGHT };
innerTable.AddCell(innerCellLeft);
innerTable.AddCell(innerCellRight);
tabFoot.AddCell(innerTable);
tabFoot.WriteSelectedRows(0, -1, document.Left, document.Bottom, writer.DirectContent);
numPagina++;
}
// write on start of each page
public override void OnStartPage(PdfWriter writer, Document document)
{
base.OnStartPage(writer, document);
PdfPTable tabHead = new PdfPTable(3);
tabHead.SetWidths(new int[] { 165, 205, 125 });
//tabHead.TotalWidth = 460F;
tabHead.TotalWidth = document.Right - document.Left; // TotalWidth = 495
tabHead.WidthPercentage = 98;
PdfPCell cell1 = new PdfPCell(iTextSharp.text.Image.GetInstance(folderImages + "logoEarlyWarning.png"), true) { Border = PdfPCell.BOTTOM_BORDER };
tabHead.AddCell(cell1);
//tabHead.AddCell(new PdfPCell(new Phrase("CELL 1:")) { Border = PdfPCell.BOTTOM_BORDER, Padding = 5, MinimumHeight = 50, PaddingTop = 15, });
tabHead.AddCell(new PdfPCell(new Phrase("CELL 2:")) { Border = PdfPCell.BOTTOM_BORDER, Padding = 5, MinimumHeight = 50, PaddingTop = 15 });
if(_sourceId == "NVD")
{
iTextSharp.text.Image logo = iTextSharp.text.Image.GetInstance(folderImages + "nvdLogo.png");
logo.ScalePercent(48f);
//PdfPCell cell3 = new PdfPCell(iTextSharp.text.Image.GetInstance(folderImages + "nvdLogo.png"), true) { Border = PdfPCell.BOTTOM_BORDER, PaddingBottom = 25 };
PdfPCell cell3 = new PdfPCell(logo) { Border = PdfPCell.BOTTOM_BORDER, PaddingLeft = 50 };
tabHead.AddCell(cell3);
}
else if(_sourceId == "DeepSight")
{
PdfPCell cell3 = new PdfPCell(iTextSharp.text.Image.GetInstance(folderImages + "DSLogo.jpg"), true) { Border = PdfPCell.BOTTOM_BORDER };
tabHead.AddCell(cell3);
}
//tabHead.AddCell(new PdfPCell(new Phrase("CELL 3:")) { Border = PdfPCell.BOTTOM_BORDER, Padding = 5, MinimumHeight = 50, PaddingTop = 15 });
tabHead.WriteSelectedRows(0, -1, document.Left, document.Top, writer.DirectContent);
}
//write on close of document
public override void OnCloseDocument(PdfWriter writer, Document document)
{
base.OnCloseDocument(writer, document);
}
}
}
我想在页脚添加一些类似于Page X of Y的内容,如教程
中所示我试着做下面的事情:
1)我声明了PdfTemplate total;对象作为我的类的字段,我初始化它到我的OnOpenDocument()方法
total = writer.DirectContent.CreateTemplate(30, 16);
在我的OnEndPage()方法中,我放入:
String text = "Page " + pageN + " of ";
我创建了下面的表来显示Y
的页XPdfPCell innerCellLeft = new PdfPCell(new Phrase("Early Warning - Bollettino")) { Border = PdfPCell.NO_BORDER, Padding = 5, MinimumHeight = 20, HorizontalAlignment = Element.ALIGN_LEFT };
PdfPCell innerCellCenter = new PdfPCell(new Phrase(text)) { Border = PdfPCell.NO_BORDER, Padding = 5, MinimumHeight = 20, HorizontalAlignment = Element.ALIGN_RIGHT };
PdfPCell innerCellRight = new PdfPCell(Image.GetInstance(total)) { Border = PdfPCell.NO_BORDER, Padding = 5, MinimumHeight = 20, HorizontalAlignment = Element.ALIGN_RIGHT };
但是它不工作,抛出一个异常
我的代码可能有什么问题?
您没有阅读示例附带的文档就复制/粘贴代码。此外,您完全忽略了我书中示例的c#版本。我已经花了很多钱给一个c#开发人员来移植这些例子。感觉那笔钱好像被白白浪费了。您可以在这里找到您尝试移植自己的示例:http://tinyurl.com/itextsharpIIA2C05
错误#1:您正在添加OnStartPage()
方法中的内容。这是禁止的!这在很多地方都有记载。请看下面这个从官方文档第150页抄来的答案:
FAQ 为什么不建议在
onStartPage()
方法中添加内容?您应该记得在5.2.4节中,当当前页面为空时,iText会忽略newPage()
调用。当您从代码中显式调用该方法时,将执行(或忽略)该方法,但在多个场合也会从iText中隐式调用该方法。对于空白页,忽略它是很重要的;否则,您最终会得到大量不需要的新页面,这些页面会在无意中留下空白。如果您在onStartPage()
方法中添加内容,那么总是有产生不需要的页面的风险。考虑为添加内容保留onEndPage()
方法更安全。
错误#2:您正在添加OnOpenDocument()
方法中的内容。为什么说得通呢?
错误#3:您创建total
对象,因为您想要创建一个可以添加到每个页面的占位符。一旦知道了总页数,就需要在占位符上填写这个数字。然而,我没有看到你在任何地方这样做。这样做的适当的地方,显然是在OnCloseDocument()
甚至。这个事件在文档关闭之前被触发,因此在那个时刻,总页数是已知的。正如歇洛克·福尔摩斯所说的那样,这是很初级的,亲爱的!