使用itextsharp将页面插入现有PDF

时间:2011-07-11 23:26:56

标签: c# insert itextsharp add

我们正在使用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();

6 个答案:

答案 0 :(得分: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();
            }
        }
    }
}

答案 1 :(得分:3)

我已经尝试过这段代码了,它对我有用,但不要忘记对页数和你使用的路径的存在进行一些验证

这是代码:

private static void AppendToDocument(string sourcePdfPath, string outputPdfPath, List<int> neededPages)
    {

        var sourceDocumentStream = new FileStream(sourcePdfPath, FileMode.Open);
        var destinationDocumentStream = new FileStream(outputPdfPath, FileMode.Create);
        var pdfConcat = new PdfConcatenate(destinationDocumentStream);

        var pdfReader = new PdfReader(sourceDocumentStream);
        pdfReader.SelectPages(neededPages);
        pdfConcat.AddPages(pdfReader);

        pdfReader.Close();
        pdfConcat.Close();
    }

答案 2 :(得分:2)

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

var result = "combined.pdf";
var fs = new FileStream(result, FileMode.Create);
var conc = new PdfConcatenate(fs, true);
foreach(var s in src) {
    var r = new PdfReader(s);
    conc.AddPages(r);
}
conc.Close();

答案 3 :(得分:2)

PdfCopy适用于空Document。你应该添加你想要的一切,一次一页。

另一种方法是使用PdfStamper.InsertPage(pageNum, rectangle),然后在新页面上绘制PdfImportedPage

请注意,PdfImportedPage仅包含页面内容,而不包括页面最初可能使用的注释或文档级信息(“文档结构”,文档级javascripts等)... 除非你使用PdfCopy

压模可能更有效率并且使用更少的代码,但PdfCopy将导入所有页面级信息,而不仅仅是页面内容。

这可能很重要,但可能不重要。这取决于您尝试导入的页面。

答案 4 :(得分:1)

必须以4的倍数平均页数:

private static void AppendToDocument(string sourcePdfPath)
{
    var tempFileLocation = Path.GetTempFileName();
    var bytes = File.ReadAllBytes(sourcePdfPath);

    using (var reader = new PdfReader(bytes))
    {
        var numberofPages = reader.NumberOfPages;
        var modPages = (numberofPages % 4);
        var pages = modPages == 0 ? 0 : 4 - modPages;

        if (pages == 0)
            return;

        using (var fileStream = new FileStream(tempFileLocation, FileMode.Create, FileAccess.Write))
        {
            using (var stamper = new PdfStamper(reader, fileStream))
            {
                var rectangle = reader.GetPageSize(1);
                for (var i = 1; i <= pages; i++)
                    stamper.InsertPage(numberofPages + i, rectangle);
            }
        }
    }

    File.Delete(sourcePdfPath);
    File.Move(tempFileLocation, sourcePdfPath);
}

答案 5 :(得分:0)

我知道我真的来不及了,但是我混合了两个最佳答案,并创建了一种方法,如果有人需要的话,可以使用itextsharp将源PDF文档列表添加到单个文档中。

private static void appendToDocument(List<string> sourcePDFList, string outputPdfPath)
{
    //Output document name and creation
    FileStream destinationDocumentStream = new FileStream(outputPdfPath, FileMode.Create);
     //Object to concat source pdf's to output pdf
     PdfConcatenate pdfConcat = new PdfConcatenate(destinationDocumentStream);

     //For each source pdf in list...
     foreach (string sourcePdfPath in sourcePDFList)
     {
         //If file exists...
         if (File.Exists(sourcePdfPath))
         {
             //Open the document
             FileStream sourceDocumentStream = new FileStream(sourcePdfPath, FileMode.Open);
             //Read the document
             PdfReader pdfReader = new PdfReader(sourceDocumentStream);

             //Create an int list
             List<int> pages = new List<int>();
             //for each page in pdfReader
             for (int i = 1; i < pdfReader.NumberOfPages + 1; i++)
             {
                 //Add that page to the list
                 pages.Add(i);
             }

             //Add that page to the pages to add to ouput document
             pdfReader.SelectPages(pages);
             //Add pages to output page
             pdfConcat.AddPages(pdfReader);

             //Close reader
             pdfReader.Close();
         }
     }

    //Close pdfconcat
    pdfConcat.Close();
}