Японские символы пусты в PDF-файле, созданном с помощью java-кода с использованием библиотеки iText, только при развертывании в докере.

Я пытаюсь создать PDF-файл с японскими и английскими символами. Код работает нормально на локальном компьютере, но когда я развертываю приложение (загрузка java spring) на докере, японские символы остаются пустыми. Вот мой код:

Service Class
@Service
public class ServiceClassImpl implements ServiceClass {
    private static final Logger LOGGER = LoggerFactory.getLogger(ServiceClassImpl.class);
    private BaseFont baseFont;

    @PostConstruct
    public void loadBaseFont() throws DocumentException, IOException {
        ClassPathResource cp = new ClassPathResource("notosans.otf");
        if (cp.exists()) {
            File file = cp.getFile();
            baseFont = BaseFont.createFont(file.getAbsolutePath(), BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
        }
    }

    @Override
    public ByteArrayInputStream get() {
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        try {
            Document document = new Document(PageSize.A4);
            PdfWriter.getInstance(document, out);
            document.open();

            PdfPTable table = createReportTable();
            document.add(table);

            document.close();
        } catch (Exception e) {
            LOGGER.error("Exception inside get() in ServiceClassImpl {} ", e);
        }

        return new ByteArrayInputStream(out.toByteArray());
    }
}

Controller
@GetMapping(value = "/pdf", produces = MediaType.APPLICATION_PDF_VALUE)
public ResponseEntity<InputStreamResource> getPdf() {
    ByteArrayInputStream testFile = serviceClass.get();
    HttpHeaders headers = new HttpHeaders();
    headers.add(HttpHeaders.CONTENT_DISPOSITION, "inline; filename=testFile.pdf");
    headers.add(HttpHeaders.CONTENT_ENCODING, "UTF-8");

    return ResponseEntity
            .ok()
            .headers(headers)
            .contentType(MediaType.APPLICATION_PDF)
            .body(new InputStreamResource(testFile));
}

Dockerfile
FROM openjdk:11
ADD  ./target/app-1.0.0.jar /opt/app-1.0.0.jar

RUN apt-get update
RUN apt-get install -y locales
RUN locale-gen en_US.UTF-8
ENV LANG='en_US.UTF-8' LANGUAGE='en_US:en' LC_ALL='en_US.UTF-8'

EXPOSE 8080
ENTRYPOINT ["java","-jar","/opt/app-1.0.0.jar"]

Надеюсь, вы можете мне помочь, так как я уже какое-то время застрял на этом, и я не могу заставить какое-либо из решений работать. Если есть какая-то информация, которую я пропустил упомянуть, или я упомянул неверную информацию, пожалуйста, сообщите мне, чтобы я мог обновить ее.

Большое тебе спасибо.

# docker spring-boot itext
Источник
Codelisting
за 1 против

Я добавил файл шрифта в докер с помощью файла докера и указал путь к базовому шрифту, и он сработал. По некоторым причинам он не забирал файл шрифта из папки ресурсов.

@Value("${filepath.font.arialuni:/opt/fonts/arialuni.TTF}") 
private String arialuniFontFilePath;
@PostConstruct
public void loadBaseFont() throws DocumentException, IOException {
    baseFont = BaseFont.createFont(arialuniFontFilePath, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
}

Dockerfile
FROM openjdk:11
ADD  ./target/app-1.0.0.jar /opt/app-1.0.0.jar
ADD  ./src/main/resources/arialuni.ttf /opt/fonts/arialuni.ttf

EXPOSE 8080
ENTRYPOINT ["java","-jar","/opt/app-1.0.0.jar"]
Codelisting
Популярные категории
На заметку программисту