简述
生成pdf思路主要是分两种情况,情况一:如果模板里面不需要数组参数,那么可以根据html模板直接生成pdf;情况二:如果模板里面需要数组参数,需要先利用freemarker生成html模板,再根据html生成pdf。
网上文章很多,但是都是用File文件类来做演示和工具包,可用性不够广,并且伴有磁盘文件的创建与删除,影响效率,下面是用I/O流写的工具类
1. 导入所需要的maven依赖
org.xhtmlrenderer
core-renderer
R8
org.freemarker
freemarker
2.3.28
2、准备好一份html或freemarker模板文件
在html或freemarker转pdf时,会出现中文乱码或者中文不显示的问题,故我们需要在html或freemarker中引入外部的中文字体库,这里使用的是simsun.ttc,需要在html或freemark加入相应代码,如下所示:simsun.ttc下载地址
在html或freemark中加入:
/*解决html转pdf文件中文不显示的问题*/
body {
font-family: SimSun;
}
/*设定纸张大小*/
/* A4纸 */
/* @page{size:210mm*297mm} */
@page{size:a4}
3.PdfUtil工具类
package com.futurehotel.cik.biz.util;
import com.lowagie.text.DocumentException;
import com.lowagie.text.pdf.BaseFont;
import freemarker.cache.ByteArrayTemplateLoader;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import lombok.Cleanup;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.w3c.dom.Document;
import org.xhtmlrenderer.pdf.ITextFontResolver;
import org.xhtmlrenderer.pdf.ITextRenderer;
import org.xml.sax.SAXException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.*;
@Slf4j
public class PdfUtil {
public static void main(String[] args) throws Exception {
// @Cleanup InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("pdfTemplat