1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180
|
package fr.ign.calac.s_calac.controller;
import [...];
public class GenerateSampleServlet extends BaseHttpServlet {
private static final long serialVersionUID = -908918093488215264L;
/** The TransformerFactory used to create Transformer instances */
protected TransformerFactory transFactory;
/** The FopFactory used to create Fop instances */
protected FopFactory fopFactory = null;
/** URIResolver for use by this servlet */
protected transient URIResolver uriResolver;
@Override
public void init() throws ServletException {
this.uriResolver = new ServletContextURIResolver(getServletContext());
this.transFactory = TransformerFactory.newInstance();
this.transFactory.setURIResolver(this.uriResolver);
//Configure FopFactory as desired
// TODO: Double check this behaves properly!!
ResourceResolver resolver = new ResourceResolver() {
public OutputStream getOutputStream(URI uri) throws IOException {
URL url = getServletContext().getResource(uri.toASCIIString());
return url.openConnection().getOutputStream();
}
public Resource getResource(URI uri) throws IOException {
return new Resource(getServletContext().getResourceAsStream(uri.toASCIIString()));
}
};
FopFactoryBuilder builder = new FopFactoryBuilder(new File(".").toURI(), resolver);
configureFopFactory(builder);
fopFactory = builder.build();
}
/**
* This method is called right after the FopFactory is instantiated and can be overridden
* by subclasses to perform additional configuration.
*/
protected void configureFopFactory(FopFactoryBuilder builder) {
//Subclass and override this method to perform additional configuration
}
@Override
public void doGet( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException {
doPost(request, response);
}
@Override
public void doPost( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException {
//Get parameters
Map<String,String[]> params = request.getParameterMap();
// -> Ici je récupère mes paramètres de requête
File mapFile = File.createTempFile("mapfile", "");
// -> là je mets quelque chose dans mon mapFile
String path = "file:///" + mapFile.getAbsolutePath().replaceAll("\\\\", "/") + ".png";// -> j'ai vérifié en affichant ce chemin : il y a bien un image
try {
String xmlContent = "<?xml version=\"1.0\" encoding=\"iso-8859-1\"?><root><name>Machin</name>" +
"<friend><name>truc_1</name><phNo>" + "truc_2" + "</phNo></friend>" +
"<path>" + path + "</path>" +
"</root>";
String xsltParam = getServletContext().getRealPath(getServletConfig().getInitParameter("templatesDirectory") + "/test.xsl");
renderXML(xmlContent, xsltParam, response);
} catch (Exception ex) {
throw new ServletException(ex);
}
}
/**
* Converts a String parameter to a JAXP Source object.
* @param param a String parameter
* @return Source the generated Source object
*/
protected Source convertString2Source(String param) {
Source src;
try {
src = uriResolver.resolve(param, null);
} catch (TransformerException e) {
src = null;
}
if (src == null) {
src = new StreamSource(new File(param));
}
return src;
}
private void sendPDF(byte[] content, HttpServletResponse response) throws IOException {
response.setHeader("Content-Type", MimeConstants.MIME_PNG);
response.setHeader("Content-Length", String.valueOf(content.length));
response.setHeader("Content-Disposition", "inline; filename=\"test\"");
response.getOutputStream().write(content);
response.getOutputStream().flush();
}
/**
* Renders an XML file into a PDF file by applying a stylesheet
* that converts the XML to XSL-FO. The PDF is written to a byte array
* that is returned as the method's result.
* @param xml the XML file
* @param xslt the XSLT file
* @param response HTTP response object
* @throws FOPException If an error occurs during the rendering of the
* XSL-FO
* @throws TransformerException If an error occurs during XSL
* transformation
* @throws IOException In case of an I/O problem
*/
protected void renderXML(String xml, String xslt, HttpServletResponse response)
throws FOPException, TransformerException, IOException {
//Setup sources
//Source xmlSrc = convertString2Source(xml);
Source xmlSrc = new StreamSource(new StringReader(xml));
Source xsltSrc = convertString2Source(xslt);
//Setup the XSL transformation
Transformer transformer = this.transFactory.newTransformer(xsltSrc);
transformer.setURIResolver(this.uriResolver);
//Start transformation and rendering process
render(xmlSrc, transformer, response);
}
/**
* Renders an input file (XML or XSL-FO) into a PDF file. It uses the JAXP
* transformer given to optionally transform the input document to XSL-FO.
* The transformer may be an identity transformer in which case the input
* must already be XSL-FO. The PDF is written to a byte array that is
* returned as the method's result.
* @param src Input XML or XSL-FO
* @param transformer Transformer to use for optional transformation
* @param response HTTP response object
* @throws FOPException If an error occurs during the rendering of the
* XSL-FO
* @throws TransformerException If an error occurs during XSL
* transformation
* @throws IOException In case of an I/O problem
*/
protected void render(Source src, Transformer transformer, HttpServletResponse response)
throws FOPException, TransformerException, IOException {
FOUserAgent foUserAgent = getFOUserAgent();
//Setup output
ByteArrayOutputStream out = new ByteArrayOutputStream();
//Setup FOP
Fop fop = fopFactory.newFop(MimeConstants.MIME_PNG, foUserAgent, out);
//Make sure the XSL transformation's result is piped through to FOP
Result res = new SAXResult(fop.getDefaultHandler());
//Start the transformation and rendering process
transformer.transform(src, res);
//Return the result
sendPDF(out.toByteArray(), response);
}
/** @return a new FOUserAgent for FOP */
protected FOUserAgent getFOUserAgent() {
FOUserAgent userAgent = fopFactory.newFOUserAgent();
//Configure foUserAgent as desired
return userAgent;
}
} |
Partager