Itex+freemarker 导出PDF文件时✓无法正常显示
在使用Itex+freemarker 导出PDF文件时✓无法正常显示
在网上看到了以下思路:经过实验后是靠谱的
1、首先打开一个word文件,输入这个特殊字符,然后在字体选择框里看见这个特殊字符所用的字体,就是“Segoe UI Symbol”

2、然后打开C:\Windows\Fonts,找到这个字体的文件,右键点击弹出菜单栏点进属性,复制它的文件名“SIMLI.TTF”

3、然后编辑代码,把字体文件换成这个

1 public static void main(String[] args)throws IOException, DocumentException{
2 Document document = new Document();
3 OutputStream os = new FileOutputStream(new File("D:/hello99.pdf"));
4 PdfWriter.getInstance(document,os);
5 document.open();
6
7 //C:/Windows/Fonts/seguisym.ttf
8 BaseFont baseFont = BaseFont.createFont("C:/Windows/Fonts/seguisym.ttf",BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);
9 com.itextpdf.text.Font font = new com.itextpdf.text.Font(baseFont, 12);
10
11 document.add(new Paragraph("",font));
12 document.add(new Paragraph("✓",font));
13 document.close();
14 }
4、运行,然后找到生成的PDF文件,打开它

5. 以上步驟只是完成了Itex导出PDF文件时显示特殊字符,但是通过freemarker渲染后转成的PDF还是没办法显示
此时需要在对应的ftl也配置上对应的字体
5.1 先自定义字体

1 /*自定义字体*/
2 @font-face {
3 font-family: 'Segoe UI Symbol';
4 src: url('../fonts/seguisym.ttf') format('truetype');
5 font-weight: normal;
6 font-style: normal;
7 }
8
9 /*引入字体样式*/
10 .symbol-text {
11 font-family: 'Segoe UI Symbol', sans-serif;
12 }
5.1 ftl引入字体样式
<span class="symbol-text">✓</span>
6. 在java代码中将字体样式嵌入itext中

1 public String createPdfByHtml(final String html) throws Exception {
2 String outputFile = getTempName(pdfFileRootDir, PDF_SUFFIX_NAME);
3 File filePath = new File(pdfFileRootDir);
4
5 if (!filePath.exists()) {
6 filePath.mkdirs();
7 }
8 OutputStream os = null;
9 ITextRenderer renderer = null;
10 try {
11 os = new FileOutputStream(outputFile);
12 renderer = new ITextRenderer();
13 renderer.setDocumentFromString(html);
14 ITextFontResolver fontResolver = renderer.getFontResolver();
15 fontResolver.addFont(buildAbsoluteFilePath("FONT") + MINGLIU, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
16 fontResolver.addFont(buildAbsoluteFilePath("FONT") + MINGLIUB, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
17 fontResolver.addFont(buildAbsoluteFilePath("FONT") + FANGSONGGB2312, BaseFont.IDENTITY_H,
18 BaseFont.NOT_EMBEDDED);// 仿宋_GB2312
19 fontResolver.addFont(buildAbsoluteFilePath("FONT") + HUAWENZHONGSONG, BaseFont.IDENTITY_H,
20 BaseFont.NOT_EMBEDDED);// 华文中宋
21 fontResolver.addFont(buildAbsoluteFilePath("FONT") + SIMSUN, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
22 fontResolver.addFont(buildAbsoluteFilePath("FONT") + MSYH, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
23 fontResolver.addFont(buildAbsoluteFilePath("FONT") + FZXIAOBIAOSONG_B05S, BaseFont.IDENTITY_H,
24 BaseFont.NOT_EMBEDDED);
25 // 字体包
26 fontResolver.addFont(buildAbsoluteFilePath("FONT") + SIMHEI, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
27 // 黑体
28 fontResolver.addFont(buildAbsoluteFilePath("FONT") + ARIAL, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
29 // Arail
30 fontResolver.addFont(buildAbsoluteFilePath("FONT") + ARIAL_B, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED); // Arail
31 fontResolver.addFont(buildAbsoluteFilePath("FONT") + ARIAL_I, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED); // Arail
32 // Times New Roman
33 fontResolver.addFont(buildAbsoluteFilePath("FONT") + TIMES, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
34 // Times New Roman
35 fontResolver.addFont(buildAbsoluteFilePath("FONT") + TIMES_B, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
36 fontResolver.addFont(buildAbsoluteFilePath("FONT") + JDHEI, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
37 fontResolver.addFont(buildAbsoluteFilePath("FONT") + MSHEI, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
38 fontResolver.addFont(buildAbsoluteFilePath("FONT") + STXINGKAI, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
39 fontResolver.addFont(buildAbsoluteFilePath("FONT") + KAITI, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
40 fontResolver.addFont(buildAbsoluteFilePath("FONT")+SEGUISYM, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
41
42 renderer.layout();
43 renderer.createPDF(os);
44 os.flush();
45
46 // 返回生成PDF文件的路径和名字 ,以保存数据库
47 return outputFile;
48 } catch (Exception e) {
49 // PDF生成失败,需要将临时文件删除
50 PDFUtil.deleteFile(outputFile);
51 throw new ServiceException("html转化pdf异常:xml = " + html);
52 } finally {
53 // os.close();
54 os = null;
55 renderer = null;
56 }
57
58 }
7. 最后导出PDF看下

Itex+freemarker 导出PDF文件时✓无法正常显示的更多相关文章
- 纯前端导出pdf文件
纯前端js导出pdf,已经用于生产环境. 工具: 1.html2canvas,一种让html转换为图片的工具. 2.pdfmake或者jspdf ,一种生成.编辑pdf,并且导出pdf的工具. pdf ...
- .Net导出pdf文件,C#实现pdf导出
最近碰见个需求需要实现导出pdf文件,上网查了下代码资料总结了以下代码.可以成功的实现导出pdf文件. 在编码前需要在网上下载个itextsharp.dll,此程序集是必备的.楼主下载的是5.0版本, ...
- 利用ITextSharp导出PDF文件
最近项目中需要到处PDF文件,最后上网搜索了一下,发现ITextSharp比较好用,所以做了一个例子: public string ExportPDF() { //ITextSharp Usage / ...
- 史上最全的springboot导出pdf文件
最近项目有一个导出报表文件的需求,我脑中闪过第一念头就是导出pdf(产品经理没有硬性规定导出excel还是pdf文件),于是赶紧上网查看相关的资料,直到踩了无数的坑把功能做出来了才知道其实导出exce ...
- .Net导出pdf文件,C#实现pdf导出 转载 http://www.cnblogs.com/hmYao/p/5842958.html
导出pdf文件. 在编码前需要在网上下载个itextsharp.dll,此程序集是必备的.楼主下载的是5.0版本,之前下了个5.4的似乎不好用. 下载之后直接添加引用. <%@ Page Lan ...
- asp.net2.0导出pdf文件完美解决方案【转载】
asp.net2.0导出pdf文件完美解决方案 作者:清清月儿 PDF简介:PDF(Portable Document Format)文件格式是Adobe公司开发的电子文件格式.这种文件格式与操作系统 ...
- Itext2.0.8 和freemarker导出pdf
这个是跟上一篇写的freemarker导出word是一块的.但是关联性不是很大.由于本人技术有限本篇导出也是根据网上大家的做出的demo混合而成.有不足的地方请大家指出.好改正,使以后看到的freem ...
- C# 利用ITextSharp导出PDF文件
最近项目中需要导出PDF文件,最后上网搜索了一下,发现ITextSharp比较好用,所以做了一个例子: public string ExportPDF() { //ITextSharp Usage / ...
- Java导出pdf文件数据
提示:导出pdf文件,需要3个jar包iText-2.1.5.jar,iTextAsian.jar,iText-rtf-2.1.4.jar. public boolean outputPdfJhsy( ...
- 水晶报表导出pdf文件
/// <summary> /// 导出pdf文件 /// </summary> /// <param name="mjsReport">报表文 ...
随机推荐
- C#(面向对象的托管语言)类库(区别于应用程序)的异常处理思路
1.不要做出任何应用程序才需要考虑抉择策略,不能想当然的决定一些错误情形.具体的一个体现形式是什么异常都捕获.这不是类库的职责,因为无法掌握所有的调用者的使用情形,这些不确定性是委托.虚方法.接口等特 ...
- 解决 Ubuntu 22.04 下 flameshot 截图工具无法使用的问题
问题描述 flameshot 是 Linux 端广受好评的一款截图工具,但在 Ubuntu 22.04 中,安装完成后却不能使用,表现为截图命令无响应,或截图过程报错. 通过查阅 flameshot ...
- Arrays工具类教你优雅地管理数组数据
数组专用工具类指的是 java.util.Arrays 类,基本上常见的数组操作,这个类都提供了静态方法可供直接调用.毕竟数组本身想完成这些操作还是挺麻烦的,有了这层封装,就方便多了. package ...
- Windows 终端远程连接 Ubuntu
博客地址:https://www.cnblogs.com/zylyehuo/ 查看 ip 的方式参考以下链接 Ubuntu 下查看 ip - zylyehuo - 博客园 在 windows 终端中执 ...
- K8S 问题排查: cgroup 内存泄露问题
Posted on 2019年12月6日Leave a comment Contents [hide] 1 前言 2 现象 3 原因 4 解决方案 4.1 方案一 4.2 方案二 4.3 方案三 5 ...
- vue实现不同用户权限的方法
Vue 实现不同用户权限的方法 在项目中,实现不同用户的权限控制是常见的需求也是常见的功能模块,例如管理系统中不同角色(管理员.普通用户等)应有不同的访问权限,小程序.App等在不同角色登入的时候显示 ...
- DeepSeek 官方推出的实用集成工具百宝箱,建议收藏!
项目介绍 该实用集成工具百宝箱汇聚了DeepSeek官方精心挑选和推荐的各类集成工具(其中包括:应用程序.AI Agent 框架.AI数据应用框架.RAG 框架.浏览器插件.VS Code 插件等), ...
- String类的三种常见构造方法
1.根据构造方法创建字符串对象 1.public String() 创建一个空字符串,里面不包含任何内容 2.public String(char[] chs) 创建一个字符数组,将其拼接成字符串对象 ...
- Web前端入门第 24 问:CSS 单位
单位就是那个形容长度大小的东西.比如身高180cm(厘米),cm就是单位. css 也不例外,要描述一个盒子的大小,就必须要用到单位. css 单位根据其作用分为几大类:绝对单位.相对单位.视口单位. ...
- JBoltAI Function Call技术解析:如何实现AI模型与企业系统的无缝对话
JBoltAI Function Call技术解析: 如何实现AI模型与企业系统的无缝对话 在企业级AI应用开发中,如何让大模型能力与现有系统高效协同一直是技术难点.JBoltAI框架通过Functi ...