2011-02-14 20 views
16

Estoy tratando de combinar varios archivos PDF en un solo archivo PDF. Los PDF provienen de SSRS, de algunos LocalReports que procesé. Estoy usando PDFSharp, porque ya se usa en todo el proyecto. Sin embargo, los métodos outputDocument.addPage (página) arrojan una excepción InvalidOperationException ("No se puede cambiar el documento."). He probado muchos forma diferente de hacer esto, pero no puedo conseguir que funcione ...Combinación de varios archivos PDF usando PDFSharp

Aquí mi método, donde ya se han comprobado todas las entradas:

private static void saveFile(string fileName, params byte[][] bytes) 
{ 
    try 
    { 
     PdfDocument outputDocument = new PdfDocument(); 
     for (int i = 0; i < bytes.Length; i++) 
     { 
      using (MemoryStream stream = new MemoryStream(bytes[i])) 
      { 
       PdfDocument inputDocument = PdfReader.Open(stream, PdfDocumentOpenMode.Import); 
       foreach (PdfPage page in inputDocument.Pages) 
       { 
        outputDocument.AddPage(page); //throws the exception !!! 
       } 
      } 
     } 
     outputDocument.Save(fileName); 
    } 
    catch (Exception ex) 
    { 
     throw new Exception("Erreur lors de l'enregistrement du fichier", ex); 
    } 
} 

A partir de los ejemplos que vi en la web, esta parece ser la forma correcta de hacer esto ... Estoy abierto a otras sugerencias para fusionar mis archivos PDF, pero preferiría no utilizar otra biblioteca de terceros, como ITextSharp, porque PDFSharp ya se usa en el proyecto.

Si es importante, estoy usando VS2010 Pro en una máquina Win7.

EDIT: Pila de llamadas de la excepción:
en PdfSharp.Pdf.PdfObject.set_Document (valor PdfDocument)
en PdfSharp.Pdf.PdfObject.ImportClosure (PdfImportedObjectTable importedObjectTable, dueño PdfDocument, PdfObject externalObject)
en PdfSharp.Pdf.PdfPages.CloneElement (página PdfPage, PdfPage importPage, String key, deepcopy booleana)
en PdfSharp.Pdf.PdfPages.ImportExternalPage (PdfPage importPage)
en PdfSharp.Pdf.PdfPages.Insert (índice Int32, PdfPage página)
a t PdfSharp.Pdf.PdfPages.Add (página PdfPage)
en PdfSharp.Pdf.PdfDocument.AddPage (página PdfPage)
en Something.saveFile (String nombre de fichero, byte [] [] bytes)

¿Es el problema yo ? ¿No es así como se supone que se debe hacer esto? ¿O existe alguna otra forma de combinar múltiples LocalReport en un solo PDF?

+0

InvalidOperationException –

+0

¿Podrían presentar una pila de llamadas de la excepción? – asgerhallas

+0

Acabo de probar su código con la compilación más reciente de PDFSharp y funciona para mí. Genera muchas páginas y no arroja. ¿Podrías probar con otro conjunto de archivos PDF de entrada? – asgerhallas

Respuesta

6

He llegado a creer que pueden ser los archivos PDF de entrada que son corruptos o ilegibles para PDFSharp. Hay varios ejemplos de archivos PDF de SSRS que no se pueden leer en las bibliotecas de PDF o incluso en Adobe Reader. Por ejemplo aquí:

http://www.sqldev.org/sql-server-reporting-services/export-pdf-in-ssrs-2008-vs-ssrs-2005--pdf-is-different-wont-work-with-itextsharp-possibly-other-13968.shtml

... y aquí:

https://stackoverflow.com/questions/2393175/ssrs-2008-pdf-files-cannot-be-opened

... Y lo más importante en el foro PDFsharp:

http://forum.pdfsharp.net/viewtopic.php?f=2&t=674

Pongo "No sé si este es el error que está encontrando, el mensaje es extraño", pero parece probable que tenga algo que ver con eso, cuando se toma en consideración que la muestra de código funciona sin problemas con cualquier PDF que probé (no tengo ningún SQL Server Reports para probar, sin embargo)

+2

Los archivos PDF comprimidos son un buen ejemplo de archivos PDF no legibles por PDFSharp ... es por eso que no puede leer archivos PDF de SSRS 2008 y lee archivos SSRS 2005 sin problemas ... Sin embargo, no lo haría ¿Genera la excepción en la línea arriba del bucle foreach si ese era el problema aquí? –

+0

Yo también lo pensaría así. Es un mensaje y ubicación peculiar si solo es compresión. Creo que durante el Open() algo se configura mal, de modo que cuando ocurre la clonación de la página, falla. Pero eso lleva a que pueda ser algo más que compresión que es "corrupto". – asgerhallas

1

Antes que nada, gracias por tu retroalimentación. El problema no proviene de la compresión porque tengo <humanreadalble> verdadero </humanreadable> en la cadena de información de mi dispositivo, de lo contrario PDFSharp simplemente no puede ver nada en el PDF.

Intenté recompilar PDFSharp desde el último código fuente, y funcionó ... Ya no lanza la excepción. Lo extraño es que revisé la versión de mi dll y era la misma que la última versión. Tal vez arreglaron algo sin incrementar la versión?

De todos modos, gracias por su ayuda. Acepté tu publicación como la respuesta para mostrar mi agradecimiento.

2

No estoy seguro de mi respuesta. Por favor léame.

http://www.go4coding.com/post/2011/05/26/Merging-PDF-files-into-single-PDF-in-CSharp-using-PDFSharp.aspx

private static void MergeMultiplePDFIntoSinglePDF(string outputFilePath, string[] pdfFiles) 
     { 
      Console.WriteLine("Merging started....."); 
      PdfDocument outputPDFDocument = new PdfDocument(); 
      foreach (string pdfFile in pdfFiles) 
      { 
       PdfDocument inputPDFDocument = PdfReader.Open(pdfFile, PdfDocumentOpenMode.Import); 
       outputPDFDocument.Version = inputPDFDocument.Version; 
       foreach (PdfPage page in inputPDFDocument.Pages) 
       { 
        outputPDFDocument.AddPage(page); 
       } 
      } 
      outputPDFDocument.Save(outputFilePath); 
      Console.WriteLine("Merging Completed"); 
     } 
Cuestiones relacionadas