Docker Alpine 3.10中wkhtmltopdf中文/泰文显示异常如何解决?
问题成因
- 字体匹配失效:Alpine 3.10默认的
font-noto包虽包含多语言字体,但未单独安装CJK(中日韩)字符对应的子包,且fontconfig未生成有效字体缓存,导致wkhtmltopdf无法找到适配非英文字符的字体文件。 - 字体配置未加载:即使安装了多语言字体,若未触发fontconfig缓存更新,系统无法识别新安装的字体,wkhtmltopdf会 fallback 到默认无对应字符的字体,导致乱码。
解决方法
修改Dockerfile,补充CJK字体包并强制更新字体缓存,具体调整如下:
1. 调整后的Dockerfile
FROM alpine:3.10 RUN apk update && apk --no-cache add \ git libcurl wget \ curl tzdata procps vim \ python3 py3-pip \ zip unzip \ libsasl \ openssl \ libpng \ libjpeg \ libjpeg-turbo \ freetype \ libxml2 \ fontconfig \ icu libzip \ wkhtmltopdf \ libgcc libstdc++ libx11 glib libxrender libxext libintl \ # 新增CJK专用字体包,覆盖中日韩字符需求 font-noto-cjk \ font-noto-arabic terminus-font ttf-inconsolata ttf-dejavu font-noto font-noto-extra \ ttf-dejavu ttf-droid ttf-freefont ttf-liberation ttf-ubuntu-font-family \ libpng-dev libjpeg-turbo-dev freetype-dev libxml2-dev icu-dev autoconf gcc g++ make libzip-dev \ # 强制更新fontconfig缓存,让系统识别新安装的字体 && fc-cache -fv \ && rm -rf /var/cache/apt/* && rm /var/cache/apk/* COPY ./test.html ./
2. 重新验证流程
执行以下命令重新构建镜像并测试:
$ docker build -t character_test . $ docker run --name character_test character_test wkhtmltopdf ./test.html ./test.pdf $ docker cp character_test:./test.pdf ./test.pdf $ docker rm character_test $ docker rmi character_test
打开生成的PDF即可看到中文等非英文字符正常显示。
额外说明
- 若泰文等其他语言字符仍有问题,可补充安装对应语言的Noto字体包(如
font-noto-thai,需确认Alpine 3.10仓库是否提供)。 fc-cache -fv是关键步骤,它会扫描系统字体目录并生成缓存文件,确保wkhtmltopdf能正确检索到所需字体。
内容的提问来源于stack exchange,提问作者Alex Bailey
相关产品推荐
相关产品推荐

