【问题标题】:ITEXTSharp append PDF files into a already existing one on diskITEXTSharp 将 PDF 文件附加到磁盘上已经存在的文件中
【发布时间】:2016-04-29 15:07:44
【问题描述】:

我有必须合并为一个的 PDF 文件。如果我一次拥有所有 PDF 文件,这不是问题。然而,PDF 文件是分阶段进入的,并且由于工作流程的原因,我们需要在它们到达时将它们合并。

所以工作流程如下所示:

1:如果不存在 PDF 文件,则创建一个并将第一组页面合并到新的 PDF 文件中,然后关闭。

2:如果 PDF 已经存在(目标文件)打开它并将新页面合并到目标 PDF 文件中。然后关闭

3:重复。

下面是我的代码,但它只是覆盖了以前插入的页面,所以我的问题是如何使用 PDFSmartCopy 将 PDF 文件插入到现有的 PDF 文件中。

我需要使用 PDFSmartCopy 因为我需要优化字体。 我在StackOverflow 上找到了这个不错的文档,它展示了如何追加,但他们使用的是 PDFSmartCopy 以外的不同技术。

注意:我不确定是否需要创建一个中间 PDF 文件来保存目标 PDF 页面,然后删除目标 PDF,然后将中间 PDF 保存为目标 PDF。但是,在我这样做之前,我想知道是否有一种方法可以在没有中间步骤的情况下做到这一点。

using (FileStream stream = new FileStream(targetFile, FileMode.OpenOrCreate))
{
  Document pdfDoc = new Document(PageSize.LETTER);
  PdfSmartCopy pdf = new PdfSmartCopy(pdfDoc, stream);
  pdfDoc.Open();
  foreach (string file in files)
  {
    PdfReader reader = new PdfReader(file);
    pdf.AddDocument(reader);
    pdf.FreeReader(reader) ;
    reader.Close();
  }  

}

【问题讨论】:

  • 我认为这就是您正在寻找的Edit DirectContent of iTextSharp PdfSmartCopy class。如果不是,我认为这会让你朝着你需要去的方向前进。我没用过PdfSmartCopy。希望对您有所帮助。
  • 嗨,埃里克,谢谢你,但我最终会遇到同样的问题。该文件将被新数据覆盖,旧数据将丢失。 ..
  • 当我将 pdf 合并在一起时,我会使用原始文件和将所有内容合并到的文件创建子文件夹。我创建了一个面包屑,这样如果出现问题,我仍然可以从一开始就拥有一切。
  • @Eric,不是我的意思是合并 PDF 文件(目标)页面被我试图合并的 PDF 文件覆盖。因此,如果我的第一次合并是 10 页有效,如果第二次合并是 2 页,我应该有 12 页,但目标 PDF 中只有两页。我开始倾向于尝试在内存中执行此操作,但是这些文件有 37,000 多页。
  • ooooo .... 所以在查看源代码后,我看起来您可以使用与 PdfCopy 相同的代码。如果您希望我用于将文件合并在一起,我可以添加下面的代码。您只需将PdfCopy 替换为PdfSmartCopy

标签: c# pdf itextsharp


【解决方案1】:

这是我用来合并 Ppdf 的代码。就像我上面所说的,从我在源代码中看到的内容看起来你可以用PdfSmartCopy 替换PdfCopy。还基于 cmets PdfSmartCopy 使用更多内存,以便可以保存对资源的引用。它继承自 PdfCopy 类,这让我认为只需将 PdfCopy 替换为 PdfSmartCopy 就可以了。

我希望这能让你朝着正确的方向前进。此外,这里还有一个指向您想要查看的源代码的链接。 https://github.com/itext/itextsharp

var document = new Document();
var writer = new PdfCopy(document, new FileStream(outFile, FileMode.Create));
document.Open();
    foreach (var fileName in groupfiles)
    {
        var reader = new PdfReader(Path.Combine(config.WorkingDirectory, fileName));
        for (var i = 1; i <= reader.NumberOfPages; i++)
        {
            var page = writer.GetImportedPage(reader, i);
            writer.AddPage(page);
        }
        reader.Close();
   }
writer.Close();
document.Close();

【讨论】:

  • 谢谢,但如果有所有 PDF 文件开始,我使用的上述代码可以合并 PDF 文件,但正如我的工作流程所述,我可以在 5 分钟后 30 分钟后得到另一个说法10. 由于时间问题,我们必须在 PDF 进来时合并它们。问题就在这里。当我们合并 PDF 文件时。在我看来,PdfCopy 等的设计仅适用于新文档而不是现有文档......这是挑战,但非常感谢您提供帮助。
  • @Eric - 你能找到解决这个问题的方法吗?
  • 感谢您的代码共享。 @Eric,我还有一个问题,即使它们没有变成 pdf 文件,是否可以将它们组合起来?
  • @Kun-yaoWang - 我不完全确定我理解你想要做什么。如果您希望合并内存中的文件,我相信您可以做到这一点,但在某些时候要小心,您可能会耗尽内存。
  • 说得好,我已经把所有的PDF一起生成并组合在一起完成了这项工作,谢谢提醒。 @埃里克
猜你喜欢
  • 2011-12-25
  • 2019-10-30
  • 1970-01-01
  • 2012-08-12
  • 1970-01-01
  • 2020-11-01
  • 1970-01-01
  • 2011-03-01
  • 2014-12-01
相关资源
最近更新 更多