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

Da WikiSitech.
Vai alla navigazioneVai alla ricerca
Riga 5: Riga 5:
 
* XML da trasformare.
 
* XML da trasformare.
  
 +
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.<br />
 
<code java>
 
<code java>
Document xml = self.getXML(utente, uc, fsc);
+
//Ottengo l'XML
        // configure fopFactory as desired
+
Document xml = <XML>;
        FopFactory fopFactory = FopFactory.newInstance();
+
 
 +
// Creo un'istanza della fopFactory
 +
FopFactory fopFactory = FopFactory.newInstance();
 +
// Creo un'istanza del foUserAgent
 +
FOUserAgent foUserAgent = fopFactory.newFOUserAgent();
 
 
        FOUserAgent foUserAgent = fopFactory.newFOUserAgent();
+
// Preparo la response
        // configure foUserAgent as desired
+
HttpServletResponse resp = fsc.getResp();
+
OutputStream out = resp.getOutputStream();
        // Setup output
+
resp.setContentType("application/pdf");
        HttpServletResponse resp = fsc.getResp();
+
resp.setHeader("Expires","-1");
        OutputStream out = resp.getOutputStream();
+
resp.setHeader("Cache-Control","no-store");
        resp.setContentType("application/pdf");
+
 
        resp.setHeader("Expires","-1");
+
// Ottengo l'XSL scritto in XSL-FO
        resp.setHeader("Cache-Control","no-store");
+
InputStream xsltfile = <XSL>;
        InputStream xsltfile = this.getClass().getResourceAsStream(self.getXSL(utente, uc, fsc));
+
 
        if (log.isDebugEnabled()){
+
// Creo un'istanza del motore FOP
        log.debug("XSL per la stampa: "+self.getXSL(utente, uc, fsc));
+
Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, out);
        }
 
       
 
            // Construct fop with desired output format
 
            Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, out);
 
  
            // Setup XSLT
+
// Preparo il transformerFactory
            TransformerFactory factory = TransformerFactory.newInstance();
+
TransformerFactory factory = TransformerFactory.newInstance();
            Transformer transformer = factory.newTransformer(new StreamSource(xsltfile));
+
// Creo un'istanza di transformer passandogli l'XSL
 +
Transformer transformer = factory.newTransformer(new StreamSource(xsltfile));
 
              
 
              
            // Set the value of a <param> in the stylesheet
+
// Setto la versione dei parametri
            transformer.setParameter("versionParam", "2.0");
+
transformer.setParameter("versionParam", "2.0");
            StringReader sr = new StringReader(xml.asXML());
+
 
            if (log.isDebugEnabled()){
+
// Resulting SAX events (the generated FO) must be piped through to FOP
        log.debug("XML per la stampa: "+D4JXmlTool.xml2String(xml, true));
+
Result res = new SAXResult(fop.getDefaultHandler());
        }   
+
 
            // Setup input for XSLT transformation
+
// Il transformer ha bisogno di un Source come sorgente quindi ne creo uno
            Source src = new StreamSource(sr);
+
StringReader sr = new StringReader(xml.asXML());
 +
Source src = new StreamSource(sr);
 
          
 
          
            // Resulting SAX events (the generated FO) must be piped through to FOP
+
// Effettuo la trasformazione
            Result res = new SAXResult(fop.getDefaultHandler());
+
transformer.transform(src, res);
 
 
            // Start XSLT transformation and FOP processing
 
            transformer.transform(src, res);
 
 
</code>
 
</code>

Versione delle 12:23, 4 gen 2007

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 x cose:

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

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(); OutputStream out = resp.getOutputStream(); resp.setContentType("application/pdf"); resp.setHeader("Expires","-1"); resp.setHeader("Cache-Control","no-store");

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

// 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);