2004 IR Help Posted August 22, 2006 Share Posted August 22, 2006 By: W Leong - wk_leong Empty PDF from Servlet 2005-03-16 02:05 Hi I've been bugged by this problem for a few days. Essentially, I can generate pdf preview from iReport fine. But if I stream it from servlet I always got an empty PDF. I have tried various methods of output ( JasperExportManager.exportReportToPdfStream, JRPdfExporter.exportReport, JasperRunManager.runReportToPdf) and none helps. However, if I were to stream the output to a file (instead of output), the pdf can be viewed fine. Here's the code snippets: -------------------------------------------------------------------- File reportFile = new File(getServlet().getServletContext().getRealPath("/rptProfile.jasper")); JasperReport jsRpt = (JasperReport)JRLoader.loadObject(reportFile.getPath()); JasperPrint jsPrn = JasperFillManager.fillReport(jsRpt, params, db.connection() ); ServletOutputStream out = res.getOutputStream(); res.setContentType("application/pdf"); res.setHeader("Content-Disposition", "inline; filename=test.pdf"); java.io.ByteArrayOutputStream baos = new java.io.ByteArrayOutputStream(); JasperExportManager.exportReportToPdfStream(jsPrn,baos); // write to physical file. the pdf can be viewed fine baos.writeTo(new java.io.FileOutputStream("newPdfFile.pdf")); // dump to screen. pdf opens blank baos.writeTo(out); out.flush(); out.close(); -------------------------------------------------------------------- I tried edit and compare the 2 (written and blank) pdf. 99% of the content are the same except a few corrupted? characters in the stream section. I am suspecting I need to set certain encoding on the output stream. I have came across similar posting in forum but no fix has been suggested so far. Any helps is much appreaciated. My current environment: jasperreports 0.6.5 itext 1.0.1 tomcat 5.5.7 jdk 1.5.0 update 1 Thx & Regards -WK- By: Greg Lloyd - haobaba1 RE: Empty PDF from Servlet 2005-03-25 08:50 I am having issues with serving up PDF content from a servlet as well. In my case it may be a browser issue( IE6) as this is the only browser that doesn't display the PDF. My reponse headers are as follows, these were taken from a developer friendly browsers: Pragma: No-cache Cache-Control: no-cache Expires: Wed, 31 Dec 1969 19:00:00 EST X-Powered-By: Servlet 2.4; Tomcat-5.0.28/JBoss-4.0.1RC2 (build: CVSTag=JBoss_4_0_1_RC2 date=200411302349) content-disposition: inline; filename=report.pdf Content-Type: application/pdf Content-Length: 3763 Date: Fri, 25 Mar 2005 16:37:42 GMT Server: Apache-Coyote/1.1 This is how my servlet outputs the pdf to the browser: response.setContentType("application/pdf"); response.setHeader("Content-Disposition","inline; filename=report.pdf"); byte[] bytes= rbean.getPdf(); response.setContentLength(bytes.length); ServletOutputStream out= response.getOutputStream(); out.write(bytes); out.flush(); If anybody has any ideas they are appreciated. By: podster - podster RE: Empty PDF from Servlet 2005-03-28 05:54 I'm having the same problem where everything worked fine when my JBoss server was running on my local XP box but when I moved the web application to a Solaris 8 box the PDF will not display (I get a blank white page) on IE6 but WILL display using Firefox. I am not getting any error through JBoss or Apache. Does anybody have any experiece with this? Why IE6 doesn't stream PDF's through a servlet on Solaris? What is the workaround. I have attached my headers just in case. User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6) Gecko/20050225 Firefox/1.0.1 Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5 Accept-Language: en-us,en;q=0.5 Accept-Encoding: gzip,deflate Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 Keep-Alive: 300 Connection: keep-alive Content-Type: application/x-www-form-urlencoded Content-Length: 65 action=rteSumRpt&storId=GAN++++&reportDate=03%2F22%2F2005&shift=1 HTTP/1.x 200 OK Date: Mon, 28 Mar 2005 13:47:34 GMT Server: Apache/1.3.29 (Unix) mod_jk/1.2.5 mod_gzip/1.3.26.1a mod_ssl/2.8.16 OpenSSL/0.9.7c Cache-Control: no-store X-Powered-By: Servlet 2.4; Tomcat-5.0.28/JBoss-4.0.1sp1 (build: CVSTag=JBoss_4_0_1_SP1 date=200502160314) Connection: close Transfer-Encoding: chunked Content-Type: application/pdf By: Greg Lloyd - haobaba1 RE: Empty PDF from Servlet 2005-03-30 11:47 Imagine this, IE is screwed up. I figured out that IE doesn't like pdf's streamed to it from web servers unless they are ~> 6kb. I added a few images to my reports and walla IE now accepts them. By: W Leong - wk_leong RE: Empty PDF from Servlet 2005-04-14 02:52 didn't work for me. I have embedded image of 12k but nothing shows. This could be headache when my application goes to multi-user environment. By: Denny Valliant - xenden RE: Empty PDF from Servlet 2005-04-14 11:32 I had been getting the error when I tried to stream the pdf. Works fine if I write the file first, but it's blank if I try to go straight to the user. The below code is working for me tho. I'm thinnking it might be the JRXmlLoader vs. the generic class... This is written in ColdFusion, but it should be obvious how to convert it back to normal java. Mostly just use the stuff in the <cfscript> tags and get rid of the create object and replace it with the object. Eh. Please don't laugh at my weak kode'n skillz. ;-) Good luck! <cffunction name="jasperreport"> <cfargument name="jrxmlID" type="numeric" required="yes"> <cfargument name="dataSource" required="yes" hint="Datasource is required"> <cfargument name="exportType" required="yes" default="pdf"> <cfargument name="download" required="no" default="no"> <cfquery name = "getJR" datasource = "nmkids"> SELECT * FROM jrxmls WHERE jrxmlID = <cfqueryparam cfsqltype="cf_sql_integer" value="#jrxmlID#"> </cfquery> <cfset daJRXML = xmlparse(toString(toBinary(getJR.jrxml)))> <cfset daTitle = daJRXML.jasperReport.xmlAttributes.name> <cfset daXM = toString(toBinary(getJR.jrxml))> <cfset params = StructNew()> <cfset params["certificate_ID"] = '9443'> <cfscript> xmlBuffer = CreateObject("java","java.lang.String").init(daXM).getBytes(); //Turn the buffers into input streams xmlInputStream = CreateObject("java","java.io.ByteArrayInputStream").init(xmlBuffer); outStream = CreateObject("java","java.io.ByteArrayOutputStream").init(); parameters = CreateObject("java", "java.util.HashMap"); // move the param structure to an array to evaluate ka = StructKeyArray(params); for(i=1; i LTE ArrayLen(ka); i=i+1){ curr_ka = ka; // take struct params and add them to report parameters.put(curr_ka, Evaluate("params." & curr_ka)); } dCFjasper = CreateObject("java","com.den.ColdFusion.CFjasper").init(); daFactory = CreateObject ("Java","coldfusion.server.ServiceFactory"); daConnection = daFactory.getDataSourceService().getDatasource(dataSource).getConnection(); //argy = dCFjasper.CFjasper(xmlInputStream,exportType,parameters,daConnection); jRXmlLoader = CreateObject ("Java","net.sf.jasperreports.engine.xml.JRXmlLoader"); jasperDesign = jRXmlLoader.load(xmlInputStream); jasperCompileManager = CreateObject("java","net.sf.jasperreports.engine.design.JRJdtCompiler"); jasperReport = jasperCompileManager.compileReport(jasperDesign); // Fourth, create JasperPrint using fillReport() method jasperFillManager = CreateObject("java","net.sf.jasperreports.engine.JasperFillManager"); jasperPrint = jasperFillManager.fillReport(jasperReport, parameters, daConnection); jasperExportManager = CreateObject("java","net.sf.jasperreports.engine.JasperExportManager"); expparam = CreateObject("java", "net.sf.jasperreports.engine.JRExporterParameter"); //exporter.setParameter(expparam.OUTPUT_FILE_NAME,outfile); if (exportType is "pdf") { argy = jasperExportManager.exportReportToPdf(jasperPrint); } else if(exportType is "rtf") { argy = jasperExportManager.exportReportToRtf(jasperPrint); } else if(exportType is "xls") { argy = jasperExportManager.exportReportToXls(jasperPrint); } </cfscript> <cfsetting showdebugoutput="no"> <cfsetting enablecfoutputonly="yes"> <cfset request.cvalue = 'attachment;'> <cfset request.cvalue = request.cvalue & "filename=#daTitle#.#exportType#"> <cfheader name="Content-Disposition" value="#request.cvalue#"> <cfcontent type="application/#exportType#"><cfoutput>#toString(argy)#</cfoutput> </cffunction> By: Wal Millard - walmillard RE: Empty PDF from Servlet 2005-04-14 23:36 Guys you may like to have a look at usng the exporter class. i have been using ie (5.x and 6.x) and firefox without any problems... JRPdfExporter exporter = new JRPdfExporter(); exporter.setParameter(JRExporterParameter.JASPER_PRINT, JasperFillManager.fillReport(TemplatePath + "Main.jasper", parameters, new JRXmlDataSource(new BufferedInputStream( new ByteArrayInputStream(Sb.toString().getBytes())), "/DocDetail/Contract"))); exporter.setParameter(JRPdfExporterParameter.OUTPUT_STREAM, response.getOutputStream()); exporter.setParameter(JRPdfExporterParameter.PERMISSIONS, new Integer(PdfWriter.AllowCopy | pdfWriter.AllowPrinting)); exporter.exportReport(); // Create the PDF file within the stream By: W Leong - wk_leong RE: Empty PDF from Servlet 2005-03-17 19:53 More info: Tested with Firefox and IE6.0 and problem persist. Presume this is not a browser issue. May have more to do with servlet outputstream setting. By: Tom Eugelink - tbee RE: Empty PDF from Servlet 2005-08-03 11:44 This is ridiculous. I first write the PDF to a file and then copy that file contents to the response. In my browser I get an empty page, but opening the file I get my report. JasperReport 1.0.0 Tomcat 4.1 IE6.0.2900 By: Brad Balmer - bbalmer RE: Empty PDF from Servlet 2005-08-03 12:01 This is what I'm doing. (I generate my pdf byte[] from my Action and then forward onto a servlet to stream it up to the browser. In short: byte[] reportData = JasperRunManager.runReportToPdf(jasperFile.getPath(), parameters, dataSource); session.setAttribute("contentType", "application/pdf"); session.setAttribute("reportData", reportData); Then in my servlet: public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession(); ServletOutputStream outputStream = response.getOutputStream(); String contentType = (String) session.getAttribute("contentType"); byte[] reportBytes = (byte[]) session.getAttribute("reportData"); if(reportBytes == null) reportBytes = new byte[0]; response.setContentType(contentType); response.setContentLength(reportBytes.length); outputStream.write(reportBytes, 0, reportBytes.length); outputStream.flush(); outputStream.close(); } By: Tom Eugelink - tbee RE: Empty PDF from Servlet 2005-08-03 12:49 I've tried writing to file, byte array, byte output stream and directly to stream, using the exporter, exportReportToPdf and your runReportToPdf. (The advantage of using the file is that you can inspect the PDF after wards.) By: kootjekip - kootjekip RE: Empty PDF from Servlet 2005-08-04 00:32 why use a servlet if you can use a inline pdf? By: Tom Eugelink - tbee RE: Empty PDF from Servlet 2005-08-04 00:47 Could you explain that remark? AFAIK somewhere there must be a place where the report is exported into PDF and the result put on the response' output stream. That requires a servlet. Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now