首页 > 解决方案 > 仅在 docker 上部署时,使用 iText 库的 java 代码生成的 PDF 中日文字符为空白

问题描述

我正在尝试使用日文+英文字符生成 PDF 文件。代码在本地运行良好,但是当我在 docker 上部署应用程序(java spring boot)时,日文字符为空白。这是我的代码:

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"]

希望你能在这里帮助我,因为我已经坚持了一段时间,我无法得到任何解决方案。如果有任何我遗漏的信息,或者我提到了错误的信息,请告诉我,以便我更新。

非常感谢。

标签: javaspring-bootdockeritext

解决方案


我已经使用 docker 文件将字体文件添加到 docker 中,并给出了基本字体的路径并且它有效。由于某些原因,它没有从资源文件夹中获取字体文件。

@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"]

推荐阅读