2016-05-09 4 views
1

Ich habe eine Liste der PDF als list<byte[]> gespeichert. Ich versuche, alle diese PDF-Dateien mit PDFsharp zu verketten, aber nach meiner Operation bekomme ich ein PDF mit der richtigen Seitenzahl, aber alle Seiten sind leer. Sieht so aus, als ob ich einen Header oder etwas verloren habe, aber ich kann nicht finden wo.Verknüpfen von PDF mit PDFsharp gibt leere PDF

Mein Code:

 PdfDocument output = new PdfDocument(); 
     try 
     { 
      foreach (var report in reports) 
      { 
       using (MemoryStream stream = new MemoryStream(report)) 
       { 

        PdfDocument input = PdfReader.Open(stream, PdfDocumentOpenMode.Import); 

        foreach (PdfPage page in input.Pages) 
        { 
         output.AddPage(page); 
        } 
       } 
      } 


      if (output.Pages.Count <= 0) 
      { 
       throw new Exception("Empty Document"); 
      } 
      MemoryStream final = new MemoryStream(); 
      output.Save(final); 
      output.Close(); 
      return final.ToArray(); 
     } 
     catch (Exception e) 
     { 
      throw new Exception(e.ToString()); 
     } 

ich es als byte[] zurückkehren wollen, weil ich sie später zu verwenden:

return File(report, System.Net.Mime.MediaTypeNames.Application.Octet, "test.pdf");

Das gibt PDF mit der richtigen Seitenzahl, aber alle leer.

+0

Funktioniert output.Save (Dateiname); Arbeit? –

+0

Erhalten Sie eine korrekte Datei, wenn Sie in einer Datei speichern? Wenn nicht, dann gibt es vielleicht ein Problem mit den importierten PDF-Dateien. Wenn ja, könnte das Problem mit dem von Ihnen verwendeten MemoryStream sein (es wird zweimal geschlossen, bevor Sie ToArray aufrufen - und ohne Debugger kann ich nicht sagen, ob das ein Problem ist). Ohne MCVE werde ich nicht versuchen, dein Problem zu beheben. –

+0

Wenn ich nur eine der PDF-Dateien ohne PDFSharp zurückschicke funktioniert es einwandfrei. Wenn ich PDFSharp verwende, um 6 pdf mit einer Seite zu verketten, bekomme ich 1 pdf mit 6 Seiten als Ergebnis, aber alle Seiten sind leer. – Aht

Antwort

2

Sie sagen, in einem Kommentar, dass die Dateien von SSRS kommen.

Ältere Versionen von PDFsharp erfordern eine spezielle SSRS Einstellung:

Für den DeviceSettings Parameter für die Render-Methode auf dem ReportExecutionService Objekt, geben Sie diesen Wert:

theDeviceSettings = "<DeviceInfo><HumanReadablePDF>True</HumanReadablePDF></DeviceInfo>"; 

Quelle:
http://forum.pdfsharp.net/viewtopic.php?p=1613#p1613

+0

Dank ich schalte Version von PDFSharp Form 1.32 zu 1.50 Beta_3B um und es funktioniert jetzt. Ich glaube, wenn ich diese Einstellung hinzufüge und ältere Version verwende, werde ich auch arbeiten. Danke für Ihre Hilfe. Ich habe nicht erwartet, dass der Ersteller von DLL versuchen wird, mir zu helfen. Tolle Möglichkeit, das Produkt zu unterstützen :) Danke nochmal :) – Aht

-1

I iTextSharp verwenden, in diesem saple Code aussehen (es funktioniert)

public static byte[] PdfJoin(List<String> pdfs) 
    { 
     byte[] mergedPdf = null; 
     using (MemoryStream ms = new MemoryStream()) 
     { 
      using (iTextSharp.text.Document document = new iTextSharp.text.Document()) 
      { 
       using (iTextSharp.text.pdf.PdfCopy copy = new iTextSharp.text.pdf.PdfCopy(document, ms)) 
       { 
        document.Open(); 

        for (int i = 0; i < pdfs.Count; ++i) 
        { 
         iTextSharp.text.pdf.PdfReader reader = new iTextSharp.text.pdf.PdfReader(pdfs[i]); 
         // loop over the pages in that document 
         int n = reader.NumberOfPages; 
         for (int page = 0; page < n;) 
         { 
          copy.AddPage(copy.GetImportedPage(reader, ++page)); 
         } 
        } 
       } 
      } 
      mergedPdf = ms.ToArray(); 
     } 
     return mergedPdf; 
    } 




public static byte[] PdfJoin(List<byte[]> pdfs) 
    { 
     byte[] mergedPdf = null; 
     using (MemoryStream ms = new MemoryStream()) 
     { 
      using (iTextSharp.text.Document document = new iTextSharp.text.Document()) 
      { 
       using (iTextSharp.text.pdf.PdfCopy copy = new iTextSharp.text.pdf.PdfCopy(document, ms)) 
       { 
        document.Open(); 

        for (int i = 0; i < pdfs.Count; ++i) 
        { 
         iTextSharp.text.pdf.PdfReader reader = new iTextSharp.text.pdf.PdfReader(pdfs[i]); 
         // loop over the pages in that document 
         int n = reader.NumberOfPages; 
         for (int page = 0; page < n;) 
         { 
          copy.AddPage(copy.GetImportedPage(reader, ++page)); 
         } 
        } 
       } 
      } 
      mergedPdf = ms.ToArray(); 
     } 
     return mergedPdf; 
    } 
+0

Wahrscheinlich haben Sie Recht, aber ich kann iText nicht benutzen (das ist Buchungskreis, also muss ich PDFSharp verwenden) – Aht