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

使用PDFBox 3.0.3渲染Noto Color Emoji表情失败求助

问题原因及解决方法

核心原因

Noto Color Emoji是彩色TrueType字体,采用CBDT/CBLC表存储彩色位图字形,而非普通TrueType字体的glyf表。PDFBox 3.0.3的PDType0Font默认加载逻辑针对标准字形设计,hasGlyph(codePoint)方法依赖cmap与glyf表的映射关系,无法识别彩色字体的CBDT表中的字形,因此始终返回false。

同时你代码中加载字体时未启用嵌入式加载,这也会影响PDFBox对彩色字体的处理逻辑。

解决步骤

  1. 正确加载彩色字体:加载时指定嵌入式加载参数,确保PDFBox能读取字体的彩色字形数据。
  2. 绕过无效的hasGlyph检查:该方法对彩色字体不适用,直接尝试渲染即可,PDFBox在支持的情况下会自动处理彩色字形。
  3. 验证查看器兼容性:彩色PDF字体需要用Adobe Acrobat等支持的查看器打开,部分轻量查看器可能无法显示彩色表情。

修正后的代码

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.font.PDType0Font;

import java.io.File;
import java.io.IOException;

public class EmojiPdfExample {
    public static void main(String[] args) {
        try (PDDocument doc = new PDDocument()) {

            File fontFile = new File("NotoColorEmoji-Regular.ttf");
            // 启用嵌入式加载,确保PDFBox读取彩色字形数据
            var font = PDType0Font.load(doc, fontFile, true);

            PDPage page = new PDPage();
            doc.addPage(page);

            try (PDPageContentStream cs = new PDPageContentStream(doc, page)) {
                cs.beginText();
                cs.setFont(font, 40); // 放大字号更易观察彩色表情
                cs.newLineAtOffset(50, 700);

                String text = "\uD83D\uDE00 \uD83D\uDE09";

                // 直接渲染文本,无需hasGlyph检查
                cs.showText(text);
                
                cs.endText();
            }

            doc.save("emojis.pdf");
            System.out.println("PDF created: emojis.pdf");

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

额外说明

  • 若仍无法显示,检查Noto Color Emoji字体文件是否完整(确保是官方渠道下载的完整TTF文件)。
  • PDFBox 3.x对彩色字体的支持已有所改善,但部分复杂组合表情可能需要额外处理字符序列。

内容的提问来源于stack exchange,提问作者Sudeepa Nadeeshan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 19:32:33