¿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.
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
@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