java - 仅在 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"]
希望你能在这里帮助我,因为我已经坚持了一段时间,我无法得到任何解决方案。如果有任何我遗漏的信息,或者我提到了错误的信息,请告诉我,以便我更新。
非常感谢。
解决方案
我已经使用 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"]
推荐阅读
- c# - 我可以避免找不到此成员吗?(来自 HRESULT 的异常:0x80020003 (DISP_E_MEMBERNOTFOUND))?
- java - 在 JAVA 中执行代码块时出现问题,第一次单击时代码未完全运行
- sqlite - 高效地将一个 SQLite 数据库拆分为多个文件
- flutter - 颤振 admob 移除后退按钮
- python - 使用 4D 数据进行 Python 缩放
- reactjs - React Hook - 仅在组件卸载时使用效果,而不是在依赖项更新时使用
- r - 在R中合并具有不同行的两个数据框
- ubuntu - Tomcat:/etc/init.d/tomcat 不存在且 monit 不起作用
- text - 是否可以在光标位置下方写文字
- c# - .net core 2.2 会话注销