javaitextemoji

itext 5 emojis do not appear


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?

enter image description here


Solution

  • 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...