2012-07-25 25 views
5

¿Cómo agregué correctamente las páginas de un archivo PDF en disco existente a un documento PDF en memoria generado actualmente?Agregar un PDF existente del archivo a un documento no escrito utilizando iTextSharp

Tenemos una clase que produce un documento PDF utilizando iTextSharp. Esto funciona bien En el momento en que añadir Términos & Condiciones como una imagen en la última página:

this.nettPriceListDocument.NewPage(); 
this.currentPage++; 
Image logo = Image.GetInstance("/inetpub/Applications/Trade/Reps/images/TermsAndConditions.gif"); 
logo.SetAbsolutePosition(0, 0); 
logo.ScaleToFit(this.nettPriceListDocument.PageSize.Width, this.nettPriceListDocument.PageSize.Height); 
this.nettPriceListDocument.Add(logo); 

tengo esta imagen como un documento PDF y preferiría añadirlo. Si puedo resolver esto, sería posible agregar otros documentos PDF que podamos necesitar a lo que estoy generando.

que he intentado:

string tcfile = "/inetpub/Applications/Trade/Reps/images/TermsAndConditions.pdf"; 
PdfReader reader = new PdfReader(tcfile); 
PdfWriter writer = PdfWriter.GetInstance(this.nettPriceListDocument, this.nettPriceListMemoryStream); 
PdfContentByte content = writer.DirectContentUnder; 
for (int pageno = 1; pageno < reader.NumberOfPages + 1; pageno++) 
{ 
    this.nettPriceListDocument.NewPage(); 
    this.currentPage++; 
    PdfImportedPage newpage = writer.GetImportedPage(reader, pageno); 
    content.AddTemplate(newpage, 1f, 1f); 
} 

lo que se traduce en un "documento no abrir" excepción en el writer.DirectContentUnder

También he intentado:

string tcfile = "/inetpub/Applications/Trade/Reps/images/TermsAndConditions.pdf"; 
PdfReader reader = new PdfReader(tcfile); 
PdfConcatenate concat = new PdfConcatenate(this.nettPriceListMemoryStream); 
concat.AddPages(reader); 

lo que resulta en la inserción de una página en blanco, de tamaño extraño sobre la primera página habitual del documento.

También he intentado:

string tcfile = "/inetpub/Applications/Trade/Reps/images/TermsAndConditions.pdf"; 
PdfReader reader = new PdfReader(tcfile); 
PdfCopy copier = new PdfCopy(nettPriceListDocument, nettPriceListMemoryStream); 
for (int pageno = 1; pageno < reader.NumberOfPages + 1; pageno++) 
{ 
    this.currentPage++; 
    PdfImportedPage newpage = copier.GetImportedPage(reader, pageno); 
    copier.AddPage(newpage); 
} 
copier.Close(); 
reader.Close(); 

lo que se traduce en una NullReferenceException en copier.AddPage(newpage).

También he intentado:

string tcfile = "/inetpub/Applications/Trade/Reps/images/TermsAndConditions.pdf"; 
PdfReader reader = new PdfReader(tcfile); 
PdfCopyFields copier = new PdfCopyFields(nettPriceListMemoryStream); 
copier.AddDocument(reader); 

Esto también se traduce en una NullReferenceException en copier.AddDocument(reader).

Tengo la mayoría de estas ideas de varias preguntas y respuestas de StackOverflow. Una cosa con la que nadie parecía tratar, es agregar páginas nuevas de un archivo PDF existente a un documento en memoria ya existente que aún no se ha escrito en un archivo PDF en el disco. Este documento ya se ha abierto y tiene páginas de datos escritas en él. Si dejo estos Términos & Procedimiento de condiciones, o simplemente lo escribo es una imagen (como originalmente), el PDF resultante sale bien.

Para terminar, como comencé: ¿Cómo agrego correctamente la (s) página (s) de un archivo PDF en disco existente a un documento PDF en memoria generado actualmente?

Gracias y aprecio de antemano por sus reflexiones sobre esto. Por favor, avíseme si puedo proporcionar más información.

Respuesta

7

Aquí hay un método de combinación simple que copia archivos PDF en un PDF. Utilizo este método bastante a menudo al combinar pdfs. Lo he usado para combinar páginas de diferentes tamaños sin problemas. Espero eso ayude.

public MemoryStream MergePdfForms(List<byte[]> files) 
{ 
    if (files.Count > 1) 
    { 
     PdfReader pdfFile; 
     Document doc; 
     PdfWriter pCopy; 
     MemoryStream msOutput = new MemoryStream(); 

     pdfFile = new PdfReader(files[0]); 

     doc = new Document(); 
     pCopy = new PdfSmartCopy(doc, msOutput); 

     doc.Open(); 

     for (int k = 0; k < files.Count; k++) 
     { 
      pdfFile = new PdfReader(files[k]); 
      for (int i = 1; i < pdfFile.NumberOfPages + 1; i++) 
      { 
       ((PdfSmartCopy)pCopy).AddPage(pCopy.GetImportedPage(pdfFile, i)); 
      } 
      pCopy.FreeReader(pdfFile); 
     } 

     pdfFile.Close(); 
     pCopy.Close(); 
     doc.Close(); 

     return msOutput; 
    } 
    else if (files.Count == 1) 
    { 
     return new MemoryStream(files[0]); 
    } 

    return null; 
} 
+0

Gracias @Jonathan, ¿qué pasa si no puedo llamar a 'Document.Open()' porque el documento ya estaba abierto y ya se le han agregado muchos elementos? – Troy

+0

@Nevyn Debería poder cerrar el documento y luego volverlo a abrir mediante el proceso de fusión. Todo lo que tendría que hacer es cerrar el documento y luego pasar las matrices de bytes de sus documentos al método de combinación que devolverá una secuencia de memoria de su nuevo documento fusionado. – Jonathan

Cuestiones relacionadas