ejemplos c# pdf itext memorystream pdfstamper

ejemplos - Cómo hacer que PdfStamper funcione con MemoryStreams(c#, itextsharp)



itextsharp c# ejemplos (1)

No es específico de su código de firma, pero cuando trabaje con MemoryStream y PdfStamper , siga este patrón general:

using (MemoryStream ms = new MemoryStream()) { using (PdfStamper stamper = new PdfStamper(reader, ms, ''/0'', true)) { // do stuff } return ms.ToArray(); }

  • MemoryStream implementa IDisposable , así que incluya una declaración using .
  • La declaración de using PdfStamper se encarga de desechar el objeto, por lo que no necesita llamar a Close() , y no necesita establecer la propiedad CloseStream .
  • Su fragmento de código está devolviendo la matriz de bytes demasiado pronto , dentro de la declaración PdfStamper using , por lo que su MemoryStream es efectivamente un no-op. Devuelva la matriz de bytes fuera de la declaración PdfStamper using , y dentro de la declaración MemoryStream using .
  • En general, no es necesario restablecer la propiedad Position MemoryStream .
  • Ignore el constructor PdfStamper arriba: es de un código de prueba que tenía para rellenar formularios y use el constructor / método que necesite para firmar.

Se me ocurrió volver a trabajar el código antiguo que firma los archivos PDF en uno nuevo, que firma los MemoryStreams (arrays de bytes) que vienen y son enviados por los servicios web. Simple, ¿verdad? Bueno, eso fue ayer. Hoy simplemente no puedo hacerlo funcionar.

Este es el código antiguo, que usa FileStreams y funciona:

public static string OldPdfSigner(PdfReader pdfReader, string destination, string password, string reason, string location, string pathToPfx) { using (FileStream pfxFile = new FileStream(pathToPfx, FileMode.Open, FileAccess.Read)) { ... using (PdfStamper st = PdfStamper.CreateSignature(pdfReader, new FileStream(destination, FileMode.Create, FileAccess.Write), ''/0'')) { PdfSignatureAppearance sap = st.SignatureAppearance; sap.SetCrypto(key, chain, null, PdfSignatureAppearance.WINCER_SIGNED); sap.Reason = reason; sap.Location = location; return destination; } } }

A continuación, se muestra lo que he hecho de nuevo, que arroja System.ObjectDisposedException: no se puede acceder a una secuencia cerrada.

public static byte[] PdfSigner(PdfReader pdfReader, string password, string reason, string location, string pathToPfx) { using (FileStream pfxFile = new FileStream(pathToPfx, FileMode.Open, FileAccess.Read)) { ... MemoryStream outputStream = new MemoryStream(); using (PdfStamper st = PdfStamper.CreateSignature(pdfReader, outputStream, ''/0'')) { st.Writer.CloseStream = false; PdfSignatureAppearance sap = st.SignatureAppearance; sap.SetCrypto(key, chain, null, PdfSignatureAppearance.WINCER_SIGNED); sap.Reason = reason; sap.Location = location; st.Close(); outputStream.Position = 0; return outputStream.ToArray(); } } }

y si comento fuera

st.Close();

crea un documento vacío. ¿Qué estoy haciendo mal?