asp.net - PdfStamper.CreateSignature and empty MemoryStream -
using itextsharp 5.3.4.0, i'm having difficulty working pdfstamper , memorystream.
the memorystream empty.
pdfreader pdfreader = new pdfreader(server.mappath(@"document.pdf")); memorystream memorystream = new memorystream(); pdfstamper pdfstamper = pdfstamper.createsignature(pdfreader, memorystream, '\0'); //... pdfstamper.writer.closestream = false; pdfstamper.close(); byte[] bt = memorystream.getbuffer(); //.toarray() pdfreader.close(); download project (full source code)
how can solve problem? thank you!
in default.aspx.cs relevant left out in code block of question:
pdfstamper pdfstamper = pdfstamper.createsignature(pdfreader, memorystream, '\0'); pdfsignatureappearance pdfsignatureappearance = pdfstamper.signatureappearance; //... pdfsignatureappearance.preclose(exc); //... pdfstamper.writer.closestream = false; pdfstamper.close(); whenever call pdfsignatureappearance.preclose, must use pdfsignatureappearance.close, not pdfstamper.close, cf. method documentations:
/** * first method called when using external signatures. general sequence is: * preclose(), getdocumentbytes() , close(). * <p> * if calling preclose() <b>dont't</b> call pdfstamper.close(). * <p> * <code>exclusionsizes</code> must contain @ least * <code>pdfname.contents</code> key size take in * document. note due hex string coding size should * byte_size*2+2. * @param exclusionsizes <code>hashmap</code> names , sizes excluded in signature * calculation. key <code>pdfname</code> , value * <code>integer</code>. @ least <code>pdfname.contents</code> must present * @throws ioexception on error * @throws documentexception on error */ public void preclose(dictionary<pdfname, int> exclusionsizes) { (from pdfsignatureappearance.cs)
/** * closes document. no more content can written after * document closed. * <p> * if closing signed document external signature closing must done * in <code>pdfsignatureappearance</code> instance. * @throws documentexception on error * @throws ioexception on error */ public void close() { (from pdfstamper.cs)
the reason when create pdfstamper using createsignature(pdfreader, memorystream, '\0'), stamper not write memory stream instead internal bytebuffer (this required eventual signature creation , integration). no sooner during pdfsignatureappearance.close content of bytebuffer written memory stream.
furthermore see using
byte[] bt = memorystream.getbuffer(); please don't! unless sure interpreting buffer contents correctly (which may contain additional trash data), please use
byte[] bt = memorystream.toarray(); instead.
Comments
Post a Comment