com.itextpdf.io.IOException: Type of font null is not recognized.
问题描述
使用itext将一个html模板文件转换成pdf文件时,convertToPdf()方法传入ConverterProperties对象,因为Linux服务器上可能会缺少一些字体,通过ConverterProperties对象可以指定使用放在项目下的字体。
程序在IDEA中正常运行,但是服务器上运行构建的jar文件,会得到以下错误:
com.itextpdf.io.IOException: Type of font null is not recognized.
at com.itextpdf.io.font.FontProgramFactory.createFont(FontProgramFactory.java:240)
at com.itextpdf.io.font.FontProgramFactory.createFont(FontProgramFactory.java:96)
at com.employment.common.utils.Html2Pdf.html2pdf(Html2Pdf.java:53)
……
解决过程
错误发生在方法:FontProgramFactory.createFont
中:
尝试很多方式,一直以为是取文件的方式有问题导致的,但发现并不是。
问题原因
.otc或者.ttc文件在打包到jar时被重新编码,导致iText 7-无法识别字体。
将这段代码添加到pom文件的build部分应该可以做到:
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<encoding>UTF-8</encoding>
<nonFilteredFileExtensions>
<nonFilteredFileExtension>ttc</nonFilteredFileExtension>
</nonFilteredFileExtensions>
</configuration>
</plugin>
部分源码
@SneakyThrows
public static void html2pdf(String htmlFile, String pdfFile) {
log.info("html2pdf is running");
PdfWriter pdfWriter = new PdfWriter(new File(pdfFile));
PdfDocument pdfDocument = new PdfDocument(pdfWriter);
Document doc = new Document(pdfDocument);
pdfDocument.setDefaultPageSize(PageSize.A4);
pdfDocument.addEventHandler(PdfDocumentEvent.END_PAGE, new TextFooterEventHandler(doc));
DefaultFontProvider fontProvider = new DefaultFontProvider();
//宋体
FontProgram font1 = FontProgramFactory.createFont(String.valueOf(new Html2Pdf().getClass().getClassLoader().getResource("simsun.ttc,0")));
if (font1 == null) {
throw new BizException("ERROR", "没有读取到[simsun.ttc]字体文件!");
}
fontProvider.addFont(font1);
//宋体
FontProgram font2 = FontProgramFactory.createFont(String.valueOf(new Html2Pdf().getClass().getClassLoader().getResource("宋体-粗体.otf")));
if (font2 == null) {
throw new BizException("ERROR", "没有读取到[宋体-粗体.otf]字体文件!");
}
fontProvider.addFont(font2);
ConverterProperties pro = new ConverterProperties();
pro.setFontProvider(fontProvider);
log.info("html2pdf开始转换");
HtmlConverter.convertToPdf(new FileInputStream(htmlFile), pdfDocument, pro);
log.info("pdf创建成功");
log.info(pdfFile);
}