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: [EMAIL PROTECTED]
For additional commands, email: [EMAIL PROTECTED]

Reply via email to