ItextPDF 8 для создания PDF-файлов с поддержкой шрифтов Emoji

Я пытаюсь найти способ создания PDF-файла с поддержкой шрифтов Emoji с помощью itextpdf 8.0.3.

Я нашел только пример с официального сайта itextpdf; https://kb.itextpdf.com/itext/pdfhtml-using-emojis-in-itext но речь идет о создании PDF-файла из источника HTML.

Я нашел еще один пример в Интернете, например: https://kodejava.org/how-do-i-display-emoji-in-a-pdf-document-using-itext-8/.

Есть такой код:

package org.kodejava.itext;

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

import java.io.IOException;

public class DocumentWithEmoji {
  public static void main(String[] args) throws IOException {
    PdfWriter writer = new PdfWriter("emoji.pdf");
    PdfDocument pdf = new PdfDocument(writer);

    try (Document document = new Document(pdf)) {
        PdfFont fontEmoji = PdfFontFactory.createFont("seguiemj.ttf", PdfEncodings.IDENTITY_H);

        Paragraph paragraph = new Paragraph()
                .add(new Paragraph("Hello ").setFont(fontEmoji).setFontSize(20))
                .add(new Paragraph("\uD83D\uDE00").setFont(fontEmoji).setFontSize(20)
                        .setFontColor(new DeviceRgb(243, 58, 106)));

        document.add(paragraph);
    } catch (Exception e) {
        e.printStackTrace();
    }
  }
}

ожидаемая доходность должна составлять:

но у меня получилось так:

Как вы можете видеть, вместо красной улыбки он выглядит как красное круглое блюдо.

Есть ли у кого-нибудь такой опыт? если да, пожалуйста, поделитесь со мной какой-нибудь идеей.

Убедитесь, что у вас есть шрифт seguiemj.ttf в каталоге src/main/resources вашего проекта Maven. Другой шрифт может дать другой результат.

W-S 10.06.2024 01:45

Моя среда разработки — MacOS, производственная среда — Rocky Linux 9. Шрифт помещен в правильный каталог.

cidy.long 10.06.2024 02:32

Цветные смайлы по умолчанию не поддерживаются в файлах PDF. С помощью используемого вами кода вы получите монохромную версию смайлов, при условии, что файл шрифта содержит соответствующие смайлы. Для цветных смайлов вам необходимо использовать библиотеку, которая может преобразовывать цветные смайлы в шрифты Type3, а затем использовать шрифт Type3 для отображения цветных смайлов.

iPDFdev 11.06.2024 10:40

@iPDFdev, спасибо за совет. Я проведу еще несколько исследований о шрифтах Type 3 и itext PDF.

cidy.long 11.06.2024 10:53

Можете ли вы опубликовать ссылку на выходной PDF-файл, чтобы посмотреть?

iPDFdev 17.06.2024 11:30
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
5
121
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

😀

Каталог проектов

├── pom.xml
└── src
    └── main
        ├── java
        │   └── com
        │       └── example
        │           └── itext
        │               └── DocumentWithEmoji.java
        ├── lib-jar-itext
        │   ├── barcodes-8.0.4.jar
        │   ├── bouncy-castle-adapter-8.0.4.jar
        │   ├── bouncy-castle-connector-8.0.4.jar
        │   ├── bouncy-castle-fips-adapter-8.0.4.jar
        │   ├── commons-8.0.4.jar
        │   ├── font-asian-8.0.4.jar
        │   ├── forms-8.0.4.jar
        │   ├── hyph-8.0.4.jar
        │   ├── io-8.0.4.jar
        │   ├── kernel-8.0.4.jar
        │   ├── layout-8.0.4.jar
        │   ├── pdfa-8.0.4.jar
        │   ├── pdftest-8.0.4.jar
        │   ├── pdfua-8.0.4.jar
        │   ├── sign-8.0.4.jar
        │   ├── styled-xml-parser-8.0.4.jar
        │   └── svg-8.0.4.jar
        └── resources
            └── fonts
                └── NotoEmoji-SemiBold.ttf

pom.xml

<?xml version = "1.0" encoding = "UTF-8"?>
<project xmlns = "http://maven.apache.org/POM/4.0.0" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example.itext</groupId>
    <artifactId>itext8-emoji-fonts</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>itext8-emoji-fonts</name>
    <description>itext8-emoji-fonts</description>
    <properties>
        <java.version>17</java.version>
        <maven.compiler.release>17</maven.compiler.release>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

    </properties>

    <dependencies>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>2.0.13</version>
        </dependency>

        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>barcodes</artifactId>
            <version>8.0.4</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/src/main/lib-jar-itext/barcodes-8.0.4.jar</systemPath>
        </dependency>

        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>bouncy-castle-adapter</artifactId>
            <version>8.0.4</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/src/main/lib-jar-itext/bouncy-castle-adapter-8.0.4.jar</systemPath>
        </dependency>

        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>bouncy-castle-connector</artifactId>
            <version>8.0.4</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/src/main/lib-jar-itext/bouncy-castle-connector-8.0.4.jar</systemPath>
        </dependency>

        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>bouncy-castle-fips-adapter</artifactId>
            <version>8.0.4</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/src/main/lib-jar-itext/bouncy-castle-fips-adapter-8.0.4.jar</systemPath>
        </dependency>

        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>commons</artifactId>
            <version>8.0.4</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/src/main/lib-jar-itext/commons-8.0.4.jar</systemPath>
        </dependency>


        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>font-asian</artifactId>
            <version>8.0.4</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/src/main/lib-jar-itext/font-asian-8.0.4.jar</systemPath>
        </dependency>

        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>forms</artifactId>
            <version>8.0.4</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/src/main/lib-jar-itext/forms-8.0.4.jar</systemPath>
        </dependency>

        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>hyph</artifactId>
            <version>8.0.4</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/src/main/lib-jar-itext/hyph-8.0.4.jar</systemPath>
        </dependency>

        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>io</artifactId>
            <version>8.0.4</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/src/main/lib-jar-itext/io-8.0.4.jar</systemPath>
        </dependency>

        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>kernel</artifactId>
            <version>8.0.4</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/src/main/lib-jar-itext/kernel-8.0.4.jar</systemPath>
        </dependency>


        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>layout</artifactId>
            <version>8.0.4</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/src/main/lib-jar-itext/layout-8.0.4.jar</systemPath>
        </dependency>

        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>pdfa</artifactId>
            <version>8.0.4</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/src/main/lib-jar-itext/pdfa-8.0.4.jar</systemPath>
        </dependency>

        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>pdfua</artifactId>
            <version>8.0.4</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/src/main/lib-jar-itext/pdfua-8.0.4.jar</systemPath>
        </dependency>

        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>sign</artifactId>
            <version>8.0.4</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/src/main/lib-jar-itext/sign-8.0.4.jar</systemPath>
        </dependency>


        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>styled-xml-parser</artifactId>
            <version>8.0.4</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/src/main/lib-jar-itext/styled-xml-parser-8.0.4.jar</systemPath>
        </dependency>

        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>svg</artifactId>
            <version>8.0.4</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/src/main/lib-jar-itext/svg-8.0.4.jar</systemPath>
        </dependency>
    </dependencies>
</project>

DocumentWithEmoji.java

КОПИРУЙТЕ И ИЗМЕНЯЙТЕ ИЗ ПРИМЕРА КОДА

package com.example.itext;

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

import java.io.FileNotFoundException;

public class DocumentWithEmoji {
    public static void main(String[] args) throws FileNotFoundException {
        PdfWriter writer = new PdfWriter("emoji.pdf");
        PdfDocument pdf = new PdfDocument(writer);

        try (Document document = new Document(pdf)) {
            //PdfFont fontEmoji = PdfFontFactory.createFont("seguiemj.ttf", PdfEncodings.IDENTITY_H);
            PdfFont fontEmoji = PdfFontFactory.createFont("fonts/NotoEmoji-SemiBold.ttf", PdfEncodings.IDENTITY_H);

            Paragraph paragraph = new Paragraph()
                    .add(new Paragraph("Hello "))
                    .add(new Paragraph("\uD83D\uDE00").setFont(fontEmoji).setFontSize(20)
                            .setFontColor(new DeviceRgb(243, 58, 106)));

            document.add(paragraph);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
} 

ПРИМЕЧАНИЕ

Я изменил только шрифт с seguiemj.ttf на NotoEmoji-SemiBold.ttf

Скачать шрифты - NotoEmoji-SemiBold.ttf

Загрузите Noto_Emoji.zip с https://fonts.google.com/noto/specimen/Noto+Emoji

Выберите и Download All(1)

Разархивируйте Noto_Emoji.zip ,

Noto_Emoji
├── NotoEmoji-VariableFont_wght.ttf
├── OFL.txt
├── README.txt
└── static
    ├── NotoEmoji-Bold.ttf
    ├── NotoEmoji-Light.ttf
    ├── NotoEmoji-Medium.ttf
    ├── NotoEmoji-Regular.ttf
    └── NotoEmoji-SemiBold.ttf

скопируйте NotoEmoji-SemiBold.ttf в каталог проекта: src/main/resources/fonts/

itext 8 баночка

открыть https://github.com/itext/itext-java/releases/tag/8.0.4

скачать iText-Core-8.0.4-only-jars.zip

разархивируйте iText-Core-8.0.4-only-jars.zip поместите всю банку в src/main/lib-jar-itext

Я тестирую это в идее.

Благодарю за ваш ответ. Я протестирую ваш код в своей среде RND и сообщу вам.

cidy.long 11.06.2024 10:36

Другие вопросы по теме