ITextRenderer freemarker 生成pdf demo,并解决中文不显示的问题

ITextRenderer freemarker 生成pdf demo,并解决中文不显示的问题

最少jar包

core-renderer-R8.jaritext-2.0.8.jarfreemarker-2.3.23.jar

package com.pdf;

import com.lowagie.text.DocumentException;

import com.lowagie.text.pdf.BaseFont;

import freemarker.template.Configuration;

import freemarker.template.Template;

import freemarker.template.TemplateException;

import org.xhtmlrenderer.pdf.ITextFontResolver;

import org.xhtmlrenderer.pdf.ITextRenderer;

import java.io.*;

import java.util.HashMap;

/**

* Created by admin on 2017/7/5.

*/

public class PdfHandler {

private static final String CONTRACT = "resource/contract/";//文件存储路径

private static final String TEMPLATE = "resource/templates/";//模板存储路径

private static final String PDFNAME = "pdfDemo";//pdf文件名

private static final String HTMLNAME = "pdfDemo";//html文件名

public static void contractHandler(String templateName,

HashMap paramMap) throws Exception {

// 获取本地模板存储路径、文件存储路径

String templatePath = TEMPLATE;

String contractPath = CONTRACT;

// 组装html和pdf合同的全路径URL

String localHtmlUrl = contractPath + HTMLNAME + ".html";

String localPdfPath = contractPath + "/";

// 判断本地路径是否存在如果不存在则创建

File localFile = new File(localPdfPath);

if (!localFile.exists()) {

localFile.mkdirs();

}

String localPdfUrl = localFile + "/" + PDFNAME + ".pdf";

templateName = templateName + ".ftl";

htmHandler(templatePath, templateName, localHtmlUrl, paramMap);// 生成html合同

pdfHandler(localHtmlUrl, localPdfUrl);// 根据html合同生成pdf合同

deleteFile(localHtmlUrl);// 删除html格式合同

System.out.println("PDF生成成功");

}

private static void deleteFile(String fileUrl) {

File file = new File(fileUrl);

file.delete();

}

private static void pdfHandler(String htmUrl, String pdfUrl) throws IOException, DocumentException {

File htmFile = new File(htmUrl);

File pdfFile = new File(pdfUrl);

String url = htmFile.toURI().toURL().toString();

OutputStream os = new FileOutputStream(pdfFile);

ITextRenderer renderer = new ITextRenderer();

renderer.setDocument(url);

ITextFontResolver fontResolver = renderer.getFontResolver();

fontResolver.addFont(TEMPLATE + "simsun.ttc", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);

renderer.layout();

renderer.createPDF(os);

os.close();

}

private static void htmHandler(String templatePath, String templateName, String hHtmlUrl, HashMap paramMap) throws IOException, TemplateException {

Configuration cfg = new Configuration(Configuration.VERSION_2_3_23);

cfg.setDefaultEncoding("UTF-8");

cfg.setDirectoryForTemplateLoading(new File(templatePath));

Template template = cfg.getTemplate(templateName);

File outHtmFile = new File(hHtmlUrl);

Writer writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outHtmFile)));

template.process(paramMap, writer);

writer.close();

}

public static void main(String[] args) throws Exception {

String templateName = "201";

HashMap paramMap = new HashMap<>();

paramMap.put("user", "nihao");

paramMap.put("url", "192.168.1.2");

paramMap.put("name", "生成成功");

contractHandler(templateName, paramMap);

}

}

其中解决中文问题java代码如下:(此处:.addFont() 方法中 “simsun.ttc” 后不加 “,” ;与BaseFont.createFont 不同

ITextFontResolver fontResolver = renderer.getFontResolver();

fontResolver.addFont(TEMPLATE + "simsun.ttc", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);

对应的ftl文件中必须加上 : body{font-family: SimSun},并且只有body中能显示中文,body外部分不显示

</p> <p>welcome!</p> <p>

welcome! ${user}${name}

用户名:${user}

URL:${url}

姓名:${name}

姓名:${name} URL:${url}

你可能也喜欢

DEEMO魔王曲排行 V3.7
365限制投注额度怎么办

DEEMO魔王曲排行 V3.7

📅 01-25 👀 5552
魔兽世界怀旧服:狮王休玛刷新地点与时间全解析
365限制投注额度怎么办

魔兽世界怀旧服:狮王休玛刷新地点与时间全解析

📅 11-14 👀 301
benefit更多的中文(简体)翻译
365bet地址

benefit更多的中文(简体)翻译

📅 08-28 👀 6397
库尔勒小妹揭秘:揭秘真实联系方式背后的故事
365bet开户在线

库尔勒小妹揭秘:揭秘真实联系方式背后的故事

📅 10-24 👀 5215
媒体音量关闭后提示音也没有了
365bet地址

媒体音量关闭后提示音也没有了

📅 07-11 👀 931
1,000 美元 兑人民币 汇率。将 USD 兑换成 CNY
365限制投注额度怎么办

1,000 美元 兑人民币 汇率。将 USD 兑换成 CNY

📅 07-04 👀 7195
Q5:Word 適合哪種類型的文件處理?
365bet地址

Q5:Word 適合哪種類型的文件處理?

📅 09-22 👀 2100
多类猫头鹰两耳不对称 助于准确判断猎物方位
365bet开户在线

多类猫头鹰两耳不对称 助于准确判断猎物方位

📅 07-12 👀 3522
[经脉]【经脉推荐】2025年4月门派调整之狮驼岭经脉推荐