You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iText 5中表情符号无法显示的问题求助

解决iText生成PDF无法显示表情符号的问题

核心原因

iText 5.x版本对**彩色OpenType表情字体(如NotoColorEmoji)**的支持有限,它无法解析这类字体中的COLR/CPAL彩色图层信息,导致表情无法正常渲染。


推荐解决方案:升级到iText 7 + pdfCalligraph扩展

iText 7的pdfCalligraph模块专门优化了复杂脚本(包括彩色表情)的渲染支持,这是最可靠的解决方式。

1. 更新Maven依赖

替换原有的iText5依赖为以下内容:

<dependencies>
    <!-- iText 7核心库 -->
    <dependency>
        <groupId>com.itextpdf</groupId>
        <artifactId>itext7-core</artifactId>
        <version>7.2.5</version>
        <type>pom</type>
    </dependency>
    <!-- pdfCalligraph扩展,支持彩色表情和复杂脚本 -->
    <dependency>
        <groupId>com.itextpdf</groupId>
        <artifactId>typography</artifactId>
        <version>7.2.5</version>
    </dependency>
</dependencies>

2. 调整代码实现

使用iText7的API重新编写生成逻辑,确保正确加载彩色表情字体:

import com.itextpdf.io.font.PdfEncodings;
import com.itextpdf.kernel.font.PdfFont;
import com.itextpdf.kernel.font.PdfFontFactory;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.element.Paragraph;
import com.itextpdf.layout.element.Text;

import java.io.FileOutputStream;
import java.io.IOException;

public class EmojiPdfGenerator {
    public static void main(String[] args) throws IOException {
        // 创建PDF文档
        PdfDocument pdfDoc = new PdfDocument(new PdfWriter("temp.pdf"));
        Document document = new Document(pdfDoc);

        // 加载NotoColorEmoji字体(确保字体文件在resources目录下)
        PdfFont emojiFont = PdfFontFactory.createFont(
                "NotoColorEmoji.ttf",
                PdfEncodings.IDENTITY_H,
                PdfFontFactory.EmbeddingStrategy.FORCE_EMBEDDED
        );
        // 加载普通文本字体
        PdfFont textFont = PdfFontFactory.createFont(PdfFontFactory.HELVETICA);

        // 构建段落
        Paragraph paragraph = new Paragraph();
        paragraph.add(new Text("Start ").setFont(textFont).setFontSize(20));
        paragraph.add(new Text("😀 😃 😄 😁 😆\n").setFont(emojiFont).setFontSize(40));
        paragraph.add(new Text("ABC\n").setFont(emojiFont).setFontSize(40));
        paragraph.add(new Text("End").setFont(textFont).setFontSize(20));

        document.add(paragraph);
        document.close();
    }
}

若坚持使用iText 5的替代方案

如果无法升级版本,只能退而求其次使用黑白表情字体:

  • 选择仅包含黑白轮廓的emoji字体(如Noto Emoji,注意不是彩色版本)
  • 代码中替换字体文件为黑白版本,iText5可以正常渲染这类字体的表情,但显示效果为黑白

内容的提问来源于stack exchange,提问作者Mani Afschar Yazdi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 21:59:59