在做项目的时候需要生成PDF,使用了fop技术实现
1、下载对应的jar包,不是maven工程直接下载
1.1 maven项目
2、下载相关字体和模板文件
2.1设置字体路径
2.2设置模板文件数据源
3、编写Java代码
public class FopReport extends BaseService{
private static final String TYPE = ".pdf";
private static final FopFactory fopFactory = FopFactory.newInstance();
private static final String CONRIGURL = "fop.xml";
/**
* 转PDF文件
* @param xsl 模板文件
* @param policy 数据对象
* @throws IOException
* @throws SAXException
*/
private ReportData createReport(File xsl,Object policy,boolean flag) throws IOException, SAXException {
ReportData reportData = new ReportData();
String userConfig = Configuration.getValue("pdf.font.path")+"/"+CONRIGURL;
logger.info("加载字体目录:"+Configuration.getValue("pdf.font.path")+"/"+CONRIGURL);
fopFactory.setUserConfig(userConfig); //读取自定义配置
ByteArrayOutputStream output = new ByteArrayOutputStream();
try {
Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, output);
TransformerFactory factory = TransformerFactory.newInstance();
String templateUrl = Configuration.getValue("pdf.template.path");
File xslFile = new File(new File(templateUrl),xsl.toString());
Transformer transformer = factory.newTransformer(new StreamSource(xslFile)); //模板文件
logger.info("加载模板:"+xslFile.toString());
String str = "";
if (!flag) {
Ojbect2Xml ox = new Ojbect2Xml();
str = ox.getFullXML(policy, "get");
} else {
str = policy.toString();
}
ByteArrayInputStream bytearrayinputstream = new ByteArrayInputStream(
str.getBytes("UTF-8"));
Charset charset = Charset.forName("UTF-8");
Reader r = new InputStreamReader(bytearrayinputstream, charset);
Source src = new StreamSource(r);
Result res = new SAXResult(fop.getDefaultHandler());
transformer.transform(src, res);
reportData.setPdfData(output.toByteArray());
writePdf(reportData);
} catch (Exception ex) {
ex.printStackTrace();
} finally {
output.close();
}
return reportData;
}
}
4、生成一个字节流文件,将文件流写出即可,最终效果