[英]UTF-8 emoji problem in PDF for Spring Boot
我正在使用 Spring Boot 创建和返回 PDF。 当我的字符串内容包含表情符号和 Unicode 字符时出现问题,例如"This is d£escript😭ion section😢😤😠😡🤬"
,然后在下载的 PDF 中它们被跳过。 有人可以帮我解决这个问题。
我的代码如下
ITextRenderer renderer = new ITextRenderer();
ResourceLoaderUserAgent callback = new ResourceLoaderUserAgent(renderer.getOutputDevice());
callback.setSharedContext(renderer.getSharedContext());
renderer.getSharedContext().setUserAgentCallback(callback);
renderer.setDocumentFromString(pdfContent(templateId, pdfData));
renderer.layout();
renderer.createPDF(outputStream);
}
pdfContent(TemplateId templateId, Map<String, Object> pdfData) throws TemplateException,
IOException {
return FreeMarkerTemplateUtils
.processTemplateIntoString(freemarkerMailConfiguration.getTemplate(templateId.getValue()), pdfData);
}
问题是您使用的字体不包含表情符号,因此它们无法在 PDF 中呈现。 不幸的是,我找不到涵盖所有表情符号的字体。 我能找到的最好的是 DejaVu,它涵盖了您示例中的一些表情符号。
要使用它,
ITextRenderer renderer = new ITextRenderer();
renderer.getFontResolver().addFont("font/dejavu-sans/DejaVuSans.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
<html>
<head>
<meta charset="utf-8" />
<style>
body{font-family:"DejaVu Sans", sans-serif;}
</style>
</head>
<body>
<p>This is descript😭ion section😢😤😠😡🤬.</p>
</body>
</html>
表情符号符号作为符号是有问题的,我们可以看到,如果我们使用一种具有两种样式(左上角)的字体,即使在一种字体中,符号也不会很好地匹配,因此在上部样式中缺少一个,而在下部样式中,两个看起来相同。
转换为 PDF(中上),它们在表面图形图像上看起来很合理,但是我们看到,当提取文本(右上)时,字体样式丢失了,每个有效字体字符只能有一个字形。
因此,下排在左侧也如现代记事本所示,但是相同的系统字体现在正在应用其他样式,如果我们提取那些我们得到
因此,字体系统通常不能很好地支持字体及其表情符号的样式,但是如果我们通过 html 遍历它会更加一致,但是文本不是文本。
我们可能得到的最好结果是未定义 CID 字符的图像的不良混合,这可能会令人困惑,因为这些字符都是相同的。
������
������
因此,如果您将 pdf 导出为带有图像叠加层的符号,则没有视觉对等
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.