2011-06-16 35 views
6

El siguiente fragmento de código devuelve un documento PDF corrupto; sin embargo, si devuelvo mergedDocument, siempre devuelve un PDF válido. mergedDocument se basa en un archivo PDF que creé usando Word, mientras que el documento completo se genera completamente por programación. El código "funciona" porque no arroja excepciones. ¿Por qué iTextSharp está creando un PDF corrupto?iTextSharp está produciendo un PDF corrupto

byte[] completedDocument = null;    
using (MemoryStream streamCompleted = new MemoryStream()) 
{ 
    using (Document document = new Document()) 
    {      
     PdfCopy copy = new PdfCopy(document, streamCompleted); 
     document.Open(); 
     copy.Open();      

     foreach (var item in eventItems) 
     { 
      byte[] mergedDocument = null; 
      PdfReader reader = new PdfReader(pdfTemplates[item.DataTokens[NotifyTokenType.OrganisationID]]); 
      using (MemoryStream streamTemplate = new MemoryStream()) 
      { 
       using (PdfStamper stamper = new PdfStamper(reader, streamTemplate)) 
       { 
        foreach (var token in item.DataTokens) 
        { 
         if (stamper.AcroFields.Fields.Any(fld => fld.Key == token.Key.ToString())) 
         { 
          stamper.AcroFields.SetField(token.Key.ToString(), token.Value); 
         } 
        } 
        stamper.FormFlattening = true; 
        stamper.Writer.CloseStream = false; 
       } 

       mergedDocument = new byte[streamTemplate.Length]; 
       streamTemplate.Position = 0; 
       streamTemplate.Read(mergedDocument, 0, (int)streamTemplate.Length); 
      } 
      reader = new PdfReader(mergedDocument); 

      for (int i = 1; i <= reader.NumberOfPages; i++) 
      { 
       document.SetPageSize(PageSize.A4); 
       copy.AddPage(copy.GetImportedPage(reader, i)); 
      } 
     } 
     completedDocument = new byte[streamCompleted.Length]; 
     streamCompleted.Position = 0; 
     streamCompleted.Read(completedDocument, 0, (int)streamCompleted.Length); 
    }     
} 
return completedDocument; 

Respuesta

20

que necesita para cerrar los documentcopy y objetos para vaciar el búfer de escritura PDF. Esto, sin embargo, causa algunos problemas al intentar leer la secuencia en una matriz. La solución para eso es utilizar el método ToArray() del MemoryStream que aún funciona en transmisiones cerradas. Los cambios que hice tienen comentarios sobre ellos.

 byte[] completedDocument = null; 
     using (MemoryStream streamCompleted = new MemoryStream()) 
     { 
      using (Document document = new Document()) 
      { 
       PdfCopy copy = new PdfCopy(document, streamCompleted); 
       document.Open(); 
       copy.Open(); 

       foreach (var item in eventItems) 
       { 
        byte[] mergedDocument = null; 
        PdfReader reader = new PdfReader(pdfTemplates[item.DataTokens[NotifyTokenType.OrganisationID]]); 
        using (MemoryStream streamTemplate = new MemoryStream()) 
        { 
         using (PdfStamper stamper = new PdfStamper(reader, streamTemplate)) 
         { 
          foreach (var token in item.DataTokens) 
          { 
           if (stamper.AcroFields.Fields.Any(fld => fld.Key == token.Key.ToString())) 
           { 
            stamper.AcroFields.SetField(token.Key.ToString(), token.Value); 
           } 
          } 
          stamper.FormFlattening = true; 
          stamper.Writer.CloseStream = false; 
         } 
         //Copy the stream's bytes 
         mergedDocument = streamTemplate.ToArray(); 
        } 
        reader = new PdfReader(mergedDocument); 

        for (int i = 1; i <= reader.NumberOfPages; i++) 
        { 
         document.SetPageSize(PageSize.A4); 
         copy.AddPage(copy.GetImportedPage(reader, i)); 
        } 
        //Close the document and the copy 
        document.Close(); 
        copy.Close(); 
       } 
       //ToArray() can operate on closed streams 
       completedDocument = streamCompleted.ToArray(); 
      } 
     } 
     return completedDocument; 
+2

Muchas gracias, que hizo el truco. –

+0

Yo votaría esto 1000 veces si pudiera. Estaba teniendo dificultades para fusionar imágenes y archivos PDF en un único documento pdf, esto ayudó a arrojar algo de luz sobre el proceso correcto. – jtiger

+0

¡Gracias, al poner la secuencia de la memoria en la matriz resolvió mi problema al recuperar un archivo PDF vacío! – Taurib

0

También asegúrese de que su HTML no contiene la etiqueta hr, mientras que la conversión de HTML a PDF

hdnEditorText.Value.Replace("\"", "'").Replace("<hr />", "").Replace("<hr/>", "") 
+0

¿Por qué? ¿Qué pasa con tener una etiqueta hr? – Kevin

Cuestiones relacionadas