Pour le moment, je crée un fichier XML en Java et l'affiche dans une page JSP en le transformant avec XSL/XSLT. Maintenant, je dois prendre ce fichier XML et afficher les mêmes informations dans un fichier PDF. Y a-t-il un moyen de faire cela en utilisant une sorte de fichier XSL?
J'ai vu la bibliothèque iText Java-PDF, mais je ne trouve aucun moyen de l'utiliser avec XML et une feuille de style.
Toute aide serait grandement appréciée. Merci d'avance!
Vous pouvez utiliser les objets de mise en forme XSL . Voici quelques bons articles sur la façon de le faire:
Vous devez utiliser le framework Apache FOP pour générer la sortie pdf. Vous fournissez simplement des données au format xml et rendez la page avec un fichier xsl-fo et spécifiez les paramètres tels que marge, mise en page dans cette fichier xsl-fo.
Je vais fournir une démonstration simple, j'utilise l'outil de compilation maven pour rassembler les fichiers JAR nécessaires. Veuillez notifier qu'à la fin de la page, un graphique svg est intégré au format PDF. Je souhaite également démontrer que vous pouvez intégrer des graphiques svg dans un fichier PDF.
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="application/xml"?>
<users-data>
<header-section>
<data-type id="019">User Bill Data</data-type>
<process-date>Thursday December 9 2016 00:04:29</process-date>
</header-section>
<user-bill-data>
<full-name>John Doe</full-name>
<postal-code>34239</postal-code>
<national-id>123AD329248</national-id>
<price>17.84</price>
</user-bill-data>
<user-bill-data>
<full-name>Michael Doe</full-name>
<postal-code>54823</postal-code>
<national-id>942KFDSCW322</national-id>
<price>34.50</price>
</user-bill-data>
<user-bill-data>
<full-name>Jane Brown</full-name>
<postal-code>66742</postal-code>
<national-id>ABDD324KKD8</national-id>
<price>69.36</price>
</user-bill-data>
</users-data>
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" version="1.0">
<xsl:output encoding="UTF-8" indent="yes" method="xml" standalone="no" omit-xml-declaration="no"/>
<xsl:template match="users-data">
<fo:root language="EN">
<fo:layout-master-set>
<fo:simple-page-master master-name="A4-portrail" page-height="297mm" page-width="210mm" margin-top="5mm" margin-bottom="5mm" margin-left="5mm" margin-right="5mm">
<fo:region-body margin-top="25mm" margin-bottom="20mm"/>
<fo:region-before region-name="xsl-region-before" extent="25mm" display-align="before" precedence="true"/>
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="A4-portrail">
<fo:static-content flow-name="xsl-region-before">
<fo:table table-layout="fixed" width="100%" font-size="10pt" border-color="black" border-width="0.4mm" border-style="solid">
<fo:table-column column-width="proportional-column-width(20)"/>
<fo:table-column column-width="proportional-column-width(45)"/>
<fo:table-column column-width="proportional-column-width(20)"/>
<fo:table-body>
<fo:table-row>
<fo:table-cell text-align="left" display-align="center" padding-left="2mm">
<fo:block>
Bill Id:<xsl:value-of select="header-section/data-type/@id"/>
, Date: <xsl:value-of select="header-section/process-date"/>
</fo:block>
</fo:table-cell>
<fo:table-cell text-align="center" display-align="center">
<fo:block font-size="150%">
<fo:basic-link external-destination="http://www.example.com">XXX COMPANY</fo:basic-link>
</fo:block>
<fo:block space-before="3mm"/>
</fo:table-cell>
<fo:table-cell text-align="right" display-align="center" padding-right="2mm">
<fo:block>
<xsl:value-of select="data-type"/>
</fo:block>
<fo:block display-align="before" space-before="6mm">Page <fo:page-number/> of <fo:page-number-citation ref-id="end-of-document"/>
</fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-body>
</fo:table>
</fo:static-content>
<fo:flow flow-name="xsl-region-body" border-collapse="collapse" reference-orientation="0">
<fo:block>MONTHLY BILL REPORT</fo:block>
<fo:table table-layout="fixed" width="100%" font-size="10pt" border-color="black" border-width="0.35mm" border-style="solid" text-align="center" display-align="center" space-after="5mm">
<fo:table-column column-width="proportional-column-width(20)"/>
<fo:table-column column-width="proportional-column-width(30)"/>
<fo:table-column column-width="proportional-column-width(25)"/>
<fo:table-column column-width="proportional-column-width(50)"/>
<fo:table-body font-size="95%">
<fo:table-row height="8mm">
<fo:table-cell>
<fo:block>Full Name</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block>Postal Code</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block>National ID</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block>Payment</fo:block>
</fo:table-cell>
</fo:table-row>
<xsl:for-each select="user-bill-data">
<fo:table-row>
<fo:table-cell>
<fo:block>
<xsl:value-of select="full-name"/>
</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block>
<xsl:value-of select="postal-code"/>
</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block>
<xsl:value-of select="national-id"/>
</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block>
<xsl:value-of select="price"/>
</fo:block>
</fo:table-cell>
</fo:table-row>
</xsl:for-each>
</fo:table-body>
</fo:table>
<fo:block id="end-of-document">
<fo:instream-foreign-object>
<svg width="200mm" height="150mm" version="1.1" xmlns="http://www.w3.org/2000/svg">
<path d="M153 334
C153 334 151 334 151 334
C151 339 153 344 156 344
C164 344 171 339 171 334
C171 322 164 314 156 314
C142 314 131 322 131 334
C131 350 142 364 156 364
C175 364 191 350 191 334
C191 311 175 294 156 294
C131 294 111 311 111 334
C111 361 131 384 156 384
C186 384 211 361 211 334
C211 300 186 274 156 274" style="fill:yellow;stroke:red;stroke-width:2"/>
</svg>
</fo:instream-foreign-object>
</fo:block>
</fo:flow>
</fo:page-sequence>
</fo:root>
</xsl:template>
</xsl:stylesheet>
<project xmlns="http://maven.Apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.Apache.org/POM/4.0.0 http://maven.Apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.levent.fopdemo</groupId>
<artifactId>Apache-fop-demo</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>Apache-fop-demo</name>
<url>http://maven.Apache.org</url>
<properties>
<fop.version>2.1</fop.version>
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.Apache.xmlgraphics/fop -->
<dependency>
<groupId>org.Apache.xmlgraphics</groupId>
<artifactId>fop</artifactId>
<version>${fop.version}</version>
</dependency>
</dependencies>
<build>
<finalName>Apache Fop Demo</finalName>
<plugins>
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
package com.levent.fopdemo;
import Java.io.File;
import Java.io.IOException;
import Java.io.OutputStream;
import javax.xml.transform.Result;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.sax.SAXResult;
import javax.xml.transform.stream.StreamSource;
import org.Apache.fop.apps.FOPException;
import org.Apache.fop.apps.FOUserAgent;
import org.Apache.fop.apps.Fop;
import org.Apache.fop.apps.FopFactory;
import org.Apache.fop.apps.MimeConstants;
public class PdfGenerationDemo
{
public static final String RESOURCES_DIR;
public static final String OUTPUT_DIR;
static {
RESOURCES_DIR = "src//main//resources//";
OUTPUT_DIR = "src//main//resources//output//";
}
public static void main( String[] args )
{
try {
convertToPDF();
} catch (FOPException | IOException | TransformerException e) {
e.printStackTrace();
}
}
public static void convertToPDF() throws IOException, FOPException, TransformerException {
// the XSL FO file
File xsltFile = new File(RESOURCES_DIR + "//template.xsl");
// the XML file which provides the input
StreamSource xmlSource = new StreamSource(new File(RESOURCES_DIR + "//data.xml"));
// create an instance of fop factory
FopFactory fopFactory = FopFactory.newInstance(new File(".").toURI());
// a user agent is needed for transformation
FOUserAgent foUserAgent = fopFactory.newFOUserAgent();
// Setup output
OutputStream out;
out = new Java.io.FileOutputStream(OUTPUT_DIR + "//output.pdf");
try {
// Construct fop with desired output format
Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, out);
// Setup XSLT
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer(new StreamSource(xsltFile));
// Resulting SAX events (the generated FO) must be piped through to
// FOP
Result res = new SAXResult(fop.getDefaultHandler());
// Start XSLT transformation and FOP processing
// That's where the XML is first transformed to XSL-FO and then
// PDF is created
transformer.transform(xmlSource, res);
} finally {
out.close();
}
}
}
Vous pouvez également consulter le projet Apache ici
BIRT a une interface graphique pour Eclipse qui vous permet de définir le PDF à partir de XML, DB, CSV, etc.
Essayez le xhtmlrenderer project. Voir l'article " Génération de PDF pour le plaisir et le profit avec Flying Saucer et iText ".
Vous voudrez peut-être examiner les bibliothèques XSL-FO existantes qui peuvent créer PDF comme transformation. Je vais essayer de trouver un lien.
Vous pouvez appliquer XSL-Fo à votre XML et le transformer avec Java transformer:
File xmlfile = new File(baseDir, xml);
File xsltfile = new File(baseDir, xsl);
File pdffile = new File(outDir, "ResultXMLPDF.pdf");
FopFactory fopFactory = FopFactory.newInstance();
FOUserAgent foUserAgent = fopFactory.newFOUserAgent();
OutputStream out = new Java.io.FileOutputStream(pdffile);
out = new Java.io.BufferedOutputStream(out);
try
{
Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, out);
// Setup XSLT
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer(new StreamSource(xsltfile));
transformer.setParameter("versionParam", "1.0");
Source src = new StreamSource(xmlfile);
Result res = new SAXResult(fop.getDefaultHandler());
transformer.transform(src, res);
} finally {
out.close();
}
System.out.println("Success!");
Utilisez JasperReports. Vous pouvez extraire les données de la base de données ou XML . Vous pouvez exporter vers de nombreux formats: PDF, Excel, HTML, etc.
Si vous arrivez en retard, vous pouvez créer un fichier statique PDF avec le concepteur d'Adobe avec des champs modifiables, puis créer un document XML XDP correspondant.
XML, CSS, XHTML, etc. constituent un "écosystème vivant" de standards ouverts, tandis que XSL-FO est un standard isolé.
... Historiquement, XSL-FO et XSLT ont été créés en tant que frères jumeaux, mais seul XSLT reste un "standard vivant", XSL-FO concentre beaucoup d'ADN dans des normes propriétaires (Adobe) ... maintenant obsolète.
À proprement parler, XSL-FO fait partie d'une "voie abandonnée" qui ne va pas évoluer, il ignore CSS, la "nouvelle façon" d'exprimer la mise en page dans "l'écosystème vivant".
Voir cette réponse à propos de l'utilisation de CSS-page avec XML ou XHTML.
Il y a deux façons de faire ça.
Tout d'abord, vous pouvez créer un PDF normal qui, une fois relu, ne vous donnera pas la hiérarchie du fichier XML d'origine. Ceci est expliqué de manière très détaillée dans 'Section 9.4.2 Parsing XML'
du 'iText in Action : Edition 2'
.
Deuxièmement, vous pouvez créer une balise PDF contenant la hiérarchie du XML ainsi que les données. Cela vous permet de relire le fichier PDF et de créer un fichier XML à partir de celui-ci (qui correspond exactement au fichier XML d'origine). Ce concept est également traité en détail dans '15.2.3 Adding structure'
du 'iText in Action : Edition 2'
.
En fonction de vos besoins, vous pouvez utiliser l’une des approches mentionnées ci-dessus.