2013-02-01 166 views
5

我想使用iTextSharp將文本添加到現有的PDF文件,我發現不同的方式,但在所有這些文件中,作者和讀者都是單獨的pdf文件。 我想要一種方式,所以我可以打開pdf然後在不同的位置寫入不同的東西。 現在我有這個代碼,但它會創建一個新文件。ITextSharp編輯現有的pdf

using (FileStream stream1 = File.Open(path, FileMode.OpenOrCreate)) 
     { 
     BaseFont bf = BaseFont.CreateFont(fontPath, BaseFont.IDENTITY_H, BaseFont.EMBEDDED); 
     PdfReader reader = new PdfReader("C:\\26178DATA\\pdf\\holding.pdf"); 
     var pageSize = reader.GetPageSize(1); 
     PdfStamper stamper = new PdfStamper(reader, stream1); 
     iTextSharp.text.Font tmpFont = new iTextSharp.text.Font(bf, fontSize); 
     PdfContentByte canvas = stamper.GetOverContent(1); 
     Phrase ph = new Phrase(words[1], tmpFont); 
     ph.Font = tmpFont; 
     canvas.SetFontAndSize(bf, fontSize); 
     ColumnText.ShowTextAligned(canvas, Element.ALIGN_LEFT, ph, iTextSharp.text.Utilities.MillimetersToPoints(x * 10), pageSize.GetTop(iTextSharp.text.Utilities.MillimetersToPoints(y * 10)), 0); 
     stamper.Close(); 
      } 

回答

4

想文本添加到使用iTextSharp的現有的PDF文件時,發現了不同的方式,但在所有這些的作者和讀者是獨立的PDF文件。

作爲其中的iText(夏普)操縱使用PdfStamper一個PDF以正常的方式,可以包括現有的PDF元素的重大資產重組,iText的不到位編輯文件。另一種方式,使用附加模式,將允許進行編輯;但是這樣的選擇沒有實現。現場編輯的一個大缺點是,如果程序出現故障,相關文件可能會保持中間不可用狀態。

話雖這麼說,你可以先把文件讀入內存完全,然後開始創建具有相同路徑的輸出保存新文件到原始文件的路徑。在你的示例代碼的情況下這將意味着至少移動PdfReader構造函數中使用創建輸出流之前:

PdfReader reader = new PdfReader(path); 
using (FileStream stream1 = File.Open(path, FileMode.OpenOrCreate)) 
{ 
    BaseFont bf = BaseFont.CreateFont(fontPath, BaseFont.IDENTITY_H, BaseFont.EMBEDDED); 
    ... 

或者你可以在一個MemoryStream,而不是一個FileStream在內存中創建的結果文件,即並在完成時將內存流的內容寫入源文件路徑。