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
Post a Comment