2012-06-05 37 views
1

我正在使用ITextSharp将页码添加到PDF文档的底部 事情是,它由4或5个不同的PDF组成,通过该过程组合在一起,一些动态添加的页面,所以PDF的大小可能会有所不同。我无法调用document.PageCount,因为它“缺少get访问器”。Itextsharp PdfDocument或PdfDocument从它.Document

我做了一个计数器来跟踪我所处的页面,并可以让最后一页说“第9页,共9页”,但其余的只是说“第7页”。 我在想,我可以通过PdfReader运行整个文档来调用reader.NumberOfPages并重新运行每个页面,并在底部添加最终编号,但我不知道如何从iTextSharp.text.Document类型创建一个,也不事后如何去做。

这是一个由其他人开始的项目,之前我几乎没有碰过iTextSharp,因为它太大了,所以我不能重新开始上课。

有谁知道我能做什么?或者如何去添加1号码到iTextSharp.text.Document的每个页面?

+0

因此y你正在做的事情,结合多个PDF和绘制文本在他们的过程中,对吗?在这里看到我的编辑。基本上,最简单的方法是只做两遍,第一次结合,第二次结束文本。 http://stackoverflow.com/a/9845722/231316 –

+0

嘿,谢谢,我完全会这样做,但不幸的是,文档存储在内存中,所以它在第一次传递后没有物理路径。它只是存储并保存在内存流中。顺便说一句,你应该回答这个问题,而不是留下评论,所以我可以给你更多的观点。 – Solid1Snake1

回答

0

发现这家伙:d

所以每当你让你的作家:

using (MemoryStream MS = new MemoryStream()) 
     { 
      PdfWriter writer = PdfWriter.GetInstance(doc, MS); 
      writer.ViewerPreferences = PdfWriter.PageModeUseOutlines; 
      PdfFooter eventHandler = new PdfFooter(); 
      writer.PageEvent = eventHandler; 

ect. 
} 

对于PdfFooter:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using iTextSharp.text.pdf; 
using iTextSharp.text; 

public class PdfFooter : 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 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.GetRight(70), pageSize.GetBottom(15)); 
    cb.ShowText(text); 
    cb.EndText(); 

    cb.AddTemplate(template, pageSize.GetRight(70) + len, pageSize.GetBottom(15)); 
} 

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

}

希望这可以帮助别人的未来:)

相关问题