2016-07-12 3 views
3

Ich bin neu mit iTextSharp und Arbeiten mit PDF-Dateien im Allgemeinen, aber ich denke, ich bin auf dem richtigen Weg.C# iTextSharp Merge mehrere pdf über Byte-Array

Ich iteriere durch eine Liste von PDF-Dateien, wandle sie in Bytes um und schiebe alle resultierenden Bytes in ein Byte-Array. Von dort übergebe ich das Byte-Array an concatAndAddContent(), um alle PDF-Dateien zu einer einzigen großen PDF-Datei zusammenzuführen. Zur Zeit bin ich nur die letzte pdf in der Liste bekommen (sie scheinen zu überschreiben werden)

public static byte[] concatAndAddContent(List<byte[]> pdfByteContent) 
    { 
     byte[] allBytes; 

     using (MemoryStream ms = new MemoryStream()) 
     { 
      Document doc = new Document(); 
      PdfWriter writer = PdfWriter.GetInstance(doc, ms); 

      doc.SetPageSize(PageSize.LETTER); 
      doc.Open(); 
      PdfContentByte cb = writer.DirectContent; 
      PdfImportedPage page; 

      PdfReader reader; 
      foreach (byte[] p in pdfByteContent) 
      { 
       reader = new PdfReader(p); 
       int pages = reader.NumberOfPages; 

       // loop over document pages 
       for (int i = 1; i <= pages; i++) 
       { 
        doc.SetPageSize(PageSize.LETTER); 
        doc.NewPage(); 
        page = writer.GetImportedPage(reader, i); 
        cb.AddTemplate(page, 0, 0); 

       } 
      } 

      doc.Close(); 
      allBytes = ms.GetBuffer(); 
      ms.Flush(); 
      ms.Dispose(); 
     } 

     return allBytes; 
    } 

über den Arbeitscode ist, die in einem einzigen pdf-Ergebnisse zu schaffen, und der Rest der Dateien ignoriert werden. Irgendwelche Vorschläge

+0

Mögliche Duplikat [Zusammenführen mehrerer PDF-Dateien iTextSharp in C# .NET] (http://stackoverflow.com/questions/6029142/merging-multiple-pdfs-using-itextsharp-in-c-net) –

+0

Sind Sie sicher, dass die pdfByteContent-Liste mehr als ein Byte-Array enthält? Können wir den Code sehen, mit dem Sie die Funktion aufrufen? –

+0

Ich weiß nicht, ob es Ihr Problem löst, aber es scheint nicht so, als müssten Sie Dispose und Flush verwenden. Ihr "using" -Block wird automatisch beim Verlassen entsorgt. Siehe http://stackoverflow.com/questions/21230314/c-sharp-flushing-streamwriter-and-a-memorystream. Die Flush-Methode wird außer Kraft gesetzt, um nichts für die MemoryStream-Klasse zu tun (sie wird von der Stream-Klasse geerbt, siehe https://msdn.microsoft.com/en-us/library/system.io.memorystream.flush(v=vs). 110) .aspx). –

Antwort

15

Dies ist so ziemlich nur eine C# -Version von Bruno's code here.

Dies ist so ziemlich die einfachste, sicherste und empfohlene Methode zum Zusammenführen von PDF-Dateien. Das Objekt kann Redundanzen in mehreren Dateien erkennen, wodurch die Dateigröße einige Male verringert werden kann. Eine der Überladungen akzeptiert ein vollständiges Objekt PdfReader, das beliebig instanziiert werden kann.

public static byte[] concatAndAddContent(List<byte[]> pdfByteContent) { 

    using (var ms = new MemoryStream()) { 
     using (var doc = new Document()) { 
      using (var copy = new PdfSmartCopy(doc, ms)) { 
       doc.Open(); 

       //Loop through each byte array 
       foreach (var p in pdfByteContent) { 

        //Create a PdfReader bound to that byte array 
        using (var reader = new PdfReader(p)) { 

         //Add the entire document instead of page-by-page 
         copy.AddDocument(reader); 
        } 
       } 

       doc.Close(); 
      } 
     } 

     //Return just before disposing 
     return ms.ToArray(); 
    } 
} 
+0

Testen Sie dies jetzt - ich habe noch nie versucht, Typen innerhalb einer using-Anweisung zu übergeben, und bekomme derzeit einen Fehler "Typ in einer Verwendung Anweisung muss mich implizit in SystemIDisposible umwandelbar" Auch wo haben Sie Dokumentation/Verwendung von Kopie gefunden. Adddocument() - es scheint, als ob PdfSmartCopy keine Definition dafür enthält. – confusedandamused

+0

Verwenden Sie iTextSharp 4.1.6? Wenn dem so ist, wird dieser Code nicht funktionieren. –

+0

Ah Ich war auf 4.x aktualisiert, und der Funktionsaufruf funktionierte. Momentan scheint es immer noch jedes PDF zu überschreiben, das ich über die Bytes übergebe - könnte das daran liegen, wie ich das Byte-Array übergebe? Ich nehme im Wesentlichen jede pdf, sie in Bytes umwandelt und sie alle in eine Liste (die zufällig pdfByteContent ist) Beim Aufrufen von Datei.WriteallBytes() jedesmal, wenn ich das Überschreiben auch sehe. – confusedandamused