c# - PDF File is damaged and cannot be repaired when moving memory stream to filestream -


i using itextsharp vb.net stamp images onto pdf documents. (since not language specific tagged c#, too.) have 2 applications using process.

  • the first uses bytes memorystream display pdf documents online. piece working.

  • the second uses same function instead saves pdf file. piece generates invalid pdf.

i have seen similar questions, creating document , have document object in code. memory streams corrupt outset. code not have document object , original memory stream opens fine.

here place error: (i have put buffer m new memory stream because stamper in fillpdf function defaults closing stream unless marked otherwise.)

dim m memorystream = pdfhelper.fillpdf(filename, nothing, markers, "") dim m2 new memorystream(m.getbuffer, 0, m.getbuffer.length) dim f filestream = new filestream("c:\temp.pdf", filemode.create) m2.copyto(f, m.getbuffer.length) m2.close() f.close() 

here 1 of ways use on website. 1 not use images, although other similar successful places use images on multiple documents merged together.

dim m system.io.memorystream = pdfhelper.fillpdf(filename, new dictionary(of string, string), new list(of pdfhelper.pdfimage), "sample") dim data byte() = m.getbuffer response.clear()  //send file output stream response.buffer = true  //try , ensure browser opens file , doesn’t prompt “open/save”. response.addheader("content-length", data.length.tostring()) response.addheader("content-disposition", "inline; filename=" + "sample") response.addheader("expires", "0") response.addheader("pragma", "cache") response.addheader("cache-control", "private")  //set output stream correct content type (pdf). response.contenttype = "application/pdf" response.addheader("accept-ranges", "bytes")  //output file response.binarywrite(data)  //flushing response display serialized data client browser. response.flush()  try     response.end() catch ex exception     throw ex end try 

here function in utility class (pdfhelper.fillpdf)

  public shared function fillpdf(filetofill string, optional fieldvalues dictionary(of string, string) = nothing, optional images list(of pdfimage) = nothing, optional watermarktext string = "") memorystream          dim m memorystream = new memorystream() // storing pdf         dim reader pdfreader = new pdfreader(filetofill) // reading document         dim outstamper pdfstamper = new pdfstamper(reader, m) //for filling document          if fieldvalues isnot nothing             each kvp keyvaluepair(of string, string) in fieldvalues                 outstamper.acrofields.setfield(kvp.key, kvp.value)             next         end if           if images isnot nothing andalso images.count > 0 //add images              each pdfimage in images                 dim img itextsharp.text.image = nothing //image stamp                  //set image (different different cases                 select case pdfimage.imagetype                     //removed brevity                 end select                  dim overcontent pdfcontentbyte = outstamper.getovercontent(pdfimage.pagenumber) // specify page number stamping                 overcontent.addimage(img)              next          end if          //add water mark         if watermarktext <> ""             dim undercontent itextsharp.text.pdf.pdfcontentbyte = nothing             dim watermarkrect itextsharp.text.rectangle = reader.getpagesizewithrotation(1)            //removed brevity         end if          //flatten , close out         outstamper.formflattening = true         outstamper.setfullcompression()         outstamper.close()         reader.close()         return m 

since code working stream pdf, 1 simple way fix problem make small change fillpdf method - have return byte array:

// other parameters left out simplicity sake   public static byte[] fillpdf(string resource) {   pdfreader reader = new pdfreader(resource);   using (var ms = new memorystream()) {     using (pdfstamper stamper = new pdfstamper(reader, ms)) {       // whatever need     }     return ms.toarray();   }       } 

then can stream byte array client in asp.net and save file system:

// manipulated pdf     byte[] mypdf = fillpdf(inputfile); // stream via asp.net response.binarywrite(mypdf); // save file system file.writeallbytes(outputfile, mypdf); 

if you're generating pdf standard asp.net web form, don't forget call response.end() after pdf written, otherwise byte array have html markup garbage appended @ end.


Comments

Popular posts from this blog

jquery - Invalid Assignment Left-Hand Side -

java - Play! framework 2.0: How to display multiple image? -

gmail - Is there any documentation for read-only access to the Google Contacts API? -