Java生成支持中文的pdf
工具类使用背景
- Web项目为用户提供将报表、解决方案、文章等重要数据信息导出为PDF保存到本地电脑的功能,是必不可少的;所以需要一个通过freemark动态解析html,并将html转换为PDF和支持中文的工具类。
- 生成PDF需要使用到字体库,默认情况下linux是不支持中文的,所以当项目部署到linux的请记得先安装宋体字库,如何安装请百度“Linux添加宋体字库”;否则生成包含中文的PDF会展示乱码。
第三方依赖
<dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.31</version> </dependency> <dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version>5.5.13.2</version> </dependency> <dependency> <groupId>com.itextpdf.tool</groupId> <artifactId>xmlworker</artifactId> <version>5.5.13.2</version> </dependency>
核心代码
1.freemark动态解析html工具
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import java.io.IOException;
import java.io.StringWriter;
import java.io.Writer;
import java.nio.charset.Charset;
/**
* @author huangrusheng
* @version 1.0
* @date 2021/5/24 10:25
*/
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public final class FreeMarkUtil {
public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");
private static final Configuration configuration;
static {
configuration = new Configuration(Configuration.VERSION_2_3_30);
configuration.setDefaultEncoding(DEFAULT_CHARSET.name());
configuration.setClassLoaderForTemplateLoading(getDefaultClassLoader(), "ftl");
}
public static void parse(Object params, String templateName, Writer writer) throws IOException, TemplateException {
Template template = configuration.getTemplate(templateName);
template.process(params,writer);
}
public