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
implementaIDisposable
, así que incluya una declaraciónusing
. - La declaración de
using
PdfStamper
se encarga de desechar el objeto, por lo que no necesita llamar aClose()
, y no necesita establecer la propiedadCloseStream
. - Su fragmento de código está devolviendo la matriz de bytes demasiado pronto , dentro de la declaración
PdfStamper
using
, por lo que suMemoryStream
es efectivamente un no-op. Devuelva la matriz de bytes fuera de la declaraciónPdfStamper
using
, y dentro de la declaraciónMemoryStream
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?