2011-07-11 35 views
5

Chúng tôi đang sử dụng itextsharp để tạo một tệp PDF từ nhiều tệp PDF. Làm cách nào để chèn một trang mới vào một tệp PDF có nhiều trang đã có trong tệp? Khi tôi sử dụng trang thêm, nó sẽ ghi đè lên các trang hiện có và chỉ lưu 1 trang đã được chọn.Chèn trang vào tệp PDF hiện có bằng itextsharp

Đây là mã mà tôi đang sử dụng để thêm trang để PDF hiện có:

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(); 

Trả lời

1

Bạn có thể sử dụng một cái gì đó như thế này, nơi srcIEnumerable<string> của tên tập tin pdf đầu vào. Chỉ cần chắc chắn rằng tập tin pdf hiện tại của bạn là một trong những nguồn đó. Lớp PdfConcatenate nằm trong bản phát hành iTextSharp mới nhất.

 
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

Tôi đang cố gắng để có được các trang nhất định từ một nguồn PDF và thêm chúng vào một file PDF hiện có. Vấn đề duy nhất là nó không thêm nó vào tệp PDF hiện có mà chỉ ghi đè lên nó. –

+0

@Rob: Vì một lý do nào đó, tôi đã không hiểu điều đó từ câu hỏi gốc. Vấn đề của bạn có thể được phục hồi khi cần phải kết hợp các trang nhất định (bao gồm tất cả) từ tài liệu nguồn vào một tệp không? Có nghĩa là một tệp PDF hiện có trở thành một trong những nguồn có tất cả các trang được yêu cầu? –

2

PdfCopy được thiết kế để sử dụng với số trống Document. Bạn nên thêm mọi thứ bạn muốn, một trang tại một thời điểm.

Cách khác là sử dụng PdfStamper.InsertPage(pageNum, rectangle) và sau đó vẽ PdfImportedPage lên trang mới đó.

Lưu ý rằng PdfImportedPage chỉ bao gồm nội dung trang, không phải là chú thích hoặc thông tin cấp tài liệu ("cấu trúc tài liệu", javascripts cấp tài liệu, v.v ... mà trang đó có thể đã sử dụng ban đầu ... trừ khi bạn sử dụng nó với PdfCopy.

Một Stamper có thể hiệu quả hơn và sử dụng ít mã hơn, nhưng PdfCopy sẽ nhập tất cả thông tin cấp trang, không chỉ nội dung của trang.

Điều này có thể quan trọng, có thể không. Nó phụ thuộc vào trang bạn đang cố gắng nhập.

+0

Câu trả lời này hoạt động hoàn hảo trong trường hợp của tôi! Tôi cần thêm các trang trống 'n' vào một tệp PDF hiện có. 'PdfStamper.InsertPage' là cách. Cảm ơn! – Nicolocodev

3

Tôi đã thử mã này, và nó làm việc cho tôi, nhưng đừng quên để làm một số kiểm chứng thực của số lượng trang và sự tồn tại của các đường dẫn bạn sử dụng

đây là mã:

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

Mã này hoạt động. Bạn cần có một tệp khác để xuất kết quả.

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

Mã này hoạt động chỉ cần sửa lỗi nhỏ cho (int i = 0; i

1

Đã phải thậm chí ra số trang với một bội số của 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); 
} 
Các vấn đề liên quan