2013-02-01 242 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在内存中创建的结果文件,即并在完成时将内存流的内容写入源文件路径。