Jump to content
We've recently updated our Privacy Statement, available here ×

Empty PDF from Servlet


2004 IR Help

Recommended Posts

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

  • Replies 0
  • Created
  • Last Reply

Top Posters In This Topic

Popular Days

Top Posters In This Topic

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 account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...