openhtmltopdf转HTML为PDF时特殊字符显示#的解决方法
解决openhtmltopdf转换PDF时特殊字符显示为#的问题
问题根源是默认字体不支持土耳其语特殊字符:openhtmltopdf默认采用的Helvetica等字体未包含İ、ş、Ş、ç、Ç、Ö这类字形,字符缺失时就会用#替代。以下是具体解决步骤:
1. 准备支持特殊字符的字体
选择一款覆盖土耳其语字符的字体,比如开源的Noto Sans(支持多语言),或是Arial Unicode MS。将字体文件(如NotoSans-Regular.ttf)放到项目的resources/fonts目录下。
2. 修改Java代码加载自定义字体
在构建PdfRendererBuilder时添加字体配置,指定默认使用的支持特殊字符的字体:
ByteArrayOutputStream renderedPdfBytes = new ByteArrayOutputStream(); PdfRendererBuilder builder = new PdfRendererBuilder(); // 加载自定义字体,设置常规和粗体样式 builder.useFont(new File("src/main/resources/fonts/NotoSans-Regular.ttf"), "Noto Sans"); builder.useFont(new File("src/main/resources/fonts/NotoSans-Bold.ttf"), "Noto Sans", PdfRendererBuilder.FontStyle.BOLD); builder.withHtmlContent(htmlContent, "/"); builder.toStream(renderedPdfBytes); builder.run(); renderedPdfBytes.close(); byte[] renderedPdf = renderedPdfBytes.toByteArray(); try (FileOutputStream fos = new FileOutputStream(pdfFile)) { fos.write(renderedPdf); }
3. 在HTML中通过CSS指定字体
确保HTML文本使用加载的字体,在<head>中添加样式声明:
<html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8" /> <style> body, h2 { font-family: 'Noto Sans', sans-serif; } </style> </head> <body> <span class="close-icon close"></span> <div class="modal-content"> <div class="modal-header"><h2>İade Prosedürü 27.09.2023</h2></div> <div class="modal-body" style="margin-bottom: 50px;"><p>İade edilmek istenen.</p></div> </div> </body> </html>
注意事项
- 若使用Maven/Gradle构建项目,需确保字体文件被正确打包到输出资源中,避免路径找不到的问题。
- 若依赖系统字体,可直接指定字体名称(如
"Arial Unicode MS"),但跨平台兼容性较差,优先推荐嵌入字体文件的方式。
内容的提问来源于stack exchange,提问作者sapcxdev
相关产品推荐
相关产品推荐

