Loading

使用puppeteer url转换pdf中文不显示

本来正在优化一个 url 转 pdf 的 node 服务,项目是使用 puppeteer 进行转换。功能优化提测后,发现转换后的 pdf 中文都不显示了。而本身这次优化没有涉及到转换本身相关的内容,这就很奇怪,而且本地转换都很正常。

一般中文不显示,很可能是缺少中文字体导致的,于是看了项目中的 Dockerfile 确实安装了字体,还特别进行了注释,说明这个问题之前应该考虑过。

RUN sed -i "s/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g" /etc/apk/repositories \
    && echo "https://mirrors.aliyun.com/alpine/v3.12/main/" >> /etc/apk/repositories \
    && echo "https://mirrors.aliyun.com/alpine/v3.12/community/" >> /etc/apk/repositories \
    && echo "https://mirrors.aliyun.com/alpine/edge/testing/" >> /etc/apk/repositories \
    && apk update && apk upgrade && apk add --no-cache \
    chromium \
    nss \
    freetype \
    freetype-dev \
    harfbuzz \
    ca-certificates \
    ttf-freefont \
    wqy-zenhei@edge -f

看来大概率是本次代码修改导致的,于是将代码回滚到上一个版本,结果是中文仍然不显示。代码回滚也没能修复,从这看起来好像问题又不在代码层。

接下来,只能对比下线上镜像和测试环境镜像有什么区别了,于是用生产镜像替换测试环境的镜像,结果转换后的 pdf 中文都恢复显示了。在 pod 内执行 fc-list :lang=zh 命令发现,果然生产环境的镜像中包含中文字体,而现在打的镜像中没有该字体。

# fc-list :lang=zh
/usr/share/fonts/wqy-zenhei/wqy-zenhei.ttc: WenQuanYi Zen Hei Sharp,文泉驛點陣正黑,文泉驿点阵正黑:style=Regular
/usr/share/fonts/wqy-zenhei/wqy-zenhei.ttc: WenQuanYi Zen Hei Mono,文泉驛等寬正黑,文泉驿等宽正黑:style=Regular
/usr/share/fonts/wqy-zenhei/wqy-zenhei.ttc: WenQuanYi Zen Hei,文泉驛正黑,文泉驿正黑:style=Regular

到这里,问题就比较清晰了,肯定时构建镜像时安装wqy-zenhei字体失败了,但是为什么会失败呢。经过一番搜索,终于在 https://gitlab.alpinelinux.org/alpine/aports/-/issues/15509 中找到了答案。

原因是构建镜像 Dockerfile 中指定了第三方依赖镜像仓库,而字体  wqy-zenhei 从 v3.19 从  edge/testing 移到了  community(时间在 2023 年 11 月),原先的仓库该字体已无法下载。见: https://mirrors.aliyun.com/alpine/v3.19/

于是在安装字体时重新指定第三方依赖仓库就可以了。不过这个留的坑挺危险的,依赖的第三方依赖还是尽量用稳定的版本。

RUN echo "https://mirrors.aliyun.com/alpine/v3.19/community/" > /etc/apk/repositories \
    && apk add --no-cache wqy-zenhei
posted @ 2024-05-17 22:51  Hans_Hu  阅读(108)  评论(0编辑  收藏  举报