2009-02-19 43 views
7

Tôi đã xóa Web tìm kiếm các ví dụ về cách thực hiện việc này. Tôi đã tìm thấy một vài thứ dường như có liên quan nhiều hơn một chút thì họ cần phải như vậy. Vì vậy, câu hỏi của tôi là, bằng cách sử dụng iTextSharp, là có một cách khá súc tích để nối thêm một tài liệu PDF khác?Có cách nào để chuyển tiếp một tài liệu PDF sang một tài liệu PDF khác bằng iTextSharp không?

Tối ưu hóa điều này sẽ KHÔNG liên quan đến tệp thứ ba. Chỉ cần mở tài liệu PDF đầu tiên, thêm tài liệu PDF thứ hai vào đầu tiên và sau đó đóng chúng lại.

Trả lời

5

Ok, nó không thẳng về phía trước, nhưng nó hoạt động và nhanh chóng đáng ngạc nhiên. (Và nó sử dụng một tập tin thứ 3, không có những thứ như mở và nối thêm.) Tôi đã khám phá ra điều này trong các tài liệu/ví dụ. Đây là mã:

private void CombineMultiplePDFs(string[] fileNames, string outFile) { 
    int pageOffset = 0; 
    ArrayList master = new ArrayList(); 
    int f = 0; 

    Document document = null; 
    PdfCopy writer = null; 
    while (f < fileNames.Length) { 
     // we create a reader for a certain document 
     PdfReader reader = new PdfReader(fileNames[ f ]); 
     reader.ConsolidateNamedDestinations(); 
     // we retrieve the total number of pages 
     int n = reader.NumberOfPages; 
     ArrayList bookmarks = SimpleBookmark.GetBookmark(reader); 
     if (bookmarks != null) { 
      if (pageOffset != 0) { 
       SimpleBookmark.ShiftPageNumbers(bookmarks, pageOffset, null); 
      } 
      master.AddRange(bookmarks); 
     } 
     pageOffset += n; 

     if (f == 0) { 
      // step 1: creation of a document-object 
      document = new Document(reader.GetPageSizeWithRotation(1)); 
      // step 2: we create a writer that listens to the document 
      writer = new PdfCopy(document, new FileStream(outFile, FileMode.Create)); 
      // step 3: we open the document 
      document.Open(); 
     } 
     // step 4: we add content 
     for (int i = 0; i < n;) { 
      ++i; 
      if (writer != null) { 
       PdfImportedPage page = writer.GetImportedPage(reader, i); 
       writer.AddPage(page); 
      } 
     } 
     PRAcroForm form = reader.AcroForm; 
     if (form != null && writer != null) { 
      writer.CopyAcroForm(reader); 
     } 
     f++; 
    } 
    if (master.Count > 0 && writer != null) { 
     writer.Outlines = master; 
    } 
    // step 5: we close the document 
    if (document != null) { 
     document.Close(); 
    } 
} 
1

Có. Tôi đã nhìn thấy một lớp được gọi là PdfManipulation được đăng trong diễn đàn iText. Sử dụng lớp đó sẽ liên quan đến một tập tin thứ ba mặc dù.

Lớp học ban đầu trong VB.Net. Tôi đã tải xuống từ số post on vbforums.com. Dường như, nó không có chức năng kết hợp các tệp, vì vậy tôi đã viết một tệp dựa trên mã trong lớp đó.

Điều này được viết trên máy không có iTextSharp. Điều này có thể có lỗi. Tôi thậm chí không chắc chắn nếu số trang là 0 hoặc dựa trên 1. Nhưng cho nó một shot.

public static void MergePdfFiles(IEnumerable<string> files, string output) { 
    iTextSharp.text.Document doc; 
    iTextSharp.text.pdf.PdfCopy pdfCpy; 

    doc = new iTextSharp.text.Document(); 
    pdfCpy = new iTextSharp.text.pdf.PdfCopy(doc, new System.IO.FileStream(output, System.IO.FileMode.Create)); 
    doc.Open(); 

    foreach (string file in files) { 
     // initialize a reader 
     iTextSharp.text.pdf.PdfReader reader = new iTextSharp.text.pdf.PdfReader(file); 
     int pageCount = reader.NumberOfPages; 

     // set page size for the documents 
     doc.SetPageSize(reader.GetPageSizeWithRotation(1)); 

     for (int pageNum = 1; pageNum <= pageCount; pageNum++) { 
      iTextSharp.text.pdf.PdfImportedPage page = pdfCpy.GetImportedPage(reader, pageNum); 
      pdfCpy.AddPage(page); 
     } 

     reader.Close(); 
    } 

    doc.Close(); 
} 
+1

số trang được 1 dựa trên –

0

Tôi không biết cách làm điều đó cho tệp PDF, nhưng đối với postscript, bạn chỉ cần ghép nối các tệp. Nếu bạn đã cài đặt pdf2ps và ps2pdf, bên dưới sẽ thực hiện công việc:

pdf2ps file1.pdf file1.ps 
pdf2ps file2.pdf file2.ps 
cat file1.ps file2.ps > combined.ps 
ps2pdf combined.ps combined.pdf 

Tôi không phải là chuyên gia về pdf2ps hoặc ps2pdf. Tôi đã từng sử dụng ps2pdf, và khi tôi làm như vậy, nó để lại văn bản dưới dạng văn bản (tôi vẫn có thể chọn và sao chép văn bản từ pdf kết quả). Khi tôi thực hiện các bước trên (pdf-> ps, kết hợp, ps-> pdf), tôi kết thúc bằng một pdf kết quả giống như một hình ảnh. Không biết tại sao.

13

Tôi thực sự có thể thiếu một cái gì đó, nhưng tôi đã làm điều gì đó đơn giản hơn nhiều. Tôi thừa nhận giải pháp này có lẽ sẽ không cập nhật bookmark (như trong câu trả lời tốt nhất ở đây cho đến nay), nhưng nó hoạt động hoàn hảo cho tôi. Vì tôi đã hợp nhất các tài liệu với các biểu mẫu có thể điền, tôi đã sử dụng PdfCopyFields thay vì PdfCopy.

Đây là mã (tôi đã bị tước tất cả các lỗi xử lý để làm cho đoạn code thực tế rõ ràng hơn, thêm một try..finally để đóng nguồn mở nếu bạn có kế hoạch sử dụng mã):

void MergePdfStreams(List<Stream> Source, Stream Dest) 
    { 
     PdfCopyFields copy = new PdfCopyFields(Dest); 

     foreach (Stream source in Source) 
     { 
      PdfReader reader = new PdfReader(source); 
      copy.AddDocument(reader); 
     } 

     copy.Close(); 
    } 

bạn có thể vượt qua bất kỳ dòng, có thể là một FileStream, một MemoryStream (hữu ích khi đọc PDF từ cơ sở dữ liệu, không cần phải cho các tập tin tạm thời, vv)

mẫu sử dụng:

void TestMergePdfStreams() 
    { 
     List<Stream> sources = new List<Stream>() 
     { 
      new FileStream("template1.pdf", FileMode.Open), 
      new FileStream("template2.pdf", FileMode.Open), 
      new MemoryStream((byte[])someDataRow["PDF_COLUMN_NAME"]) 
     }; 

     MergePdfStreams(sources, new FileStream("MergedOutput.pdf", FileMode.Create)); 
    } 
+1

Điều này làm việc hoàn hảo để cố gắng hợp nhất/nối thêm hai tài liệu PDF với các trường biểu mẫu! Đơn giản hơn nhiều! Cảm ơn bạn. –

+0

Điều này làm việc tuyệt vời cho tôi. Tôi muốn đề nghị gọi source.Close() sau cuộc gọi copy.AddDocument để cho phép tệp được làm việc với nơi khác. – Jason

Các vấn đề liên quan