package de.pdv.apex; import org.apache.fop.apps.FOUserAgent; import org.apache.fop.apps.Fop; import org.apache.fop.apps.FopFactory; import static org.apache.xmlgraphics.util.MimeConstants.MIME_PDF; import javax.servlet.ServletContext; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.xml.XMLConstants; import javax.xml.transform.*; import javax.xml.transform.sax.SAXResult; import javax.xml.transform.stream.StreamSource; import java.io.File; import java.io.InputStream; import java.io.StringReader; import java.util.logging.Level; import java.util.logging.Logger; /** * @author oliver1 */ @WebServlet(name = "pdf", urlPatterns = {"/pdf"}) public class PdfServlet extends HttpServlet { private static final Logger logger = Logger.getLogger(PdfServlet.class.getName()); private static final TransformerFactory tFactory = TransformerFactory.newInstance(); /** * Init the servlet and setup TransformerFactory */ @Override public void init() { try { tFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); tFactory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, ""); tFactory.setAttribute(XMLConstants.ACCESS_EXTERNAL_STYLESHEET, ""); logger.info("TransformerFactory configured with FEATURE_SECURE_PROCESSING and without ACCESS_EXTERNAL_DTD/ACCESS_EXTERNAL_STYLESHEET"); } catch (TransformerConfigurationException e) { logger.warning(String.format("TransformerConfigurationException while setup TransformerFactory - possible security issue: %s", e.getMessage())); } } /** * Handles the HTTP GET method. * * @param request servlet request * @param response servlet response */ @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) { logger.log(Level.FINEST,"Finest output"); logger.log(Level.FINER,"Finer output"); logger.log(Level.FINE,"Fine output"); logger.log(Level.INFO,"Info output"); logger.log(Level.INFO,"doGet"); try { response.setContentType("application/pdf"); FopFactory fopFactory = FopFactory.newInstance(new File(".").toURI()); Fop fop = fopFactory.newFop(MIME_PDF, response.getOutputStream()); Transformer transformer = tFactory.newTransformer(); InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("samples/helloWorld.fo"); Source src = new StreamSource(inputStream); Result res = new SAXResult(fop.getDefaultHandler()); transformer.transform(src, res); logger.log(Level.INFO,"Process complete"); } catch (Exception ex) { logger.log(Level.SEVERE,String.format("Error while processing fop transformation %s", ex.getMessage())); } } /** * Handles the HTTP POST method. * * @param request servlet request * @param response servlet response */ @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) { ServletContext context = getServletContext(); logger.log(Level.FINEST,"Finest output"); logger.log(Level.FINER,"Finer output"); logger.log(Level.FINE,"Fine output"); logger.log(Level.INFO,"Info output"); logger.log(Level.INFO,"doPost"); try { String contentType = request.getContentType(); String templateFile = "template.fo"; String templateData = "xml data"; if (request.getParameter("template") != null) templateFile = request.getParameter("template"); if (request.getParameter("xml") != null) templateData = request.getParameter("xml"); if (logger.isLoggable(Level.FINEST)) { logger.log(Level.FINEST, String.format("Working directory: %s", new File("dummy1.txt").getAbsolutePath())); logger.log(Level.FINEST, String.format("Template file length: %s", templateFile.length())); logger.log(Level.FINEST, String.format("Template data length: %s", templateData.length())); logger.log(Level.FINEST, String.format("Content type: %s", contentType)); } String pdfFileName = "Kostenblatt.pdf"; response.setContentType("application/pdf"); response.setHeader("Content-disposition", "attachment; filename=" + pdfFileName); FopFactory fopFactory = FopFactory.newInstance(new File(".").toURI()); FOUserAgent foUserAgent = fopFactory.newFOUserAgent(); // Construct fop with desired output format Fop fop = fopFactory.newFop(MIME_PDF, foUserAgent, response.getOutputStream()); Transformer transformer = tFactory.newTransformer( new StreamSource(new StringReader(templateFile))); // Set the value of a in the stylesheet transformer.setParameter("versionParam", "2.0"); // Setup input for XSLT transformation Source src = new StreamSource(new StringReader(templateData)); // Resulting SAX events (the generated FO) must be piped through to FOP Result res = new SAXResult(fop.getDefaultHandler()); // Start XSLT transformation and FOP processing transformer.transform(src, res); logger.log(Level.INFO,"Process complete"); } catch (Exception ex) { context.log(ex.getMessage(), ex); logger.log(Level.SEVERE,String.format("Error while processing fop transformation %s", ex.getMessage())); } } /** * Returns a short description of the servlet. * * @return a String containing servlet description */ @Override public String getServletInfo() { return "APEX FOP Server"; }// }