You are viewing a plain text version of this content. The canonical link for it is here.
Posted to fop-dev@xmlgraphics.apache.org by Alex Amies <AA...@access360.com> on 2001/08/08 18:15:29 UTC

FOP Servlets being invoked twice

I have a problem with a servlet, which serves up pdf documents, 
invoking the servlet twice for every time I request the
url using my browser.  The pdf document is produced 
correctly in both instances.  Anybody else seen this
problem, know what it is, or have a constructive suggestion?

The servlet gets data from a database, formats into xml, 
transforms it with Xalan, then again to a pdf, sending 
the content to a byte array where it is then written to 
the output stream.  Here is a code fragment:

Writer writer = new StringWriter();

// Get an xslt processor factory
TransformerFactory tFactory = TransformerFactory.newInstance();

// Create the 3 objects the XSLTProcessor needs to perform the
transformation.
ReportInfo reportInfo = getReportData(request,res);
String xml = reportInfo.getXml();
StringReader stringReader = new StringReader(xml);
Source xmlSource  = new StreamSource(stringReader);
Source xslSheet   = getXSLInput(reportInfo.getReportNo());
StreamResult xmlResult = new StreamResult(writer);

Transformer transformer = tFactory.newTransformer(xslSheet);

// Perform the transformation.
transformer.transform(xmlSource, xmlResult);

// send output from xsl transformation to a string reader
// create a input source containing the xsl:fo file which can be fed to
Fop
Reader reader = new StringReader(writer.toString());
writer.flush();
writer.close();

//set Driver methods to start Fop processing
Driver driver = new Driver();

driver.setRenderer("org.apache.fop.render.pdf.PDFRenderer",".14");
driver.addElementMapping("org.apache.fop.fo.StandardElementMapping");
driver.addElementMapping("org.apache.fop.svg.SVGElementMapping");
driver.addPropertyList("org.apache.fop.fo.StandardPropertyListMapping");
driver.addPropertyList("org.apache.fop.svg.SVGPropertyListMapping");

// send pdf writer output to a byte array stream
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PrintWriter printWriter = new PrintWriter(baos);
driver.setWriter(printWriter);
driver.buildFOTree(parser, new InputSource(reader));
driver.format();
driver.render();

// send the bytes out to the servlet output stream
res.setContentType("application/pdf");
res.setContentLength(baos.size());

long sixty = System.currentTimeMillis() + 60*1000;
res.setDateHeader("Expires", sixty);
baos.writeTo(res.getOutputStream());
res.flushBuffer();

 

---------------------------------------------------------------------
To unsubscribe, e-mail: fop-dev-unsubscribe@xml.apache.org
For additional commands, email: fop-dev-help@xml.apache.org


Re: FOP Servlets being invoked twice

Posted by David Frankson <df...@qwest.net>.
    As far as I know, IE has always done 2 requests per mime type that it
doesn't handle internally.  See Article ID: Q293336 in the M$ knowledge
base.  Netscape and all others only do 1 request.  If anyone knows a
configuration that can get IE to behave, please let me know


I do suggest adding

response.addHeader("Content-Disposition", "inline; filename=report.pdf");

it will fix some glitches in IE5.0,  and also have you considered using a
Dom  Document rather than a string to pass your xml around?  It would save
you from having to parse it twice when you go from your business object to
Xalan, and from Xalan to FOP.

Dave


----- Original Message -----
From: "Alex Amies" <AA...@access360.com>
To: <fo...@xml.apache.org>
Cc: "Tim Kearney" <TK...@access360.com>
Sent: Wednesday, August 08, 2001 11:15 AM
Subject: FOP Servlets being invoked twice


> I have a problem with a servlet, which serves up pdf documents,
> invoking the servlet twice for every time I request the
> url using my browser.  The pdf document is produced
> correctly in both instances.  Anybody else seen this
> problem, know what it is, or have a constructive suggestion?
>
> The servlet gets data from a database, formats into xml,
> transforms it with Xalan, then again to a pdf, sending
> the content to a byte array where it is then written to
> the output stream.  Here is a code fragment:
>
> Writer writer = new StringWriter();
>
> // Get an xslt processor factory
> TransformerFactory tFactory = TransformerFactory.newInstance();
>
> // Create the 3 objects the XSLTProcessor needs to perform the
> transformation.
> ReportInfo reportInfo = getReportData(request,res);
> String xml = reportInfo.getXml();
> StringReader stringReader = new StringReader(xml);
> Source xmlSource  = new StreamSource(stringReader);
> Source xslSheet   = getXSLInput(reportInfo.getReportNo());
> StreamResult xmlResult = new StreamResult(writer);
>
> Transformer transformer = tFactory.newTransformer(xslSheet);
>
> // Perform the transformation.
> transformer.transform(xmlSource, xmlResult);
>
> // send output from xsl transformation to a string reader
> // create a input source containing the xsl:fo file which can be fed to
> Fop
> Reader reader = new StringReader(writer.toString());
> writer.flush();
> writer.close();
>
> //set Driver methods to start Fop processing
> Driver driver = new Driver();
>
> driver.setRenderer("org.apache.fop.render.pdf.PDFRenderer",".14");
> driver.addElementMapping("org.apache.fop.fo.StandardElementMapping");
> driver.addElementMapping("org.apache.fop.svg.SVGElementMapping");
> driver.addPropertyList("org.apache.fop.fo.StandardPropertyListMapping");
> driver.addPropertyList("org.apache.fop.svg.SVGPropertyListMapping");
>
> // send pdf writer output to a byte array stream
> ByteArrayOutputStream baos = new ByteArrayOutputStream();
> PrintWriter printWriter = new PrintWriter(baos);
> driver.setWriter(printWriter);
> driver.buildFOTree(parser, new InputSource(reader));
> driver.format();
> driver.render();
>
> // send the bytes out to the servlet output stream
> res.setContentType("application/pdf");
> res.setContentLength(baos.size());
>
> long sixty = System.currentTimeMillis() + 60*1000;
> res.setDateHeader("Expires", sixty);
> baos.writeTo(res.getOutputStream());
> res.flushBuffer();
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: fop-dev-unsubscribe@xml.apache.org
> For additional commands, email: fop-dev-help@xml.apache.org
>
>


---------------------------------------------------------------------
To unsubscribe, e-mail: fop-dev-unsubscribe@xml.apache.org
For additional commands, email: fop-dev-help@xml.apache.org


Re: FOP Servlets being invoked twice

Posted by Joe Batt <Jo...@SolidDesign.net>.
It happened to me using IE to Tomcat on the local machine using 
'localhost'.  I switched to using the real network interface and it 
fixed itself.

Joe

Alex Amies wrote:

>I have a problem with a servlet, which serves up pdf documents, 
>invoking the servlet twice for every time I request the
>url using my browser.  The pdf document is produced 
>correctly in both instances.  Anybody else seen this
>problem, know what it is, or have a constructive suggestion?
>
>The servlet gets data from a database, formats into xml, 
>transforms it with Xalan, then again to a pdf, sending 
>the content to a byte array where it is then written to 
>the output stream.  Here is a code fragment:
>
>Writer writer = new StringWriter();
>
>// Get an xslt processor factory
>TransformerFactory tFactory = TransformerFactory.newInstance();
>
>// Create the 3 objects the XSLTProcessor needs to perform the
>transformation.
>ReportInfo reportInfo = getReportData(request,res);
>String xml = reportInfo.getXml();
>StringReader stringReader = new StringReader(xml);
>Source xmlSource  = new StreamSource(stringReader);
>Source xslSheet   = getXSLInput(reportInfo.getReportNo());
>StreamResult xmlResult = new StreamResult(writer);
>
>Transformer transformer = tFactory.newTransformer(xslSheet);
>
>// Perform the transformation.
>transformer.transform(xmlSource, xmlResult);
>
>// send output from xsl transformation to a string reader
>// create a input source containing the xsl:fo file which can be fed to
>Fop
>Reader reader = new StringReader(writer.toString());
>writer.flush();
>writer.close();
>
>//set Driver methods to start Fop processing
>Driver driver = new Driver();
>
>driver.setRenderer("org.apache.fop.render.pdf.PDFRenderer",".14");
>driver.addElementMapping("org.apache.fop.fo.StandardElementMapping");
>driver.addElementMapping("org.apache.fop.svg.SVGElementMapping");
>driver.addPropertyList("org.apache.fop.fo.StandardPropertyListMapping");
>driver.addPropertyList("org.apache.fop.svg.SVGPropertyListMapping");
>
>// send pdf writer output to a byte array stream
>ByteArrayOutputStream baos = new ByteArrayOutputStream();
>PrintWriter printWriter = new PrintWriter(baos);
>driver.setWriter(printWriter);
>driver.buildFOTree(parser, new InputSource(reader));
>driver.format();
>driver.render();
>
>// send the bytes out to the servlet output stream
>res.setContentType("application/pdf");
>res.setContentLength(baos.size());
>
>long sixty = System.currentTimeMillis() + 60*1000;
>res.setDateHeader("Expires", sixty);
>baos.writeTo(res.getOutputStream());
>res.flushBuffer();
>
> 
>
>---------------------------------------------------------------------
>To unsubscribe, e-mail: fop-dev-unsubscribe@xml.apache.org
>For additional commands, email: fop-dev-help@xml.apache.org
>
>
>




---------------------------------------------------------------------
To unsubscribe, e-mail: fop-dev-unsubscribe@xml.apache.org
For additional commands, email: fop-dev-help@xml.apache.org


Re: FOP Servlets being invoked twice

Posted by Chetan Vig <ch...@yahoo.com>.
Yes, I have also seen this on my servlets which
generate PDF reports of 10-15 pages or more. For small
PDF reports like 1-5 pages I havent seen this issue.

-Chetan

 
--- Alex Amies <AA...@access360.com> wrote:
> I have a problem with a servlet, which serves up pdf
> documents, 
> invoking the servlet twice for every time I request
> the
> url using my browser.  The pdf document is produced 
> correctly in both instances.  Anybody else seen this
> problem, know what it is, or have a constructive
> suggestion?
> 
> The servlet gets data from a database, formats into
> xml, 
> transforms it with Xalan, then again to a pdf,
> sending 
> the content to a byte array where it is then written
> to 
> the output stream.  Here is a code fragment:
> 
> Writer writer = new StringWriter();
> 
> // Get an xslt processor factory
> TransformerFactory tFactory =
> TransformerFactory.newInstance();
> 
> // Create the 3 objects the XSLTProcessor needs to
> perform the
> transformation.
> ReportInfo reportInfo = getReportData(request,res);
> String xml = reportInfo.getXml();
> StringReader stringReader = new StringReader(xml);
> Source xmlSource  = new StreamSource(stringReader);
> Source xslSheet   =
> getXSLInput(reportInfo.getReportNo());
> StreamResult xmlResult = new StreamResult(writer);
> 
> Transformer transformer =
> tFactory.newTransformer(xslSheet);
> 
> // Perform the transformation.
> transformer.transform(xmlSource, xmlResult);
> 
> // send output from xsl transformation to a string
> reader
> // create a input source containing the xsl:fo file
> which can be fed to
> Fop
> Reader reader = new StringReader(writer.toString());
> writer.flush();
> writer.close();
> 
> //set Driver methods to start Fop processing
> Driver driver = new Driver();
> 
>
driver.setRenderer("org.apache.fop.render.pdf.PDFRenderer",".14");
>
driver.addElementMapping("org.apache.fop.fo.StandardElementMapping");
>
driver.addElementMapping("org.apache.fop.svg.SVGElementMapping");
>
driver.addPropertyList("org.apache.fop.fo.StandardPropertyListMapping");
>
driver.addPropertyList("org.apache.fop.svg.SVGPropertyListMapping");
> 
> // send pdf writer output to a byte array stream
> ByteArrayOutputStream baos = new
> ByteArrayOutputStream();
> PrintWriter printWriter = new PrintWriter(baos);
> driver.setWriter(printWriter);
> driver.buildFOTree(parser, new InputSource(reader));
> driver.format();
> driver.render();
> 
> // send the bytes out to the servlet output stream
> res.setContentType("application/pdf");
> res.setContentLength(baos.size());
> 
> long sixty = System.currentTimeMillis() + 60*1000;
> res.setDateHeader("Expires", sixty);
> baos.writeTo(res.getOutputStream());
> res.flushBuffer();
> 
>  
> 
>
---------------------------------------------------------------------
> To unsubscribe, e-mail:
> fop-dev-unsubscribe@xml.apache.org
> For additional commands, email:
> fop-dev-help@xml.apache.org
> 


__________________________________________________
Do You Yahoo!?
Make international calls for as low as $.04/minute with Yahoo! Messenger
http://phonecard.yahoo.com/

---------------------------------------------------------------------
To unsubscribe, e-mail: fop-dev-unsubscribe@xml.apache.org
For additional commands, email: fop-dev-help@xml.apache.org


Re: FOP Servlets being invoked twice

Posted by Joe Batt <Jo...@SolidDesign.net>.
Alex McLintock wrote:

>
>I've seen the content size problem (which you have correctly solved in your code)
>but now I have a problem with a particular build of IE. Basically the PDF doesn't appear -
>in fact neither does acrobat reader....
>The problem occurs on the IE version 5.50.4522.1800 and not with other IE5.5 versions, eg.
>5.50.4134.0600.
>
We found that Acrobat with 'Web Browser Integration' turned on failed to 
render almost always.  Switching to Acrobat 5.0 or turning off the web 
browser integration caused the rendering to work just fine.

Joe


---------------------------------------------------------------------
To unsubscribe, e-mail: fop-dev-unsubscribe@xml.apache.org
For additional commands, email: fop-dev-help@xml.apache.org


Re: FOP Servlets being invoked twice

Posted by Alex McLintock <al...@yahoo.com>.
 --- Alex Amies <AA...@access360.com> wrote: 
> I have a problem with a servlet, which serves up pdf documents, 
> invoking the servlet twice for every time I request the
> url using my browser.  The pdf document is produced 
> correctly in both instances.  Anybody else seen this
> problem, know what it is, or have a constructive suggestion?

If you check the mailing list archives you will see that at least one person
has seen this problem (with IE I think) and can't find a way around it.
However I don't see it myself so it might be fixable.


> long sixty = System.currentTimeMillis() + 60*1000;
> res.setDateHeader("Expires", sixty);

This is the only bit I am worried about - how does this help?

Since you've mentioned servlets I'll throw my problem into the fray.

I've seen the content size problem (which you have correctly solved in your code)
but now I have a problem with a particular build of IE. Basically the PDF doesn't appear -
in fact neither does acrobat reader....
The problem occurs on the IE version 5.50.4522.1800 and not with other IE5.5 versions, eg.
5.50.4134.0600.

(Incidently the data is submitted to the servlet using Post - apparently this is
the cause of the bug in IE)

Now I got so fed up with this that I tried saving the PDF file to disk and then issuing
a redirect to the static PDF file. Hooray this works in the problem version of IE.
Oh b(*&^(*er it no longer works in the older versions of IE.

I've tried the servlet "sendRedirect", I've tried a Location header with relative and 
absolute URLs, I've even just tried a "Refresh" header. Nothing seems to work.

So folks - what are your servlet experiences....?

I feel like I'm going round in circles here. 

The one thing I haven't really done is to change the URL to end with ".pdf" 
Basically I can't create a class called "something.pdf" so haven't created a servlet  
with that name yet. I've tried servletname;stupidie.pdf but that didn't seem to help.


Alex




=====
Alex McLintock        alex@OWAL.co.uk    Open Source Consultancy in London
OpenWeb Analysts Ltd, http://www.OWAL.co.uk/ 
SF and Computing Book News and Reviews: http://news.diversebooks.com/
Get Your XML T-Shirt <t-shirt/> at http://www.inversity.co.uk/

____________________________________________________________
Do You Yahoo!?
Get your free @yahoo.co.uk address at http://mail.yahoo.co.uk
or your free @yahoo.ie address at http://mail.yahoo.ie

---------------------------------------------------------------------
To unsubscribe, e-mail: fop-dev-unsubscribe@xml.apache.org
For additional commands, email: fop-dev-help@xml.apache.org