Hi Devs,
I attempted to render emojis using the emoji-supported font Noto Color
Emoji<https://fonts.google.com/noto/specimen/Noto+Color+Emoji> with the PDFBox
3.0.3 Java library. However, the font.hasGlyph(codePoint) method consistently
returns false for all codepoint availability checks. Despite this, the emojis
in question are clearly supported by the specified Google font. I have included
the code below. Could someone kindly guide me in identifying the cause of this
issue?
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");
var font = PDType0Font.load(doc, fontFile);
// Add a page
PDPage page = new PDPage();
doc.addPage(page);
try (PDPageContentStream cs = new PDPageContentStream(doc, page)) {
cs.beginText();
cs.setFont(font, 20);
cs.newLineAtOffset(50, 700);
// Emoji string
String text = "\uD83D\uDE00 \uD83D\uDE09";
for (int i = 0; i < text.length(); ) {
int codePoint = Character.codePointAt(text, i);
i += Character.charCount(codePoint);
String glyph;
try {
glyph = new String(Character.toChars(codePoint));
} catch (IllegalArgumentException e) {
System.err.println("Invalid code point: U+" +
Integer.toHexString(codePoint));
continue; // Skip invalid code points
}
try {
if (font.hasGlyph(codePoint)) {
cs.showText(glyph);
} else {
// Handle unsupported glyphs
System.out.println("Unsupported glyph," + glyph);
}
} catch (IOException e) {
System.err.println("IOException while showing glyph:
U+" + Integer.toHexString(codePoint));
}
}
cs.endText();
}
doc.save("emojis.pdf");
System.out.println("PDF created: emojis.pdf");
} catch (IOException e) {
e.printStackTrace();
}
}
}
Thanks,
Sudeepa.