首页 > 解决方案 > 为什么我不能使用 iTextSharp 使用此代码将 PDF 附加到另一个 PDF?

问题描述

我正在尝试使用 iTextSharp 将两个 PDF 文件的内容合并到一个新的 PDF 文件中。我之前在类似情况下使用过 PDFStamper 来完成此操作,但由于某种原因它这次无法正常工作。附加根本不起作用;该文件已创建,但到此代码块结束时大小保持为 0 字节。任何人都可以提供任何帮助将不胜感激。

File.Create(session.getLocalDir() + newPdfFile);

// pasting content from original file to new file
PdfReader reader = new PdfReader(originalFile);
string pageSelection = "1-" + reader.NumberOfPages;
reader.SelectPages(pageSelection);
PdfStamper stamper = new PdfStamper(reader, new FileStream(newPdfFile, FileMode.Append, FileAccess.Write));
stamper.Close();
reader.Close();

// pasting content from temp file to new file
reader = new PdfReader(temp);
pageSelection = "1-" + reader.NumberOfPages;
reader.SelectPages(pageSelection);
stamper = new PdfStamper(reader, new FileStream(newPdfFile, FileMode.Append, FileAccess.Write));
stamper.Close();
reader.Close();

标签: c#visual-studiopdfitextappend

解决方案


这里最简单的解决方案是在添加临时 pdf 文件时使用 MemoryStream 保存它。经过一些研究,我发现正如 mkl 所暗示的那样, PdfStamper 类不适合此操作。在 iTextSharp 中,您可以使用另一种方式附加 2 个 PDF:

        MemoryStream stream = new MemoryStream();
        PdfCopyFields copy = new PdfCopyFields(stream);


        var ms1 = new MemoryStream(File.ReadAllBytes(file1Path));
        ms1.Position = 0;
        copy.AddDocument(new PdfReader(ms1));
        ms1.Dispose();

        var ms2 = new MemoryStream(File.ReadAllBytes(file2Path));
        ms2.Position = 0;
        copy.AddDocument(new PdfReader(ms2));
        ms2.Dispose();
        copy.Close();

生成的“流”变量包含组合的 PDF,可以使用 PdfStamper 写入文件。

如果可以选择切换到 .net 的 iText 7,则可以省略 PdfStamper,而可以使用 PdfDocument.copyPagesTo() 方法。

一个简单的例子(使用 iText 7 for .net):

    MemoryStream stream = new MemoryStream();
    PdfDocument outputDocument = new PdfDocument(new PdfWriter(stream));
    PdfDocument pdfSource = new PdfDocument(new PdfReader("c:\\firstInput.pdf"));

    pdfSource.CopyPagesTo(1, pdfSource.GetNumberOfPages(), outputDocument);
    pdfSource = new PdfDocument(new PdfReader("c:\\secondInput.pdf"));
    pdfSource.CopyPagesTo(1, pdfSource.GetNumberOfPages(), outputDocument);
    pdfSource.Close();
    outputDocument.Close();

    MemoryStream outputStream = new MemoryStream(stream.ToArray());
    outputDocument = new PdfDocument(new PdfReader(outputStream), new PdfWriter("c:\\result.pdf"));

第二次编辑了针对特定用例的解决方案。


推荐阅读