.net - Merging Memory Streams to create a http PDF response in c# -
i trying merge 2 crystal reports single pdf file , i'm using itextsharp v5.1.1. says document cannot opened. might corrupted. there no build errors. pdf malformed , cant opened. here order chose accomplish this.
- export crystal report memorystream1 in pdf format
- export second report memorystream2.
- merge memory streams
- send streams http output response pdf.
here code each step in order.
/// dataset stored procedure cssource report dscs = csdata.getussourcexml(ds_input); /// create report of type cssource rptcs = reportfactory.getreport(typeof(cssource)); rptcs .setdatasource(dscs); /// set parameters cs report rptcs .parameterfields["parameterid"].currentvalues.clear(); rptcs .setparametervalue("parameterid", pid); //// serialize object pdf mscs=(memorystream)rptcs .exporttostream(exportformattype.portabledocformat);
for step 2
/// dataset stored procedure aden report dsad = csdata.getadden(ds_input); /// create report of type aden rptad = reportfactory.getreport(typeof(aden)); rptad.setdatasource(dsad ); /// set parameters aden report rptad.parameterfields["parameterid"].currentvalues.clear(); rptad.setparametervalue("parameterid", pid); //// serialize object pdf msad = (memorystream)rptad.exporttostream(exportformattype.portabledocformat);
for step 3
system.collections.generic.list<byte[]> sourcefiles = new list<byte[]>(); sourcefiles.add(mscs.toarray()); sourcefiles.add(msad.toarray()); pdfmerger mpdfs = new pdfmerger(); /// ms memory stream both streams added ms=mpdfs.mergefiles(sourcefiles);
mergefiles method follows
public memorystream mergefiles(generic.list<byte[]> sourcefiles) { document document = new document(); memorystream output = new memorystream(); try { // initialize pdf writer pdfwriter writer = pdfwriter.getinstance(document, output); //writer.pageevent = new pdfpageevents(); // open document write document.open(); pdfcontentbyte content = writer.directcontent; // iterate through pdf documents (int filecounter = 0; filecounter < sourcefiles.count; filecounter++) { // create pdf reader pdfreader reader = new pdfreader(sourcefiles[filecounter]); int numberofpages = reader.numberofpages; // iterate through pages (int currentpageindex = 1; currentpageindex <= numberofpages; currentpageindex++) { // determine page size current page document.setpagesize( reader.getpagesizewithrotation(currentpageindex)); // create page document.newpage(); pdfimportedpage importedpage = writer.getimportedpage(reader, currentpageindex); // determine page orientation int pageorientation = reader.getpagerotation(currentpageindex); if ((pageorientation == 90) || (pageorientation == 270)) { content.addtemplate(importedpage, 0, -1f, 1f, 0, 0, reader.getpagesizewithrotation(currentpageindex).height); } else { content.addtemplate(importedpage, 1f, 0, 0, 1f, 0, 0); } } } } catch (exception exception) { throw new exception("there has unexpected exception" + " occured during pdf merging process.", exception); } { // document.close(); } return output; }
step 4 serialize memory stream pdf
// ms memory stream converted pdf response.clear(); response.clearcontent(); response.clearheaders(); response.contenttype = "application/pdf"; response.charset = string.empty; response.addheader("content-disposition", "attachment; filename=" + "application of " + fullname.trim() + ".pdf"); //write file directly http content output stream. response.outputstream.write(ms.toarray(), 0, convert.toint32(ms.length)); response.outputstream.flush(); response.outputstream.close(); rptcs.close(); rptcs.dispose(); rptad.close(); rptad.dispose();
thanks developers helping me this. urgent because has go production in day or 2. please respond.
chandanan.
here's simple merge method copies pdf files 1 pdf. use method quite when merging pdfs. hope helps.
public memorystream mergepdfforms(list<byte[]> files) { if (files.count > 1) { pdfreader pdffile; document doc; pdfwriter pcopy; memorystream msoutput = new memorystream(); pdffile = new pdfreader(files[0]); doc = new document(); pcopy = new pdfsmartcopy(doc, msoutput); doc.open(); (int k = 0; k < files.count; k++) { pdffile = new pdfreader(files[k]); (int = 1; < pdffile.numberofpages + 1; i++) { ((pdfsmartcopy)pcopy).addpage(pcopy.getimportedpage(pdffile, i)); } pcopy.freereader(pdffile); } pdffile.close(); pcopy.close(); doc.close(); return msoutput; } else if (files.count == 1) { return new memorystream(files[0]); } return null; }
step 4 try:
rptcs.close(); rptcs.dispose(); rptad.close(); rptad.dispose(); response.clear(); response.contenttype = "application/pdf"; response.addheader("content-disposition", "attachment; filename=" + "application of " + fullname.trim() + ".pdf"); response.binarywrite(ms.toarray()); applicationinstance.completerequest();
Comments
Post a Comment