2012-06-05 36 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(); 
} 

}

希望這可以幫助別人的未來:)

相關問題