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

本文详细介绍了在使用iText进行HTML转PDF时遇到的宋体粗体缺失问题。通过分析默认字体设置,加载系统字体,转换字体格式等方式,最终成功将宋体粗体插入PDF。

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

0x01:引入itext包

com.itextpdf

itext7-core

7.1.11

pom

com.itextpdf

html2pdf

2.0.2

0x02:要转换的HTML文件

iText

大发发发萨法发发呆发呆东方大厦发
Your developer here法大大是地方大发顺丰萨法发顺丰的here法大大是地方大发顺丰萨法发顺丰的here法大大是地方大发顺丰萨法发顺丰的here法大大是地方大发顺丰萨法发顺丰的here法大大是地方大发顺丰萨法发顺丰的here法大大是地方大发顺丰萨法发顺丰的here法大大是地方大发顺丰萨法发顺丰的journey with iText begins here法大大是地方大发顺丰萨法发顺丰的
Your developer here法大大是地方大发顺丰萨法发顺丰的here法大大是地方大发顺丰萨法发顺丰的here法大大是地方大发顺丰萨法发顺丰的here法大大是地方大发顺丰萨法发顺丰的here法大大是地方大发顺丰萨法发顺丰的here法大大是地方大发顺丰萨法发顺丰的here法大大是地方大发顺丰萨法发顺丰的journey with iText begins here法大大是地方大发顺丰萨法发顺丰的

iText

大发发发萨法发发呆发呆东方大厦发
Your developer here法大大是地方大发顺丰萨法发顺丰的here法大大是地方大发顺丰萨法发顺丰的here法大大是地方大发顺丰萨法发顺丰的here法大大是地方大发顺丰萨法发顺丰的here法大大是地方大发顺丰萨法发顺丰的here法大大是地方大发顺丰萨法发顺丰的here法大大是地方大发顺丰萨法发顺丰的journey with iText begins here法大大是地方大发顺丰萨法发顺丰的
Your developer here法大大是地方大发顺丰萨法发顺丰的here法大大是地方大发顺丰萨法发顺丰的here法大大是地方大发顺丰萨法发顺丰的here法大大是地方大发顺丰萨法发顺丰的here法大大是地方大发顺丰萨法发顺丰的here法大大是地方大发顺丰萨法发顺丰的here法大大是地方大发顺丰萨法发顺丰的journey with iText begins here法大大是地方大发顺丰萨法发顺丰的

0b3d1c32c90f20d0ffff192fca16432c.png

0x03:编写代码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,丢失了字体样式

b4e7298347f4628bf7e2c737cf32596e.png

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

a3865d41a078f140d5b42b4d9defc64b.png

网上下载宋体粗字体宋体-粗体.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();

}

}

转换结果

930de1ac66f6a96765b860ee46d0395c.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值