itext提供可HTML转PDF的工具包,但是在中文字体时也许会遇到意想不到的问题。特别宋体对应的粗体。

0x01:引入itext包

<dependency><groupId>com.itextpdf</groupId><artifactId>itext7-core</artifactId><version>7.1.11</version><type>pom</type></dependency><dependency><groupId>com.itextpdf</groupId><artifactId>html2pdf</artifactId><version>2.0.2</version>
</dependency>

0x02:要转换的HTML文件

 <head>
</head>
<body><p>iText</p><div><b>大发发发萨法发发呆发呆东方大厦发</b></div><div style="font-family:SimSun;weight:normal">Your developer here法大大是地方大发顺丰萨法发顺丰的here法大大是地方大发顺丰萨法发顺丰的here法大大是地方大发顺丰萨法发顺丰的here法大大是地方大发顺丰萨法发顺丰的here法大大是地方大发顺丰萨法发顺丰的here法大大是地方大发顺丰萨法发顺丰的here法大大是地方大发顺丰萨法发顺丰的journey with iText begins here法大大是地方大发顺丰萨法发顺丰的</div><div style="font-family:SimSun;font-weight:bold">Your developer here法大大是地方大发顺丰萨法发顺丰的here法大大是地方大发顺丰萨法发顺丰的here法大大是地方大发顺丰萨法发顺丰的here法大大是地方大发顺丰萨法发顺丰的here法大大是地方大发顺丰萨法发顺丰的here法大大是地方大发顺丰萨法发顺丰的here法大大是地方大发顺丰萨法发顺丰的journey with iText begins here法大大是地方大发顺丰萨法发顺丰的</div><p>iText</p><div><b>大发发发萨法发发呆发呆东方大厦发</b></div><div style="font-family:宋体;weight:normal">Your developer here法大大是地方大发顺丰萨法发顺丰的here法大大是地方大发顺丰萨法发顺丰的here法大大是地方大发顺丰萨法发顺丰的here法大大是地方大发顺丰萨法发顺丰的here法大大是地方大发顺丰萨法发顺丰的here法大大是地方大发顺丰萨法发顺丰的here法大大是地方大发顺丰萨法发顺丰的journey with iText begins here法大大是地方大发顺丰萨法发顺丰的</div><div style="font-family:宋体;font-weight:bold">Your developer here法大大是地方大发顺丰萨法发顺丰的here法大大是地方大发顺丰萨法发顺丰的here法大大是地方大发顺丰萨法发顺丰的here法大大是地方大发顺丰萨法发顺丰的here法大大是地方大发顺丰萨法发顺丰的here法大大是地方大发顺丰萨法发顺丰的here法大大是地方大发顺丰萨法发顺丰的journey with iText begins here法大大是地方大发顺丰萨法发顺丰的</div></body>

0x03:编写代码

import java.io.IOException;import com.itextpdf.io.font.FontConstants;
import com.itextpdf.kernel.events.Event;
import com.itextpdf.kernel.events.IEventHandler;
import com.itextpdf.kernel.events.PdfDocumentEvent;
import com.itextpdf.kernel.font.PdfFontFactory;
import com.itextpdf.kernel.geom.Rectangle;
import com.itextpdf.kernel.pdf.canvas.PdfCanvas;
import com.itextpdf.layout.Document;public class TextFooterEventHandler implements IEventHandler {private Document doc;private int page;public TextFooterEventHandler(Document doc) {this.doc = doc;}public void handleEvent(Event event) {PdfDocumentEvent docEvent = (PdfDocumentEvent) event;PdfCanvas canvas = new PdfCanvas(docEvent.getPage());Rectangle pageSize = docEvent.getPage().getPageSize();page++;canvas.beginText();try {canvas.setFontAndSize(PdfFontFactory.createFont(FontConstants.HELVETICA_OBLIQUE), 15);} catch (IOException e) {e.printStackTrace();}canvas.moveText((pageSize.getRight() - doc.getRightMargin() + (pageSize.getLeft() + doc.getLeftMargin())) / 2,pageSize.getBottom() + doc.getBottomMargin()).showText("" + page).endText().release();}}
  • itext默认字体

public static void defaultFont() throws Exception{try {String pdfPath = "C:\\Users\\2230\\Desktop\\a\\defaultFont.pdf";PdfWriter pdfWriter = new PdfWriter(new File(pdfPath));PdfDocument pdfDocument = new PdfDocument(pdfWriter) ;Document doc = new Document(pdfDocument);pdfDocument.setDefaultPageSize(PageSize.A4);pdfDocument.addEventHandler(PdfDocumentEvent.END_PAGE, new TextFooterEventHandler(doc));ConverterProperties pro =  new ConverterProperties();FontProvider fontProvider = new DefaultFontProvider();fontProvider.addSystemFonts();pro.setFontProvider(fontProvider);HtmlConverter.convertToPdf(new FileInputStream("C:\\Users\\2230\\Desktop\\a\\d.html"), pdfDocument, pro);} catch (Exception e) {e.printStackTrace();}}

默认转换结果

  • 加载宋体

这里只加载了宋体,没有加载宋粗体

public static void songTiDefaultFont() throws Exception{try{String pdfPath = "C:\\Users\\2230\\Desktop\\a\\songTiDefaultFont.pdf";PdfWriter pdfWriter = new PdfWriter(new File(pdfPath));PdfDocument pdfDocument = new PdfDocument(pdfWriter) ;Document doc = new Document(pdfDocument);pdfDocument.setDefaultPageSize(PageSize.A4);pdfDocument.addEventHandler(PdfDocumentEvent.END_PAGE, new TextFooterEventHandler(doc));ConverterProperties pro =  new ConverterProperties();FontProvider fontProvider = new DefaultFontProvider();//宋体FontProgram fontProgram1 = FontProgramFactory.createFont("C:\\Users\\2230\\Desktop\\a\\simsun.ttc,1");fontProvider.addFont(fontProgram1);pro.setFontProvider(fontProvider);HtmlConverter.convertToPdf(new FileInputStream("C:\\Users\\2230\\Desktop\\a\\d.html"), pdfDocument, pro);} catch (Exception e) {e.printStackTrace();}}

发现转换出来的PDF,丢失了字体样式

分析原因发现C:\Windows\Fonts默认没有宋体粗字体,默认只有宋体常规

网上下载宋体粗字体宋体-粗体.ttf,下载的都是ttf格式;代码加载宋体粗字体

public static void songTiDefaultFont() throws Exception{try{String pdfPath = "C:\\Users\\2230\\Desktop\\a\\songTiDefaultFont.pdf";PdfWriter pdfWriter = new PdfWriter(new File(pdfPath));PdfDocument pdfDocument = new PdfDocument(pdfWriter) ;Document doc = new Document(pdfDocument);pdfDocument.setDefaultPageSize(PageSize.A4);pdfDocument.addEventHandler(PdfDocumentEvent.END_PAGE, new TextFooterEventHandler(doc));ConverterProperties pro =  new ConverterProperties();FontProvider fontProvider = new DefaultFontProvider();//宋体FontProgram fontProgram1 = FontProgramFactory.createFont("C:\\Users\\2230\\Desktop\\a\\simsun.ttc,1");fontProvider.addFont(fontProgram1);//宋体粗体FontProgram fontProgram2 = FontProgramFactory.createFont("C:\\Users\\2230\\Desktop\\a\\宋体-粗体.ttf");fontProvider.addFont(fontProgram2);pro.setFontProvider(fontProvider);HtmlConverter.convertToPdf(new FileInputStream("C:\\Users\\2230\\Desktop\\a\\d.html"), pdfDocument, pro);} catch (Exception e) {e.printStackTrace();}}

多加了如下代码:

执行直接报错,字体无法加载

  • 把ttf转换成otf格式字体

在线转换工具:https://www.fontke.com/tool/convfont 

public static void songConvertTiFont() throws Exception{try{String pdfPath = "C:\\Users\\2230\\Desktop\\a\\songTiFont.pdf";PdfWriter pdfWriter = new PdfWriter(new File(pdfPath));PdfDocument pdfDocument = new PdfDocument(pdfWriter) ;Document doc = new Document(pdfDocument);pdfDocument.setDefaultPageSize(PageSize.A4);pdfDocument.addEventHandler(PdfDocumentEvent.END_PAGE, new TextFooterEventHandler(doc));ConverterProperties pro =  new ConverterProperties();FontProvider fontProvider = new DefaultFontProvider();fontProvider.addSystemFonts();//宋体FontProgram fontProgram1 = FontProgramFactory.createFont("C:\\Users\\2230\\Desktop\\a\\simsun.ttc,0");fontProvider.addFont(fontProgram1);//宋体粗体FontProgram fontProgram2 = FontProgramFactory.createFont("C:\\Users\\2230\\Desktop\\a\\宋体-粗体.otf");fontProvider.addFont(fontProgram2);pro.setFontProvider(fontProvider);HtmlConverter.convertToPdf(new FileInputStream("C:\\Users\\2230\\Desktop\\a\\d.html"), pdfDocument, pro);} catch (Exception e) {e.printStackTrace();}}

转换结果

HTML转PDF字体的坑,搞了半天相关推荐

  1. html转pdf 时插入文字,HTML转PDF字体的坑,搞了半天

    itext提供可HTML转PDF的工具包,但是在中文字体时也许会遇到意想不到的问题.特别宋体对应的粗体. 0x01:引入itext包 com.itextpdf itext7-core 7.1.11 p ...

  2. centos7.9安装了微信,但腾讯公司不允许在Linux里登录微信帐号,白搞了半天。也有可能是那个微信安装包的问题吧

    centos7.9安装了微信,但腾讯公司不允许在Linux里登录微信帐号,白搞了半天.也有可能是那个微信安装包的问题吧. https://blog.csdn.net/weixin_42300866/a ...

  3. PDF字体重叠的几种情况

    文章目录 一.概述 二.解决方案 1.系统未安装字体 2.PDF字体与系统字体不一致 3.不要使用Adobe自动生成文本域 4.PDF转图片插件不兼容 一.概述 在生成PDF的过程中,可能会出现字体重 ...

  4. ireport打印pdf字体问题

    使用ireport打印pdf时需要导入字体 1.ireport默认pdf字体为STsong-Light,编码默认为UniGB-UCS2-H 2.需要导入$ireport-5.6.0\ireport\m ...

  5. netdxf 字体加粗_怎样将cad转换成pdf字体变粗

    CAD软件输出的标准文件格式是DWG格式,有时候也输出DXF格式,但有时候需要把CAD图纸转换成PDF格式,这样更加有利于传播和多平台播放.但是很多人可能都不知道该如何去把CAD的图纸转换为PDF,那 ...

  6. ireport1.3.2 pdf字体加粗失效的问题

    问题: 在ireport中设置加粗后,预览时生效,但是导出pdf时字体没有加粗的效果 原因: 查看jasperreports-1.3.2.jar源码net.sf.jasperreports.engin ...

  7. java 生成pdf 字体 type1、ttf、ottf、cid、woff

    java生成pdf技术选型 技术选型 java生成pdf最终选择itext7+pdfhtml+freemarker.为什么使用这个组合呢?生成pdf,通常会用html转pdf,这是因为html+css ...

  8. ycmj.php,祝CSDN的朋友们2014元旦快乐,肯定高手帮小弟我解密个文件,PHP加密的,搞了半天没搞明白。 求高手...

    祝CSDN的朋友们2014元旦快乐,肯定高手帮我解密个文件,PHP加密的,搞了半天没搞明白. 求高手 祝CSDN的朋友们2014元旦快乐,肯定高手帮我解密个文件,PHP加密的,搞了半天没搞明白. 求高 ...

  9. 妈耶,搞了半天原来pycharm整体字体太小了应该这样设置。。

    emmmmm就是个人偏好超大分辨率以至于桌面图标啊,各种应用的字体较小.但是总之还可以接受啊. 最近需要用Pycharm ,打开一看, wodema.. 这默认字体也太小了..还怎么码字呀..眼要瞎. ...

  10. java jasperReports导出PDF字体加粗失效,中文显示不出来

    最近搞了一个项目,需要生成投保电子凭证的pdf文件,之前在项目也用了这个组件,只是很多年前别人开发的,我只是项目负责人而已,想起以前的项目就找了ireport这个做为生成pdf的工具.一开始捣鼓了好久 ...

最新文章

  1. EPICenter: 用户管理
  2. java并发编程实践 part 01 --gt; 线程创建方式
  3. static方法与非static方法是否可以互相调用
  4. excel模糊匹配两列文字_Excel快速画出美观饼图
  5. 打印Show Atend and Tell编码器的优化器
  6. Atitit.swift 的新特性 以及与java的对比 改进方向attilax 总结
  7. iPhone 11跌至4439元?网友:虽是二手但用着很香
  8. 计算机科学讲座的策划书,计算机科学与工学院女生新生讲座策划书.doc
  9. 《Greenplum5.0 最佳实践》 系统监控与维护 (五)
  10. 嵌入式硬件入门——蜂鸣器
  11. 阿里云云大使经验分享:老司机9招带你玩转云大使推广
  12. pc版Web聊天界面+代码分享(HTML+CSS)
  13. 植物大战僵尸外挂源码【C语言制作】
  14. 查漏补缺——字符串www.qq.com所有非空子串
  15. 计算机网络和办公室自动化设备管理,通讯、计算机信息(含互联网)及办公自动化设备的安全保密管理暂行规定...
  16. 虹科分享 | 简单实用的CANopen介绍,看完你就明白了(2)——CANopen框架与七种服务类型
  17. CCI金融技术指标的算法
  18. 记事本编写java代码出现中文乱码
  19. 展讯的8825平台 在TP上实现距离传感器的功能
  20. C++ sizeof(struct)计算结构体大小

热门文章

  1. Python糗百爬虫(精简版)
  2. 各类图像数据大集合(下载链接)
  3. Android与iPhone的对比
  4. c 上传文件路劲为服务器路径,获取上传文件的路径变成C:\fakepath\
  5. CVE-2018-0798_微软公式编辑器漏洞分析
  6. matlab用于试验设计回归分析实验结果的例子
  7. ubuntu 深度音乐播放器
  8. IBM Power小型机用前面板液晶屏查看HMC端口IP
  9. OpenJudge NOI题库 入门 116题 (二)
  10. 安卓设备连接USB打印机