Differenze tra le versioni di "Programmazione:Java/XML to PDF with fop"

Da WikiSitech.
Vai alla navigazioneVai alla ricerca
 
 
(8 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
=Come trasformare un XML in PDF con fop=
+
[[Programmazione:Java|<< Back to Java]]
{|
 
  
|}
+
Per ottenere un PDF da un XML è possibile utilizzare la libreria FOP fornita da apache (http://xmlgraphics.apache.org/fop/).<br /><br/>
 +
Per effettuare questa trasformazione abbiamo bisogno fondamentalmente di 3 cose:<br/>
 +
* Libreria del FOP preso dal sito di apache.
 +
* XSL scritto in XSL-FO.
 +
* XML da trasformare.
 +
Tutorial sull'XSL-FO si possono trovare su [http://www.w3schools.com/xslfo/default.asp w3schools] e su [http://www.renderx.com/tutorial.html renderX].<br /><br />
 +
Il procedimento da seguire per la trasformazione è abbastanza semplice, l'esempio è preso da una servlet che ottiene un'XML dentro un DOCUMENT di Dom4J e mette dentro la response il PDF generato dal FOP.
 +
 
 +
<syntaxhighlight lang="java">
 +
//Ottengo l'XML
 +
Document xml = "<XML>";
 +
 
 +
// Creo un'istanza della fopFactory
 +
FopFactory fopFactory = FopFactory.newInstance();
 +
// Creo un'istanza del foUserAgent
 +
FOUserAgent foUserAgent = fopFactory.newFOUserAgent();
 +
 +
// Preparo la response
 +
HttpServletResponse resp = fsc.getResp();
 +
resp.setContentType("application/pdf");
 +
resp.setHeader("Expires","-1");
 +
resp.setHeader("Cache-Control","no-store");
 +
 
 +
// Ottengo l'XSL scritto in XSL-FO
 +
InputStream xsltfile = "<XSL>";
 +
 
 +
// Ottengo lo Stream di output
 +
OutputStream out = resp.getOutputStream();
 +
 
 +
// Creo un'istanza del motore FOP
 +
Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, out);
 +
 
 +
// Preparo il transformerFactory
 +
TransformerFactory factory = TransformerFactory.newInstance();
 +
// Creo un'istanza di transformer passandogli l'XSL
 +
Transformer transformer = factory.newTransformer(new StreamSource(xsltfile));
 +
           
 +
// Setto la versione dei parametri
 +
transformer.setParameter("versionParam", "2.0");
 +
 
 +
// Resulting SAX events (the generated FO) must be piped through to FOP
 +
Result res = new SAXResult(fop.getDefaultHandler());
 +
 
 +
// Il transformer ha bisogno di un Source come sorgente quindi ne creo uno
 +
StringReader sr = new StringReader(xml.asXML());
 +
Source src = new StreamSource(sr);
 +
       
 +
// Effettuo la trasformazione
 +
transformer.transform(src, res);
 +
</syntaxhighlight>

Versione attuale delle 10:45, 21 dic 2016

<< Back to Java

Per ottenere un PDF da un XML è possibile utilizzare la libreria FOP fornita da apache (http://xmlgraphics.apache.org/fop/).

Per effettuare questa trasformazione abbiamo bisogno fondamentalmente di 3 cose:

  • Libreria del FOP preso dal sito di apache.
  • XSL scritto in XSL-FO.
  • XML da trasformare.

Tutorial sull'XSL-FO si possono trovare su w3schools e su renderX.

Il procedimento da seguire per la trasformazione è abbastanza semplice, l'esempio è preso da una servlet che ottiene un'XML dentro un DOCUMENT di Dom4J e mette dentro la response il PDF generato dal FOP.

//Ottengo l'XML
Document xml = "<XML>";

// Creo un'istanza della fopFactory
FopFactory fopFactory = FopFactory.newInstance();
// Creo un'istanza del foUserAgent
FOUserAgent foUserAgent = fopFactory.newFOUserAgent();
	
// Preparo la response
HttpServletResponse resp = fsc.getResp();
resp.setContentType("application/pdf");
resp.setHeader("Expires","-1");
resp.setHeader("Cache-Control","no-store");

// Ottengo l'XSL scritto in XSL-FO
InputStream xsltfile = "<XSL>";

// Ottengo lo Stream di output
OutputStream out = resp.getOutputStream();

// Creo un'istanza del motore FOP
Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, out);

// Preparo il transformerFactory
TransformerFactory factory = TransformerFactory.newInstance();
// Creo un'istanza di transformer passandogli l'XSL
Transformer transformer = factory.newTransformer(new StreamSource(xsltfile));
            
// Setto la versione dei parametri
transformer.setParameter("versionParam", "2.0");

// Resulting SAX events (the generated FO) must be piped through to FOP
Result res = new SAXResult(fop.getDefaultHandler());

// Il transformer ha bisogno di un Source come sorgente quindi ne creo uno
StringReader sr = new StringReader(xml.asXML());
Source src = new StreamSource(sr);
        
// Effettuo la trasformazione
transformer.transform(src, res);