根据xsl模板及xml数据文件生成pdf(文字内容复制不乱码)

原创 2017年05月23日 15:33:53

使用FOP技术,配合xsl模板及XML数据生成PDF报表和线上打印业务。
主要依赖包:fop.jar

第一部分对数据处理

package com.cisetech.put.utils.fop;

import java.io.Serializable;

/**
 * <p>Title: </p>
 * <p>Description: </p>
 * @author hedl 2016/12/25
 * @version 1.0
 */
public class ReportData implements Serializable {
    private static final long serialVersionUID = -2722248902864797698L;

    private byte[] mbData = null;
    private String msContentType = null;

    public byte[] getData() {
        return mbData;
    }
    public void setData(byte[] pData) {
        mbData = pData;
    }
    public String getContentType() {
        return msContentType;
    }
    public void setContentType(String pContentType) {
        msContentType = pContentType;
    }
}

应用xsl模板进行PDF版面排版,使用XML方式组装需打印数据。

package com.cisetech.put.utils.fop;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;

import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.sax.SAXResult;
import javax.xml.transform.stream.StreamSource;

import org.apache.avalon.framework.logger.ConsoleLogger;
import org.apache.avalon.framework.logger.Logger;
import org.apache.fop.apps.Fop;
import org.apache.fop.apps.FopFactory;
import org.apache.fop.apps.MimeConstants;

/**
 * FopReport
 * @author hedl 2016/12/23
 */
public class FopReport {
    private static Logger log = new ConsoleLogger(ConsoleLogger.LEVEL_DEBUG);
    // 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 hedl 2016/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 hedl 2016/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;
    }

    public static void main(String[] args) {
        long t0 = System.currentTimeMillis();
        try {
            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>上海太平人寿集团</PartyA>");
            buf.append("        <PartyB>上海太平人寿数据共享中心</PartyB>");
            buf.append("    </ReportHeader>");
            buf.append("    <ReportBody>");
            buf.append("        <Table>");
            buf.append("            <TableRow>");
            buf.append("                <ItemName>附加条款1</ItemName>");
            buf.append("                <ItemTime>2016-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>");

            long t = System.currentTimeMillis();
            ReportData data = FopReport.createReport("report\\sample\\Sample.xsl", buf.toString().getBytes("UTF-8"));
            //data = FopReport.createReport("report\\sample\\Sample.xsl", "report\\sample\\Sample.xml");
            long t1 = System.currentTimeMillis();
            log.debug("time:" + (t1 - t));
            FileOutputStream fos = new FileOutputStream("D:/sample.pdf");
            fos.write(data.getData());
            fos.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        log.debug("use time:" + (System.currentTimeMillis() - t0));
    }
}

[水晶报表]服务器后台自动生成PDF等档案

记得以前用JDE ERP的时候,通过过设置参数自动跑报表。 我现在两个设想:第一,邮件预警也可以采取附件形式,有些情况配合附件 第二,单据审批完后自动保存当时的一份PDF文档。 方法:搭载水晶报表实现...

水晶报表导出pdf功能(完整的代码C#版)

using System;using System.Collections;using System.ComponentModel;using System.Configuration;using S...
  • zjfei
  • zjfei
  • 2010年03月20日 17:15
  • 1599

xsl-fo模板,pl/sql生成的xml数据源,R12输出PDF

xsl xslt xsl-fo xml publisher fop

修改开源xlslib使得支持输出UTF8中文Excel文件不乱码

http://xlslib.sourceforge.net修改开源xlslib使得支持输出UTF8中文Excel文件内容不乱码。在Ubuntu 64位环境下测试通过。希望大家支持。/** 在xlsli...

如何rename datafile name中存在乱码的数据文件

存在这样的情况create tablespace.. datafile or alter tablespace add datafile时加入数据文件的datafile name中存在乱码,例如以下例...
  • gyanp
  • gyanp
  • 2013年03月19日 16:39
  • 661

如何rename datafile name中存在乱码的数据文件

存在这样的情况create tablespace.. datafile or alter tablespace add datafile时加入数据文件的datafile name中存在乱码,例如以下例...
  • halou90
  • halou90
  • 2015年10月23日 08:42
  • 573

如何解决XSL转换XML的时候出现乱码的问题

XSL转换中文出现乱码的解决方案
  • kydkong
  • kydkong
  • 2015年11月28日 22:25
  • 1252

Python:生成特定内容的数据文件

工作中有时候要用到包含特殊数据的文件,来解决一些bug。比如Bluetooth中的Obex层传输文件,Server端收到的文件与原文件不匹配,这时就需要一个特殊文件(0x00~0xff的循环)。我们比...

centos/redhat安装node-echarts(后台生成echarts图片,中文不乱码)

后台生成echarts图表。
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:根据xsl模板及xml数据文件生成pdf(文字内容复制不乱码)
举报原因:
原因补充:

(最多只允许输入30个字)