繁体   English   中英

用于 Spring Boot 的 PDF 中的 UTF-8 表情符号问题

[英]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,它涵盖了您示例中的一些表情符号。

要使用它,

  • 您必须下载 DejaVu 字体(您可以在互联网上轻松找到它)。
  • 将其包含在渲染过程中(确保匹配文件的确切路径):
ITextRenderer renderer = new ITextRenderer();
renderer.getFontResolver().addFont("font/dejavu-sans/DejaVuSans.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
  • 在 HTML 中设置字体:
<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 中的结果: pdf结果

表情符号符号作为符号是有问题的,我们可以看到,如果我们使用一种具有两种样式(左上角)的字体,即使在一种字体中,符号也不会很好地匹配,因此在上部样式中缺少一个,而在下部样式中,两个看起来相同。

转换为 PDF(中上),它们在表面图形图像上看起来很合理,但是我们看到,当提取文本(右上)时,字体样式丢失了,每个有效字体字符只能有一个字形。

在此处输入图像描述

因此,下排在左侧也如现代记事本所示,但是相同的系统字体现在正在应用其他样式,如果我们提取那些我们得到

😭😢😤😠😡🤬作为在此处输入图像描述

因此,字体系统通常不能很好地支持字体及其表情符号的样式,但是如果我们通过 html 遍历它会更加一致,但是文本不是文本。 在此处输入图像描述

我们可能得到的最好结果是未定义 CID 字符的图像的不良混合,这可能会令人困惑,因为这些字符都是相同的。

������
������

在此处输入图像描述

因此,如果您将 pdf 导出为带有图像叠加层的符号,则没有视觉对等

在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM