para net lowagie examples example ejemplos c#-4.0 merge itext memorystream

c#-4.0 - net - itextsharp examples



Fusionar flujos de memoria en un documento iText (2)

La PDF header signature not found error PDF header signature not found se puede arreglar en este caso al volver a establecer la Position la secuencia en 0 . Como no obtiene el error Cannot access a closed Stream PdfWriter que ya está configurando correctamente PdfWriter del CloseStream en false .

A continuación se muestra una aplicación WinForm completa C # 2010 que se dirige a iTextSharp 5.1.1.0 que crea tres archivos PDF en MemoryStreams y los combina. Como no tengo un servidor web a mano, los estoy escribiendo en el disco.

using System; using System.Text; using System.Windows.Forms; using System.IO; using iTextSharp.text; using iTextSharp.text.pdf; namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { //Create three MemoryStreams MemoryStream[] streams = { CreateDoc("Page 1"), CreateDoc("Page 2"), CreateDoc("Page 3") }; //I don''t have a web server handy so I''m going to write my final MemoryStream to a byte array and then to disk byte[] bytes; //Create our final combined MemoryStream using (MemoryStream finalStream = new MemoryStream()) { //Create our copy object PdfCopyFields copy = new PdfCopyFields(finalStream); //Loop through each MemoryStream foreach (MemoryStream ms in streams) { //Reset the position back to zero ms.Position = 0; //Add it to the copy object copy.AddDocument(new PdfReader(ms)); //Clean up ms.Dispose(); } //Close the copy object copy.Close(); //Get the raw bytes to save to disk bytes = finalStream.ToArray(); } //Write out the file to the desktop string outputFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "Combined.pdf"); using (FileStream fs = new FileStream(outputFile, FileMode.Create, FileAccess.Write, FileShare.None)) { fs.Write(bytes, 0, bytes.Length); } this.Close(); } /// <summary> /// Helper method to create temporary documents /// </summary> private MemoryStream CreateDoc(string name) { MemoryStream ms = new MemoryStream(); using (Document doc = new Document(PageSize.LETTER)) { using (PdfWriter writer = PdfWriter.GetInstance(doc, ms)) { writer.CloseStream = false; doc.Open(); doc.Add(new Paragraph(name)); doc.Close(); } } return ms; } } }

Tengo cuatro MemoryStreams de datos que deseo fusionar y luego abro el pdfDocument, sin crear un solo archivo.

Es posible escribirlos en los archivos y luego fusionarlos, pero eso sería una mala práctica y eso también puede causar algunos problemas, así que quiero evitar eso.

Sin embargo, no puedo encontrar una manera de combinar MemoryStreams con iText5 para .NET.

En este momento, así es como lo hago con los archivos:

private static void ConcatenateDocuments() { var stream = new MemoryStream(); var readerFrontPage = new PdfReader(Folder + FrontPageName); var readerDocA = new PdfReader(Folder + docA); var readerDocB = new PdfReader(Folder + DocB); var readerAppendix = new PdfReader(Folder + Appendix); var pdfCopyFields = new PdfCopyFields(stream); pdfCopyFields.AddDocument(readerFrontPage); pdfCopyFields.AddDocument(readerDocA ); pdfCopyFields.AddDocument(readerDocB); pdfCopyFields.AddDocument(readerAppendix); pdfCopyFields.Close(); SavePdf(stream, FilenameReport); }

Como necesito eliminar el uso de archivos, guardo los de MemoryStream, ya que las diferentes partes se crean a partir de diferentes recursos. Así que tengo referencias a estos flujos de memoria.

¿Cómo puede hacerse esto?


Mientras que el PdfReader no puede tomar la transmisión, la matriz de la transmisión funciona.

var readerFrontPage = new PdfReader (streamFrontPage.ToArray ());