You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 11:17:26