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 ());