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