2009-02-19 10 views
7

Ich habe das Web nach Beispielen gesucht, wie man das macht. Ich habe ein paar gefunden, die etwas involvierter zu sein scheinen als sie sein müssen. Meine Frage ist also, mit iTextSharp, gibt es eine ziemlich präzise Möglichkeit, ein PDF-Dokument an ein anderes anzuhängen?Gibt es eine direkte Möglichkeit, ein PDF-Dokument mithilfe von iTextSharp an ein anderes Dokument anzuhängen?

Optimal wäre dies keine dritte Datei. Öffnen Sie einfach das erste PDF-Dokument, hängen Sie das zweite PDF-Dokument an das erste an und schließen Sie beide.

Antwort

5

Ok, es ist nicht direkt, aber es funktioniert und ist überraschend schnell. (Und es verwendet eine 3. Datei, nicht so etwas wie öffnen und anhängen.) Ich 'entdeckte' dies in den Dokumenten/Beispielen. Hier ist der Code:

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

Ja. Ich habe eine Klasse namens PdfManipulation in einem iText-Forum gesehen. Die Verwendung dieser Klasse würde jedoch eine dritte Datei beinhalten.

Die Klasse ist ursprünglich in VB.Net. Ich habe es von einem post on vbforums.com heruntergeladen. Offenbar hat es jedoch nicht die Funktion zum Zusammenführen von Dateien, also schrieb ich eine basierend auf dem Code in dieser Klasse.

Dies wurde auf einer Maschine ohne iTextSharp geschrieben. Dies könnte Fehler haben. Ich bin nicht einmal sicher, ob die Seitenzahlen 0-basiert oder 1-basiert sind. Aber versuchen Sie es.

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

Seitenzahlen 1-basierte –

0

Ich weiß nicht, wie es für PDF-Dateien zu tun, aber für Postscript, verketten Sie einfach die Dateien. Wenn Sie pdf2ps und ps2pdf installiert haben, gehen Sie wie unter den Job:

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

Ich bin kein Experte für pdf2ps oder ps2pdf. Ich habe immer nur ps2pdf verwendet, und wenn ich das tue, hinterlässt es Text als Text (ich kann immer noch Text aus dem resultierenden PDF auswählen und kopieren). Wenn ich die obigen Schritte mache (pdf-> ps, kombinieren, ps-> pdf), lande ich mit einer resultierenden pdf, die wie ein Bild ist. Keine Ahnung warum.

13

Ich kann wirklich etwas vermissen, aber ich habe etwas viel einfacher. Ich gebe zu, dass diese Lösung wahrscheinlich Lesezeichen nicht aktualisieren wird (wie in der besten Antwort hier bisher), aber es funktioniert einwandfrei für mich. Seit ich Dokumente mit ausfüllbaren Formularen zusammengeführt habe, habe ich PdfCopyFields anstelle von PdfCopy verwendet.

Hier ist der Code (ich alle Fehler ausgezogen habe Umgang mit dem eigentlichen Code besser sichtbar zu machen, fügen Sie ein try..finally geöffnete Ressourcen zu schließen, wenn Sie mit dem Code-Plan):

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

Sie können einen beliebigen Strom passieren, sei es ein Filestream, ein Memorystream (nützlich, wenn die PDF von Datenbanken, keine Notwendigkeit für temporäre Dateien zu lesen, etc.)

Verwendungsbeispiel:

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

Dies funktionierte perfekt für den Versuch, zwei PDF-Dokumente mit Formularfelder zu verbinden/anzuhängen! Viel einfacher auch! Vielen Dank. –

+0

Das hat super für mich funktioniert. Ich würde vorschlagen, dass Sie nach dem copy.AddDocument-Aufruf source.Close() aufrufen, um zu ermöglichen, dass die Datei an anderer Stelle bearbeitet wird. – Jason

Verwandte Themen