c# - ASP.NET MVC - generating PDF raises Win32Exception (0x80004005) -


i'm trying generate pdfs based on screenshots. when i'm launching method locally, works without issue. however, when deployed on client machine, i'm getting error mentioned in title. here's method :

public actionresult generatepdf()         {             using (memorystream ms = new memorystream())             {                 var bmpscreenshot = new bitmap(screen.primaryscreen.bounds.width, screen.primaryscreen.bounds.height, pixelformat.format32bppargb);                 var gfxscreenshot = graphics.fromimage(bmpscreenshot);                 gfxscreenshot.copyfromscreen(screen.primaryscreen.bounds.x, screen.primaryscreen.bounds.y, 0, 0, screen.primaryscreen.bounds.size, copypixeloperation.sourcecopy);                 bmpscreenshot.save(server.mappath("~/content/images/pdf/myscreenshot.png"), imageformat.png);                  document document = new document(pagesize.a4, 25, 25, 30, 30);                 document.setpagesize(itextsharp.text.pagesize.a4.rotate());                 pdfwriter writer = pdfwriter.getinstance(document, ms);                  document.open();                 datetime dtnow = datetime.now;                 document.add(new paragraph(dtnow.tostring() + " - impression de rendez-vous"));                 system.drawing.image myimage = system.drawing.image.fromfile(server.mappath("~/content/images/pdf/myscreenshot.png"));                 itextsharp.text.image jpgimg = itextsharp.text.image.getinstance(myimage, system.drawing.imaging.imageformat.jpeg);                 jpgimg.scaleabsolute(800, 500);                 document.add(jpgimg);                 document.close();                 writer.close();                  response.contenttype = "pdf/application";                 response.addheader("content-disposition", "attachment;filename =impression_qutenza.pdf");                 response.outputstream.write(ms.getbuffer(), 0, ms.getbuffer().length);              }             return view();         } 

any idea of what's going on ?

edit : stack trace :

[win32exception (0x80004005): descripteur non valide]    system.drawing.graphics.copyfromscreen(int32 sourcex, int32 sourcey, int32 destinationx, int32 destinationy, size blockregionsize, copypixeloperation copypixeloperation) +512    astellasschedulerv2.controllers.homecontroller.generatepdf() +232    lambda_method(closure , controllerbase , object[] ) +62    system.web.mvc.actionmethoddispatcher.execute(controllerbase controller, object[] parameters) +14    system.web.mvc.reflectedactiondescriptor.execute(controllercontext controllercontext, idictionary`2 parameters) +182    system.web.mvc.controlleractioninvoker.invokeactionmethod(controllercontext controllercontext, actiondescriptor actiondescriptor, idictionary`2 parameters) +27    system.web.mvc.async.<>c__displayclass42.<begininvokesynchronousactionmethod>b__41() +28    system.web.mvc.async.<>c__displayclass8`1.<beginsynchronous>b__7(iasyncresult _) +10    system.web.mvc.async.wrappedasyncresult`1.end() +50    system.web.mvc.async.asynccontrolleractioninvoker.endinvokeactionmethod(iasyncresult asyncresult) +32    system.web.mvc.async.<>c__displayclass39.<begininvokeactionmethodwithfilters>b__33() +58    system.web.mvc.async.<>c__displayclass4f.<invokeactionmethodfilterasynchronously>b__49() +225    system.web.mvc.async.<>c__displayclass37.<begininvokeactionmethodwithfilters>b__36(iasyncresult asyncresult) +10    system.web.mvc.async.wrappedasyncresult`1.end() +50    system.web.mvc.async.asynccontrolleractioninvoker.endinvokeactionmethodwithfilters(iasyncresult asyncresult) +34    system.web.mvc.async.<>c__displayclass2a.<begininvokeaction>b__20() +24    system.web.mvc.async.<>c__displayclass25.<begininvokeaction>b__22(iasyncresult asyncresult) +99    system.web.mvc.async.wrappedasyncresult`1.end() +50    system.web.mvc.async.asynccontrolleractioninvoker.endinvokeaction(iasyncresult asyncresult) +27    system.web.mvc.<>c__displayclass1d.<beginexecutecore>b__18(iasyncresult asyncresult) +14    system.web.mvc.async.<>c__displayclass4.<makevoiddelegate>b__3(iasyncresult ar) +23    system.web.mvc.async.wrappedasyncresult`1.end() +55    system.web.mvc.controller.endexecutecore(iasyncresult asyncresult) +39    system.web.mvc.async.<>c__displayclass4.<makevoiddelegate>b__3(iasyncresult ar) +23    system.web.mvc.async.wrappedasyncresult`1.end() +55    system.web.mvc.controller.endexecute(iasyncresult asyncresult) +29    system.web.mvc.controller.system.web.mvc.async.iasynccontroller.endexecute(iasyncresult asyncresult) +10    system.web.mvc.<>c__displayclass8.<beginprocessrequest>b__3(iasyncresult asyncresult) +25    system.web.mvc.async.<>c__displayclass4.<makevoiddelegate>b__3(iasyncresult ar) +23    system.web.mvc.async.wrappedasyncresult`1.end() +55    system.web.mvc.mvchandler.endprocessrequest(iasyncresult asyncresult) +31    system.web.mvc.mvchandler.system.web.ihttpasynchandler.endprocessrequest(iasyncresult result) +9    system.web.callhandlerexecutionstep.system.web.httpapplication.iexecutionstep.execute() +9629708    system.web.httpapplication.executestep(iexecutionstep step, boolean& completedsynchronously) +155 

the code have posted will not take screenshot of web page running in web browser, take screenshot of current screen of pc running web server. "it worked" in local pc 2 reasons:

1- development pc has server , web browser running there @ same time.

2- web server using development not running service.

web applications deployed internet information server run under iis service process, , service process not have access server screen, reason error seeing in stack trace.

possible solutions:

1- use pdf processing library produce pdf file scratch on server using same data used serving web page.

or

2- use html-to-pdf conversion tool produce pdf file equivalent page requested locally on server. examples: wkhtmltopdf or amyuni webkitpdf (note: work amyuni technologies)


Comments