ITextSharp编辑现有PDF

6

我希望使用iTextSharp向现有的PDF文件添加文本,我找到了不同的方法,但在所有这些方法中,写入器和读取器都是单独的pdf文件。 我想要一种方式,可以打开一个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();
            }
1个回答

4
您想使用iTextSharp将文本添加到现有的PDF文件中,已经发现了不同的方法,但在所有方法中,编写器和读取器都是单独的PDF文件。
正常使用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,并在完成后将内存流的内容写入源文件路径。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接