本例可将xml格式数据按xsl模板转化为PDF
1.首先,程序结构如下:
2.FopReport.java
3.拼接xml文件
4.生成PDF文档
5.附字体配置fop.xml
6.效果图如下:
1.首先,程序结构如下:
2.FopReport.java
- // Step 1: Construct a FopFactory
- private static final FopFactory fopFactory = FopFactory.newInstance();
- /**
- * 根据xsl模板及xml数据文件生成pdf
- * @param xsltFile xsl模板
- * @param xmlFile xml数据文件
- * @return ReportData
- * @throws Exception
- * @author bin.yin 2012/12/25
- */
- public static ReportData createReport(String xsltFile, String xmlFile) throws Exception {
- ReportData reportData = new ReportData();
- reportData.setContentType("application/pdf");
- fopFactory.setUserConfig("conf/fop.xml");
- // Step 2: Set up output stream.
- ByteArrayOutputStream out = new ByteArrayOutputStream();
- try {
- // Step 3: Construct fop with desired output format
- Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, out);
- // Step 4: Setup XSLT using identity transformer
- TransformerFactory factory = TransformerFactory.newInstance();
- Transformer transformer = factory.newTransformer(new StreamSource(new File(xsltFile)));
- // Step 5: Setup input and output for XSLT transformation
- Source src = new StreamSource(new File(xmlFile));
- // Source src = new StreamSource(new StringReader(myString));
- // Step 6: Resulting SAX events (the generated FO) must be piped through to FOP
- Result res = new SAXResult(fop.getDefaultHandler());
- // Step 7: Start XSLT transformation and FOP processing
- transformer.transform(src, res);
- reportData.setData(out.toByteArray());
- } catch(Exception e) {
- throw e;
- } finally {
- out.close();
- }
- return reportData;
- }
- /**
- * 根据xsl模板及xml字节数组生成pdf
- * @param xsltFile xsl模板
- * @param bXmlData xml字节数组 eg. StringBuffer buf = new StringBuffer(); buf.getBytes("UTF-8");
- * @return ReportData
- * @throws Exception
- * @author bin.yin 2012/12/25
- */
- public static ReportData createReport(String xsltFile, byte[] bXmlData) throws Exception {
- ReportData reportData = new ReportData();
- try {
- // convert xml bytes to a temp file
- File xmlFile = File.createTempFile("FOP", ".tmp");
- FileOutputStream fos = new FileOutputStream(xmlFile);
- fos.write(bXmlData);
- fos.close();
- reportData = createReport(xsltFile, xmlFile.getAbsolutePath());
- // delete temp file
- xmlFile.delete();
- } catch (Exception e) {
- throw e;
- }
- return reportData;
- }
3.拼接xml文件
- StringBuffer buf = new StringBuffer();
- buf.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
- buf.append("<ItemListReport>");
- buf.append(" <ReportHeader>");
- buf.append(" <Title>附加条款</Title>");
- buf.append(" <PartyA>上海信息技术有限公司B</PartyA>");
- buf.append(" <PartyB>上海信息技术有限公司B</PartyB>");
- buf.append(" </ReportHeader>");
- buf.append(" <ReportBody>");
- buf.append(" <Table>");
- buf.append(" <TableRow>");
- buf.append(" <ItemName>附加条款1</ItemName>");
- buf.append(" <ItemTime>2012-12-23 09:03</ItemTime>");
- buf.append(" </TableRow>");
- buf.append(" <TableRow>");
- buf.append(" <ItemName>上海信息技术有限公司附加条款1</ItemName>");
- buf.append(" <ItemTime>2012-12-23 09:03</ItemTime>");
- buf.append(" </TableRow>");
- buf.append(" </Table>");
- buf.append(" </ReportBody>");
- buf.append(" <ReportFooter>");
- buf.append(" <PrintDate>2012-12-12</PrintDate>");
- buf.append(" <ReportNo>010123456789</ReportNo>");
- buf.append(" </ReportFooter>");
- buf.append("</ItemListReport>");
4.生成PDF文档
- ReportData data = FopReport.createReport("report\\sample\\Sample.xsl", buf.toString().getBytes("UTF-8"));
- FileOutputStream fos = new FileOutputStream("D:/sample.pdf");
5.附字体配置fop.xml
- <font metrics-url="conf/fonts/SimSun.xml" kerning="yes" embed-url="conf/fonts/SimSun.ttc">
- <font-triplet name="SimSun" style="normal" weight="normal" />
- <font-triplet name="SimSun" style="normal" weight="bold" />
- <font-triplet name="SimSun" style="italic" weight="normal" />
- <font-triplet name="SimSun" style="italic" weight="bold" />
- </font>
6.效果图如下: