2011-07-11 96 views
5

我們使用itextsharp從多個PDF文件創建單個PDF。如何將新頁面插入到文件中已有多個頁面的PDF文件中?當我使用添加頁面時,它將覆蓋現有頁面,並只保存所選的1頁。使用itextsharp將頁面插入到現有PDF中

這裏是我使用的網頁添加到現有的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(); 

回答

1

你可以使用這樣的事情,在那裏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(); 
+0

我想從源PDF只有某些網頁,並將它們添加到現有的PDF。唯一的問題是它不會將其添加到現有的PDF中,而只是將其寫入。 –

+0

@Rob:出於某種原因,我沒有從原始問題中得知。您的問題是否需要重新編寫爲將源文檔中的某些(包括全部)頁面合併到一個文件中?這意味着現有PDF成爲所有頁面所需的源之一? –

2

PdfCopy旨在用於與空Document。你應該添加你想要的一切,一次一頁。

另一種方法是使用PdfStamper.InsertPage(pageNum, rectangle),然後在該新頁面上繪製一個PdfImportedPage

注意PdfImportedPage僅包括頁面內容,不標註,或最初可能使用的頁面doc級信息(「文檔結構」,doc級Java腳本等)... 除非你使用一個與PdfCopy

一個印章可能會更有效率,並使用更少的代碼,但PdfCopy將導入所有頁面級別的信息,而不僅僅是頁面的內容。

這可能很重要,它可能不重要。這取決於你想要導入的頁面。

+0

這個答案在我的情況下非常完美!我需要將'n'空白頁面添加到現有的PDF中。 「PdfStamper.InsertPage」就是這樣。謝謝! – Nicolocodev

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(); 
    } 
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(); 
      } 
     } 
    } 
} 
+0

此代碼的工作原理只需要在兩個位置爲(int i = 0; i

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); 
} 
相關問題