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

1 回答 1

4

想使用 iTextSharp 将文本添加到现有 PDF 文件中,找到了不同的方法,但在所有这些方法中,作者和阅读器都是单独的 pdf 文件。

由于 iText(Sharp) 使用 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 中,完成后,将内存流的内容写入源文件路径。

于 2013-02-01T07:14:21.730 回答