Я пытаюсь создать 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"]
Надеюсь, вы можете мне помочь, так как я уже какое-то время застрял на этом, и я не могу заставить какое-либо из решений работать. Если есть какая-то информация, которую я пропустил упомянуть, или я упомянул неверную информацию, пожалуйста, сообщите мне, чтобы я мог обновить ее.
Большое тебе спасибо.
Я добавил файл шрифта в докер с помощью файла докера и указал путь к базовому шрифту, и он сработал. По некоторым причинам он не забирал файл шрифта из папки ресурсов.
@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"]