使用ITextSharp合并PDF文件

20

使用ITextSharp和C#,合并两个PDF文件的最佳方法是什么?我正在使用ASP.NET/.NET3.5。


1
我已经成功地使用了基于以下文章的代码:简单的.NET PDF合并器 - Jay Riggs
iTextSharp现在被称为“iText 7 for .NET”或“itext7-dotnet”,可以在github上找到:链接。建议使用Nuget将itext7添加到您的解决方案中。 - Peter Huber
2个回答

31
public static void Merge(List<String> InFiles, String OutFile)
    {
        using (FileStream stream = new FileStream(OutFile, FileMode.Create))
        using (Document doc      = new Document())
        using (PdfCopy pdf       = new PdfCopy(doc, stream))
        {
            doc.Open();

            PdfReader reader     = null;
            PdfImportedPage page = null;

            //fixed typo
            InFiles.ForEach(file =>
            {
                reader = new PdfReader(file);

                for (int i = 0; i < reader.NumberOfPages; i++)
                {
                    page = pdf.GetImportedPage(reader, i + 1);
                    pdf.AddPage(page);
                }

                pdf.FreeReader(reader);
                reader.Close();
            });
        }
    }

我该如何使用这个函数?比如说,你有一个生成的 PDF 文件,想将它附加到一个实体 PDF 文件中? - Boy Pasmo
2
请注意,这个答案是错误的。它抛弃了所有交互,并且如果不同的PDF包含相同的资源,则可能导致文件膨胀。唯一正确的答案是使用 PdfSmartCopy 的答案,这是 iTextSharp 中可用的另一个类。 - Bruno Lowagie
我也会看一下这个答案:https://dev59.com/35jga4cB1Zd3GeqPQd-g - Ricardo Appleton
如果可以的话,我会投票反对@BrunoLowagie的评论,因为它实际上与问题无关,只是他在宣传他专有版本的iTextSharp。 - Joe Tyman
@BrunoLowagie,如果合并两个符合ADA标准的PDF文件,PdfSmartCopy是否保留了ADA合规属性? - ScottS
@BrunoLowagie,如果合并两个符合ADA标准的PDF文件,PdfSmartCopy是否保留了ADA合规性属性? - undefined

1

如果您不想删除原始文件,则上一个答案可行。在我的情况下,我想要删除,但尝试时出现了异常。我的解决方案是:

  public static bool MergePDFs(List<String> InFiles, String OutFile)
        {
            bool merged = true;
            try
            {
                List<PdfReader> readerList = new List<PdfReader>();
                foreach (string filePath in InFiles)
                {
                    PdfReader pdfReader = new PdfReader(filePath);
                    readerList.Add(pdfReader);
                }

                //Define a new output document and its size, type
                Document document = new Document(PageSize.A4, 0, 0, 0, 0);
                //Create blank output pdf file and get the stream to write on it.
                PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(OutFile, FileMode.Create));
                document.Open();

                foreach (PdfReader reader in readerList)
                {
                    PdfReader.unethicalreading = true;
                    for (int i = 1; i <= reader.NumberOfPages; i++)
                    {
                        PdfImportedPage page = writer.GetImportedPage(reader, i);
                        document.Add(iTextSharp.text.Image.GetInstance(page));
                    }
                }
                document.Close();
                foreach (PdfReader reader in readerList)
                {
                    reader.Close();
                }

            }
            catch (Exception ex)
            {
                merged = false;
            }


            return merged;
        }

我从原始代码复制了代码。

除了轻微地修改以适应页面旋转等,但除此之外,它很容易取代在我的项目中锁定文件的代码。 - Ads

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