Hallo allen,
ik ben even aan het spelen met FOP (XML+XSLT -> PDF), en alles gaat wel okee. Alleen nu wil ik mijn code zo aanpassen dat ik dmv een tweetal textarea's op een HTML formulier mijn XML en XSLT kan meesturen. Echter, ik krijg dit op geen enkel manier geschikt om te parsen naar iets wat mijn PDF creator opeet.
Dit is de XML :
en de XSLT:
Als iemand me hiermee in de goeie richting kan schoppen, heel graag. Ik snap even niet helemaal wat te doen.
Erik
ik ben even aan het spelen met FOP (XML+XSLT -> PDF), en alles gaat wel okee. Alleen nu wil ik mijn code zo aanpassen dat ik dmv een tweetal textarea's op een HTML formulier mijn XML en XSLT kan meesturen. Echter, ik krijg dit op geen enkel manier geschikt om te parsen naar iets wat mijn PDF creator opeet.
Java:
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
| import java.io.*; import java.util.*; import javax.servlet.*; import javax.servlet.http.*; import org.xml.sax.InputSource; import org.apache.fop.apps.Driver; import org.apache.fop.apps.XSLTInputHandler; import org.apache.fop.messaging.MessageHandler; public class FopServletTest extends HttpServlet { public static final String XML_TEXT_REQUEST_PARAM = "xmltext"; public static final String XSL_TEXT_REQUEST_PARAM = "xsltext"; public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException { try { String xmlText = request.getParameter(XML_TEXT_REQUEST_PARAM); String xslText = request.getParameter(XSL_TEXT_REQUEST_PARAM); // /* Eerst werd de XML en XSL vanaf de disk gelezen */ // XSLTInputHandler input = // new XSLTInputHandler(new File(xmlParam), // new File(xslParam)); XSLTInputHandler input = new XSLTInputHandler(new InputSource( new StringReader (xmlText) ), new InputSource( new StringReader (xslText) ) ); TraxInputHandler input = new TraxInputHandler(xml, xsl ); renderXML(input, response); } } catch (ServletException ex) { throw ex; } catch (Exception ex) { throw new ServletException(ex); } } /** * Renders an XML file into a PDF file by applying a stylesheet * that converts the XML to XSL:FO. The PDF is written * directly to the response object's OutputStream */ public void renderXML(XSLTInputHandler input, HttpServletResponse response) throws ServletException { try { ByteArrayOutputStream out = new ByteArrayOutputStream(); response.setContentType("application/pdf"); Driver driver = new Driver(); driver.setLogger(log); driver.setRenderer(Driver.RENDER_PDF); driver.setOutputStream(out); driver.render(input.getParser(), input.getInputSource()); byte[] content = out.toByteArray(); response.setContentLength(content.length); response.getOutputStream().write(content); response.getOutputStream().flush(); } catch (Exception ex) { throw new ServletException(ex); } } } } |
Dit is de XML :
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| <?xml version="1.0" encoding="UTF-8"?> <projectteam> <projectname>The Killer Application</projectname> <member> <name>John Doe</name> <function>lead</function> <email>jon.doe@killerapp.fun</email> </member> <member> <name>Paul Coder</name> <function>dev</function> <email>paul.coder@killerapp.fun</email> </member> </projectteam> |
en de XSLT:
XSLT:
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
| <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.1" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" exclude-result-prefixes="fo"> <xsl:output method="xml" version="1.0" omit-xml-declaration="no" indent="yes"/> <!-- ========================= --> <!-- root element: projectteam --> <!-- ========================= --> <xsl:template match="projectteam"> <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> <fo:layout-master-set> <fo:simple-page-master master-name="simpleA4" page-height="29.7cm" page-width="21cm" margin-top="2cm" margin-bottom="2cm" margin-left="2cm" margin-right="2cm"> <fo:region-body/> </fo:simple-page-master> </fo:layout-master-set> <fo:page-sequence master-reference="simpleA4"> <fo:flow flow-name="xsl-region-body"> <fo:block font-size="16pt" font-weight="bold" space-after="5mm">Project: <xsl:value-of select="projectname"/> </fo:block> <fo:block font-size="10pt"> <fo:table table-layout="fixed"> <fo:table-column column-width="4cm"/> <fo:table-column column-width="4cm"/> <fo:table-column column-width="5cm"/> <fo:table-body> <xsl:apply-templates/> </fo:table-body> </fo:table> </fo:block> </fo:flow> </fo:page-sequence> </fo:root> </xsl:template> <!-- ========================= --> <!-- child element: member --> <!-- ========================= --> <xsl:template match="member"> <fo:table-row> <xsl:if test="function = 'lead'"> <xsl:attribute name="font-weight">bold</xsl:attribute> </xsl:if> <fo:table-cell> <fo:block> <xsl:value-of select="name"/> </fo:block> </fo:table-cell> <fo:table-cell> <fo:block> <xsl:value-of select="function"/> </fo:block> </fo:table-cell> <fo:table-cell> <fo:block> <xsl:value-of select="email"/> </fo:block> </fo:table-cell> </fo:table-row> </xsl:template> </xsl:stylesheet> |
Als iemand me hiermee in de goeie richting kan schoppen, heel graag. Ik snap even niet helemaal wat te doen.
Erik