由于工作需要,要实现后端根据模板动态填充数据生成PDF文档,通过技术选型,使用Ireport5.6来设计模板,结合JasperReports5.6工具库来调用渲染生成PDF文档。本人文采欠缺,写作能力差,下面粗略的介绍其使用步骤,若有不对的地方,望大家莫喷,谢谢!
一、使用Ireport designer 5.6设计模板
ireport的使用由于时间关系不便多说,设计好之后,将其进行编译生成jasper文件,然后将其拷贝放置于项目某个目录下,以供访问获取该文件。
二、在Spring Boot项目中引入依赖包
net.sf.jasperreports jasperreports 6.0.0 net.sf.jasperreports jasperreports-fonts 6.0.0 com.itextpdf itextpdf 5.5.0 com.itextpdf itext-pdfa 5.5.0 com.itextpdf itext-asian 5.2.0 复制代码 org.codehaus.groovy groovy-all 2.4.11
三、自定义spring mvc通用导出PDF视图类PdfReportView(继承自AbstractView )
import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.io.UnsupportedEncodingException;import java.net.URLEncoder;import java.util.HashMap;import java.util.Map;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import net.sf.jasperreports.engine.JRDataSource;import net.sf.jasperreports.engine.JREmptyDataSource;import net.sf.jasperreports.engine.JasperExportManager;import net.sf.jasperreports.engine.JasperFillManager;import net.sf.jasperreports.engine.JasperPrint;import org.springframework.web.servlet.view.AbstractView;public class PdfReportView extends AbstractView { private static final String CONTENT_TYPE = "application/pdf"; private String templatePath; private String exportFileName; public PdfReportView(String templatePath, String exportFileName) { this.templatePath = templatePath; if (exportFileName != null) { try { exportFileName = URLEncoder.encode(exportFileName, "UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } this.exportFileName = exportFileName; setContentType(CONTENT_TYPE); } protected MapgetParamsMap(Map map) throws Exception { Map params = new HashMap<>(); for (String key : map.keySet()) { Object val = map.get(key); if (val instanceof JRDataSource) { continue; } else { params.put(key, val); } } return params; } protected JRDataSource getDataSource(Map map) throws Exception { for (String key : map.keySet()) { Object val = map.get(key); if (val instanceof JRDataSource) { return (JRDataSource) map.get(key); } } return new JREmptyDataSource(); } @Override protected void renderMergedOutputModel(Map map, HttpServletRequest request, HttpServletResponse response) throws Exception { response.setCharacterEncoding("utf-8"); response.setContentType(getContentType()); //response.setContentType("application/octet-stream"); response.setHeader("content-disposition", "attachment;filename=" + exportFileName + ".pdf"); try (InputStream inputStream = Thread.currentThread().getContextClassLoader() .getResourceAsStream(templatePath)) { try (OutputStream ouputStream = response.getOutputStream()) { JasperPrint jasperPrint = JasperFillManager .fillReport(inputStream, getParamsMap(map), getDataSource(map)); JasperExportManager.exportReportToPdfStream(jasperPrint, ouputStream); } catch (IOException e) { e.printStackTrace(); } } catch (IOException e) { e.printStackTrace(); } }}复制代码
四、spring mvc调用案例
Mapmap = new HashMap<>();List
五、解决linux下宋体渲染问题
1、在src/main/resources路径下新建jasperreports_extension.properties文件,内容如下:
net.sf.jasperreports.awt.ignore.missing.font=true net.sf.jasperreports.extension.registry.factory.simple.font.families=net.sf.jasperreports.engine.fonts.SimpleFontExtensionsRegistryFactory net.sf.jasperreports.extension.simple.font.families.dejavu=fonts/fonts.xml 复制代码
2、在src/main/resources路径下新建fonts目录,并新建fonts.xml文件,内容如下:
复制代码 net/sf/jasperreports/fonts/dejavu/DejaVuSans.ttf net/sf/jasperreports/fonts/dejavu/DejaVuSans-Bold.ttf net/sf/jasperreports/fonts/dejavu/DejaVuSans-Oblique.ttf net/sf/jasperreports/fonts/dejavu/DejaVuSans-BoldOblique.ttf Identity-H true 'DejaVu Sans', Arial, Helvetica, sans-serif 'DejaVu Sans', Arial, Helvetica, sans-serif net/sf/jasperreports/fonts/dejavu/DejaVuSerif.ttf net/sf/jasperreports/fonts/dejavu/DejaVuSerif-Bold.ttf net/sf/jasperreports/fonts/dejavu/DejaVuSerif-Italic.ttf net/sf/jasperreports/fonts/dejavu/DejaVuSerif-BoldItalic.ttf Identity-H true 'DejaVu Serif', 'Times New Roman', Times, serif 'DejaVu Serif', 'Times New Roman', Times, serif net/sf/jasperreports/fonts/dejavu/DejaVuSansMono.ttf net/sf/jasperreports/fonts/dejavu/DejaVuSansMono-Bold.ttf net/sf/jasperreports/fonts/dejavu/DejaVuSansMono-Oblique.ttf net/sf/jasperreports/fonts/dejavu/DejaVuSansMono-BoldOblique.ttf Identity-H true 'DejaVu Sans Mono', 'Courier New', Courier, monospace 'DejaVu Sans Mono', 'Courier New', Courier, monospace 'DejaVu Sans', Arial, Helvetica, sans-serif 'DejaVu Sans', Arial, Helvetica, sans-serif 'DejaVu Serif', 'Times New Roman', Times, serif 'DejaVu Serif', 'Times New Roman', Times, serif 'DejaVu Sans Mono', 'Courier New', Courier, monospace 'DejaVu Sans Mono', 'Courier New', Courier, monospace fonts/simsun.ttf fonts/simsun.ttf fonts/simsun.ttf fonts/simsun.ttf Identity-H true '宋体', Arial, Helvetica, sans-serif '宋体', Arial, Helvetica, sans-serif
3、在src/main/resources/fonts目录放入宋体字体文件 simsun.ttf