我正在尝试将 HTML 文件转换为 pdf。我的 HTML 文件有特殊字符,如 č ž(Caron 符号)。 pdf 已成功生成,但似乎只有带有 caron 符号的字符“c”没有出现在 PDF 中。 如果我打开 html,我可以正确看到文本。 我正在使用 spring boot 来测试它,但这可以通过 java 中的简单 main 以相同的方式执行
这是我的简单代码
@GetMapping("/pdf")
public ResponseEntity<String> generatePdf(@RequestParam("filePath") String filePath) throws IOException, DocumentException {
File htmlFile = new File(filePath);
String htmlContent = new String(Files.readAllBytes(htmlFile.toPath()));
ITextRenderer renderer = new ITextRenderer();
// Path to a font that supports Central European characters and Unicode
String fontPath = "c:/temp/poc-pdf/src/main/resources/templates/DejaVuSans.ttf";
// Adding the font with Unicode encoding
renderer.getFontResolver().addFont(fontPath, com.lowagie.text.pdf.BaseFont.IDENTITY_H, true);
// Set the HTML content
renderer.setDocumentFromString(htmlContent);
renderer.layout();
File file = new File("c:/temp/poc-pdf/src/main/resources/templates/pdf.pdf");
try (OutputStream outputStream = new FileOutputStream(file)) {
renderer.createPDF(outputStream);
}
return ResponseEntity.ok();
}
HTML代码:
<!DOCTYPE html>
<html>
<body>
<div>
<p>
čččččLorem ipsum dolor šit amet, consečtetur adipisčing elit. Vestibulum acčumsan metuš pharetra urna efficitur, ac congue justo commodo. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Sed et faucibus lectus. Suspendisse euismod tincidunt pretium. Aliquam porttitor ornare magna. Maecenas eget cursus arcu. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Praesent sodales commodo varius. Maecenas pellentesque velit vitae orci eleifend egestas. Aenean aliquet elit lorem, non maximus sapien efficitur a.
</p>
</div>
</body>
</html>
我尝试了不同的字体,所有这些字体都给出了丢失符号的相同结果。
我认为你的问题出现在你从字节数组创建字符串的地方。
String htmlContent = new String(Files.readAllBytes(htmlFile.toPath()));
由于您没有将字符集传递给字符串构造函数,因此它使用操作系统的默认字符集,这可能与文件的编码不同。
选项 1,将字符集传递给字符串构造函数
byte[] bytes = Files.readAllBytes(htmlFile.toPath());
String htmlContent = new String(bytes[], Charset.forName("UTF-8")); // TODO use the same as the file encoding
选项 2,尝试以某种方式使用阅读器而不是字符串
renderer.setDocumentFromReader(new FileReader(htmlFile));