I use Java and want to display emojis. This is the code:
final Document document = new Document();
FontFactory.register(getClass().getResource("/NotoColorEmoji.ttf").toExternalForm());
final Font fontEmoji =
new Font(FontFactory.getFont("NotoColorEmoji").getBaseFont(), 40f, Font.NORMAL);
final Font fontText = FontFactory.getFont(FontFactory.HELVETICA, 20f, Font.NORMAL);
fontEmoji.setColor(BaseColor.BLUE);
final PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("temp.pdf"));
document.open();
final Paragraph paragraph = new Paragraph();
paragraph.add(new Chunk("Start", fontText));
paragraph.add(new Chunk("\n\n😀 😃 😄 😁 😆", fontEmoji));
paragraph.add(new Chunk("\n\nABC", fontEmoji));
paragraph.add(new Chunk("End", fontText));
document.add(paragraph);
document.close();
writer.close();
pom dependency:
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.13.4</version>
</dependency>
I tried using Google and Apple Font on Windows and Mac. None worked, see picture. Any advice?
Ended up generating all emojis as png and adding them as image to pdf. Generation code:
var save = function (e) {
const fontkit = require('fontkit');
const font = fontkit.openSync('NotoColorEmoji.ttf').fonts[0];
var s = '', eSplitted = e.split(' ');
for (var i2 = 0; i2 < eSplitted.length; i2++)
s += String.fromCodePoint(parseInt(eSplitted[i2], 16));
var img = font.layout(s).glyphs[0].getImageForSize(160);
if (img)
fs.writeFileSync('src/main/resources/emoji/' + e.replace(/ /g, '_') + '.png', img.data);
else
console.log(e + ' ' + s);
}
for (var i = 0; i < emojis.length; i++) {
if (emojis[i].code.indexOf('.') < 0)
save(emojis[i].code.toLowerCase());
else {
var c = emojis[i].code.split('..');
for (var i2 = parseInt(c[0], 16); i2 <= parseInt(c[1], 16); i2++)
save(i2.toString(16));
}
}
var emojis = [
{ code: '231A..231B', type: 'Basic_Emoji', description: 'watch..hourglass done', cat: 'E0.6 [2]', char: '⌚..⌛' },
{ code: '223E9..23EC', type: 'Basic_Emoji', description: 'fast-forward button..fast down button', cat: 'E0.6 [4]', char: '⏩..⏬' },
{ code: '23F0', type: 'Basic_Emoji', description: 'alarm clock', cat: 'E0.6 [1]', char: '⏰' },
{ code: '23F3', type: 'Basic_Emoji', description: 'hourglass not done', cat: 'E0.6 [1]', char: '⏳' }
}
In itext:
final Image image = new Image(ImageDataFactory.create(IOUtils.toByteArray(getClass().getResourceAsStream("/emoji/" + id + ".png"))));
image.setHeight(15f);
image.setMarginBottom(-2f);
paragraph.add(image);
Works smoothly! For generation the provided list of emojis is not complete...