我有一个使用iTextSharp生成的PDF,在页脚中显示“Page 1/4”等内容。这一切都运行正常,并使用PdfTemplate
方法中设置的OnEndPage()
和OnCloseDocument()
方法中添加的总页数来实现。
如果文档中只有一页,我想要删除它。我在我的OnCloseDocument()
方法中尝试了这个,但实际上并没有删除模板:
public override void OnCloseDocument(PdfWriter writer, Document document)
{
base.OnCloseDocument(writer, document);
if (writer.PageNumber >= 3)
{
template.BeginText();
template.SetFontAndSize(f_cn, CocService.footerFont.Size);
template.SetTextMatrix(0, 0);
template.ShowText("" + (writer.PageNumber - 1));
template.EndText();
}
else
{
template.Reset();
}
}
仅供参考,以下是OnEndPage()
方法的相关代码:
public override void OnEndPage(PdfWriter writer, Document document)
{
base.OnEndPage(writer, document);
int pageN = writer.PageNumber;
String text = "Page " + pageN.ToString() + "/";
float len = f_cn.GetWidthPoint(text, CocService.footerFont.Size);
iTextSharp.text.Rectangle pageSize = document.PageSize;
cb.SetRGBColorFill(100, 100, 100);
cb.BeginText();
cb.SetFontAndSize(f_cn, CocService.footerFont.Size);
cb.SetTextMatrix(document.LeftMargin+520, pageSize.GetBottom(document.BottomMargin)+33);
cb.ShowText(text);
cb.EndText();
cb.AddTemplate(template, document.LeftMargin + 520 + len, pageSize.GetBottom(document.BottomMargin)+33);
}
答案 0 :(得分:3)
我最终选择的解决方案是在每个页面中添加一个单独的PdfTemplate
对象,然后在OnCloseDocument()
方法中设置所有页码(或将它们全部删除)。我觉得这也很优雅。这是基本代码:
// Inner class for dealing with the page numbering
class CocPdfEventHelper : PdfPageEventHelper
{
List<PdfTemplate> pageNumberTemplates = new List<PdfTemplate>();
public override void OnEndPage(PdfWriter writer, Document document)
{
base.OnEndPage(writer, document);
// Add a unique (empty) template for each page here
PdfTemplate t = writer.DirectContent.CreateTemplate(180, 50);
pageNumberTemplates.Add(t);
writer.DirectContent.AddTemplate(t, document.LeftMargin + 520, document.PageSize.GetBottom(document.BottomMargin) + 33);
}
public override void OnCloseDocument(PdfWriter writer, Document document)
{
base.OnCloseDocument(writer, document);
// Only bother if there is more than 1 page
if (writer.PageNumber >= 3)
{
int count = 1;
foreach (PdfTemplate template in pageNumberTemplates)
{
template.BeginText();
template.SetFontAndSize(f_cn, CocService.footerFont.Size);
template.SetRGBColorFill(100, 100, 100);
template.SetTextMatrix(0,0);
template.ShowText("Page " + count + " of " + (writer.PageNumber - 1));
template.EndText();
count++;
}
}
}
}
答案 1 :(得分:1)
您已经在onEndPage()
方法中将文字写入内容流,并且无法在事实之后删除该,因为该流可能已经发送到{{ 1}}。
如果只有一个页面,避免在文档上显示任何页码的最佳方法是在一秒钟内添加页码。看一下TwoPasses示例,尤其是“SECOND PASS”。 IMO,这是解决您问题的最优雅方式。询问OutputStream
页数。如果是1,则什么也不做。如果更多,请添加 Y的页面。
顺便说一句:对于示例的C#端口,请转到http://tinyurl.com/itextsharpIIA2C06