最近在业务中用到了Html转PDF的功能,使用到了Aspose(21.11),在转换时由于中文默认使用
Arial
,字母和数字使用
TimesNewRoman
,导致生成的PDF文字位置错误。
<p>我是中文ABC</p>
<p>我是中文123</p>
图 - 1
1.设置font-family(无效)
尝试在Html中设置文字font-family
<style>
p { font-family: "SimHei"; }
</style>
重新生成PDF后发现并未生效,还是和图 - 1
一样文字错位,猜测可能是Aspose无法找到到Html中指定的字体。
2.设置TextState(无效)
通过查阅Aspose的文档找到可以通过HtmlLoadOptions > PageInfo > setDefaultTextState()设置默认字体。
HtmlLoadOptions htmlOptions = new HtmlLoadOptions();
PageInfo pageInfo = new PageInfo();
TextState textState = new TextState();
textState.setFont(FontRepository.openFont("/font/SIMHEI.ttf"));
pageInfo.setDefaultTextState(textState);
htmlOptions.setPageInfo(pageInfo);
Document doc = new Document("/test.html", htmlOptions);
doc.save("/test.pdf");
重新生成PDF后发现并未生效,还是和图 - 1
一样文字错位。调试发现这里设置的DefaultTextState
并未生效,通过doc.getPageInfo().getDefaultTextState().getFont()
获取的字体依然是null
。
3.addLocalFontPath
继续查阅文档看到FontRepository
中有个addLocalFontPath
方法可以添加字体目录
FontRepository.addLocalFontPath("/font");
Document doc = new Document("/test.html", new HtmlLoadOptions());
doc.save("/test.pdf");
重新生成PDF后看到字体已经生效了
css中使用的字体名称是字体名称非字体文件名称;
可以使用FontRepository.openFont("/font/SIMHEI.ttf").getFontName();
来获取字体名称;
测试发现如果字体名称中包含空格会导致字体不生效,也可能是我找的字体文件有问题;
粉丝