调用方法:
<dependency>
<groupId>com.lowagie</groupId>
<artifactId>itext</artifactId>
<version>2.0.8</version>
</dependency>
<dependency>
<groupId>org.xhtmlrenderer</groupId>
<artifactId>core-renderer</artifactId>
<version>R8</version>
</dependency>
@RequestMapping("/creditAgreementPDFDownload")
@ResponseBody
public void creditAgreementPDFDownload(HttpServletRequest request, HttpServletResponse response) throws Exception {
//数据封装部分
Map map = new HashMap<String, String>();
map.put("test", "---中国---");
try {
ByteArrayOutputStream baos = PDFUtil.createPDF(request, "creditAgreementPDF.ftl", map);
System.out.println(baos);
//设置response文件头
PDFUtil.renderPdf(response, baos.toByteArray(), "123");
} catch (Exception e) {
throw new Exception(e);
}
}
/**
* 生成PDF文件流
* @param request
* @param ftlName 文件名称
* @param root 数据
* @return ByteArrayOutputStream
* @throws Exception
*/
public static ByteArrayOutputStream createPDF(HttpServletRequest request, String ftlName, Object root) throws Exception {
String basePath = request.getSession().getServletContext().getRealPath("/");//绝对路径
Configuration cfg = new Configuration();
try {
cfg.setLocale(Locale.CHINA);
cfg.setEncoding(Locale.CHINA, "UTF-8");
//设置编码
cfg.setDefaultEncoding("UTF-8");
//设置模板路径
cfg.setDirectoryForTemplateLoading(new File(basePath + "/WEB-INF/ftl/"));
//获取模板
Template template = cfg.getTemplate(ftlName);
template.setEncoding("UTF-8");
ITextRenderer iTextRenderer = new ITextRenderer();
//设置字体
ITextFontResolver fontResolver = iTextRenderer.getFontResolver();
fontResolver.addFont(basePath + "/WEB-INF/classes/simsun.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
Writer writer = new StringWriter();
//数据填充模板
template.process(root, writer);
//设置输出文件内容及路径
String str = writer.toString();
iTextRenderer.setDocumentFromString(str);
iTextRenderer.getSharedContext().setBaseURL("file:/D:");//共享路径file:/home/ddcj/
iTextRenderer.layout();
//生成PDF
ByteArrayOutputStream baos = new ByteArrayOutputStream();
iTextRenderer.createPDF(baos);
baos.close();
return baos;
} catch(Exception e) {
throw new Exception(e);
}
}
//此方法主要是设置文件头,并把文件作为附件下载
public static void renderPdf(HttpServletResponse response, final byte[] bytes, final String filename) {
setFileDownloadHeader(response, filename, ".pdf");
if (null != bytes) {
try {
response.getOutputStream().write(bytes);
response.getOutputStream().flush();
} catch (IOException e) {
throw new IllegalArgumentException(e);
}
}
}
/**
* 设置让浏览器弹出下载对话框的Header.
* @param fileName下载后的文件名.
*/
public static void setFileDownloadHeader(HttpServletResponse response, String fileName, String fileType) {
try {
// 中文文件名支持
String encodedfileName = new String(fileName.getBytes("GBK"), "ISO8859-1");
response.setHeader("Content-Disposition", "attachment; filename=\"" + encodedfileName + fileType + "\"");
} catch (UnsupportedEncodingException e) {
}
}
导出失败,提示导出路径异常;
替换异常jar
<dependency>
<groupId>xalan</groupId>
<artifactId>xalan</artifactId>
<version>2.7.1</version>
</dependency>
先存在的问题:导出表格列数比较多时,有一部分列显示不出来;