使用itextsharp将页面插入现有PDF

Rob*_*ton 6 c# pdf insert add itext

我们使用itextsharp从多个PDF文件创建单个PDF.如何将新页面插入到文件中已有多个页面的PDF文件中?当我使用添加页面时,它会覆盖现有页面,只保存所选的1页.

以下是我用于将页面添加到现有PDF的代码:

PdfReader reader = new PdfReader(sourcePdfPath);
                Document document = new Document(reader.GetPageSizeWithRotation(1));
                PdfCopy pdfCopy = new PdfCopy(document, new System.IO.FileStream(outputPdfPath, System.IO.FileMode.Create));
                MemoryStream memoryStream = new MemoryStream();
                PdfWriter writer = PdfWriter.GetInstance(document, memoryStream);
                document.AddDocListener(writer);
                document.Open();

                for (int p = 1; p <= reader.NumberOfPages; p++)
                {
                    if (pagesToExtract.FindIndex(s => s == p) == -1) continue;
                    document.SetPageSize(reader.GetPageSize(p));
                    document.NewPage();
                    PdfContentByte cb = writer.DirectContent;
                    PdfImportedPage pageImport = writer.GetImportedPage(reader, p);

                    int rot = reader.GetPageRotation(p);
                    if (rot == 90 || rot == 270)
                    {
                        cb.AddTemplate(pageImport, 0, -1.0F, 1.0F, 0, 0, reader.GetPageSizeWithRotation(p).Height);
                    }
                    else
                    {
                        cb.AddTemplate(pageImport, 1.0F, 0, 0, 1.0F, 0, 0);
                    }

                    pdfCopy.AddPage(pageImport);
                }

                pdfCopy.Close();
Run Code Online (Sandbox Code Playgroud)

mar*_*sey 5

这段代码有效.您需要使用不同的文件来输出结果.

private static void AppendToDocument(string sourcePdfPath1, string sourcePdfPath2, string outputPdfPath)
{
    using (var sourceDocumentStream1 = new FileStream(sourcePdfPath1, FileMode.Open))
    {
        using (var sourceDocumentStream2 = new FileStream(sourcePdfPath2, FileMode.Open))
        {
            using (var destinationDocumentStream = new FileStream(outputPdfPath, FileMode.Create))
            {
                var pdfConcat = new PdfConcatenate(destinationDocumentStream);
                var pdfReader = new PdfReader(sourceDocumentStream1);

                var pages = new List<int>();
                for (int i = 0; i < pdfReader.NumberOfPages; i++)
                {
                    pages.Add(i);
                }

                pdfReader.SelectPages(pages);
                pdfConcat.AddPages(pdfReader);

                pdfReader = new PdfReader(sourceDocumentStream2);

                pages = new List<int>();
                for (int i = 0; i < pdfReader.NumberOfPages; i++)
                {
                    pages.Add(i);
                }

                pdfReader.SelectPages(pages);
                pdfConcat.AddPages(pdfReader);

                pdfReader.Close();
                pdfConcat.Close();
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 此代码只需修复两个地方的小错误 for (int i = 0; i &lt; pdfReader.NumberOfPages; i++) 需要 for (int i = 0; i &lt;= pdfReader.NumberOfPages; i++) (2认同)

Ser*_*i Z 2

你可以使用这样的东西,输入 pdf 文件名的src位置在哪里IEnumerable<string>。只需确保您现有的 pdf 文件是这些来源之一即可。该类PdfConcatenate位于最新的 iTextSharp 版本中。

var 结果 = "combined.pdf";
var fs = new FileStream(结果, FileMode.Create);
var conc = new PdfConcatenate(fs, true);
foreach(src 中的 var s) {
    var r = 新的 PdfReader(s);
    conc.AddPages(r);
}
conc.Close();