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         }

View Code

4、运行,然后找到生成的PDF文件,打开它

  1. 以上步驟只是完成了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 }

View Code

5.1 ftl引入字体样式

复制代码
<span class="symbol-text">✓</span>
  1. 在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     }

View Code

  1. 最后导出PDF看下
相关推荐
SuperherRo2 个月前
Web开发-JavaEE应用&SpringBoot栈&模版注入&Thymeleaf&Freemarker&Velocity
spring boot·java-ee·thymeleaf·freemarker·模板注入·velocity
会功夫的李白2 个月前
PDF嵌入隐藏的文字
java·pdf·itext
软件猫4 个月前
Itext pdf reader解析
itext·pdfreader
熊文豪5 个月前
使用 Java 和 FreeMarker 实现自动生成供货清单,动态生成 Word 文档,简化文档处理流程。
java·apache·freemarker
小小大侠客7 个月前
IText创建加盖公章的pdf文件并生成压缩文件
java·pdf·itext
唯丹之心8 个月前
使用freemarker实现在线展示文档功能开发,包括数据填充
java·spring boot·freemarker·1024程序员节·在线文档展示
VaporGas8 个月前
SSM框架实战小项目:打造高效用户管理系统 day3
vue·bootstrap·jquery·freemarker·jquery-validate
WineMonk1 年前
.NET C# 使用 iText 生成PDF
pdf·c#·.net·itext
小小大侠客1 年前
Java使用IText根据pdf模板创建pdf文件
java·pdf·itext