(2021年4月) Ruby on Rails 导出 PDF 时如何指定字体(用了 Docker)

1,478次阅读
没有评论

这篇文章写什么?

(2021年4月) Ruby on Rails 导出 PDF 时如何指定字体(用了 Docker)

用 Ruby on Rails 实现 PDF 导出功能时,如何设置 PDF 里的字体。

这篇文章对谁有用?有什么用?

对谁有用?Rails 开发者
有什么用?学会怎么在 Dockerfile 里引入字体

正文

现有的问题

PDF 里中文字体太丑了。如下图:

(2021年4月) Ruby on Rails 导出 PDF 时如何指定字体(用了 Docker)

现有的做法

Dockerfile 里用的是这个镜像

FROM ruby:2.7.1-alpine3.12

它默认是没有中文字体的。

Dockerfile 里还有一句

# This font is required for Chinese characters to be rendered correctly in PDFs
RUN apk add wqy-zenhei –update-cache –repository http://mirrors.ustc.edu.cn/alpine/edge/testing/ –allow-untrusted

这是之前的外国同事写的(所以上面有一句英文注释)
这个 “wqy-zenhei” 是 “文泉驿正黑体”

如何解决

假设我们想换成”苹方”字体(举个例子)

第一步

(2021年4月) Ruby on Rails 导出 PDF 时如何指定字体(用了 Docker)(2021年4月) Ruby on Rails 导出 PDF 时如何指定字体(用了 Docker)(2021年4月) Ruby on Rails 导出 PDF 时如何指定字体(用了 Docker)

我们复制这个 PingFang.ttc 文件。

问题来了,怎么让把这个字体文件放进镜像?

看下图,根据 Alpine 的文档,字体应该在 /use/share/fonts

(2021年4月) Ruby on Rails 导出 PDF 时如何指定字体(用了 Docker)https://wiki.alpinelinux.org/wiki/Fonts

方法1:把字体文件放进代码目录

把这个 PingFang.ttc 直接放进代码目录。
然后 Dockerfile 里写

COPY ./fonts/PingFang.ttc /usr/share/fonts

这样有一个大问题,就是 git 里多了一个 77MB 的文件。
并不是所有的同事都开启了全局翻墙,所以有同事说 git pull 的时候非常慢。
所以这种方法不好。

方法2:把字体文件放在可以 URL 访问的地方

我这里直接放入 AWS S3,
当然你也可以放进阿里云 OSS,腾讯云 COS,七牛之类的地方,能访问就行。

(2021年4月) Ruby on Rails 导出 PDF 时如何指定字体(用了 Docker)

然后 Dockerfile 里这样写

ADD https://[隐藏].s3.cn-north-1.amazonaws.com.cn/PingFang.ttc /usr/share/fonts

注意这里只是示例,所以 URL 删去了一部分。意思表达到就行了。

Docker 文档如何解释这条 ADD 命令?

https://docs.docker.com/engine/reference/builder/#add
If <src> is a URL and <dest> does not end with a trailing slash, then a file is downloaded from the URL and copied to <dest>.
也就是说这条 ADD 命令,会从 URL 把文件下载下来,然后放到你指定的文件夹。

最后

在 app/assets/stylesheets/pdf.scss 写上

body {
font-family: “PingFang SC”, “Avenir”, Helvetica, Arial, sans-serif;
// 把 “PingFang SC” 写在这里,如果不这么写,一些字的渲染会和网页上不一致,比如”描述”里的 “述” 字会不同
}

这就完成了。

结果对比

更换字体前

(2021年4月) Ruby on Rails 导出 PDF 时如何指定字体(用了 Docker)

更换字体后

(2021年4月) Ruby on Rails 导出 PDF 时如何指定字体(用了 Docker)

总结

  1. 选择你想要的字体(比如上面用的是”苹方”)
  2. 如果是 macOS,去”字体册”里把字体文件找出来(比如上面是 “PingFang.ttc”)
  3. 把 PingFang.ttc 存到 URL 可公开访问的地方(比如 AWS S3)
  4. 在 Dockerfile 里写 ADD <URL> <目标文件夹地址>
  5. 在 CSS 里写上要用这个字体
  6. 完成

这篇文章写什么?

(2021年4月) Ruby on Rails 导出 PDF 时如何指定字体(用了 Docker)

用 Ruby on Rails 实现 PDF 导出功能时,如何设置 PDF 里的字体。

这篇文章对谁有用?有什么用?

对谁有用?Rails 开发者
有什么用?学会怎么在 Dockerfile 里引入字体

正文

现有的问题

PDF 里中文字体太丑了。如下图:

(2021年4月) Ruby on Rails 导出 PDF 时如何指定字体(用了 Docker)

现有的做法

Dockerfile 里用的是这个镜像

FROM ruby:2.7.1-alpine3.12

它默认是没有中文字体的。

Dockerfile 里还有一句

# This font is required for Chinese characters to be rendered correctly in PDFs
RUN apk add wqy-zenhei –update-cache –repository http://mirrors.ustc.edu.cn/alpine/edge/testing/ –allow-untrusted

这是之前的外国同事写的(所以上面有一句英文注释)
这个 “wqy-zenhei” 是 “文泉驿正黑体”

如何解决

假设我们想换成”苹方”字体(举个例子)

第一步

(2021年4月) Ruby on Rails 导出 PDF 时如何指定字体(用了 Docker)(2021年4月) Ruby on Rails 导出 PDF 时如何指定字体(用了 Docker)(2021年4月) Ruby on Rails 导出 PDF 时如何指定字体(用了 Docker)

我们复制这个 PingFang.ttc 文件。

问题来了,怎么让把这个字体文件放进镜像?

看下图,根据 Alpine 的文档,字体应该在 /use/share/fonts

(2021年4月) Ruby on Rails 导出 PDF 时如何指定字体(用了 Docker)https://wiki.alpinelinux.org/wiki/Fonts

方法1:把字体文件放进代码目录

把这个 PingFang.ttc 直接放进代码目录。
然后 Dockerfile 里写

COPY ./fonts/PingFang.ttc /usr/share/fonts

这样有一个大问题,就是 git 里多了一个 77MB 的文件。
并不是所有的同事都开启了全局翻墙,所以有同事说 git pull 的时候非常慢。
所以这种方法不好。

方法2:把字体文件放在可以 URL 访问的地方

我这里直接放入 AWS S3,
当然你也可以放进阿里云 OSS,腾讯云 COS,七牛之类的地方,能访问就行。

(2021年4月) Ruby on Rails 导出 PDF 时如何指定字体(用了 Docker)

然后 Dockerfile 里这样写

ADD https://[隐藏].s3.cn-north-1.amazonaws.com.cn/PingFang.ttc /usr/share/fonts

注意这里只是示例,所以 URL 删去了一部分。意思表达到就行了。

Docker 文档如何解释这条 ADD 命令?

https://docs.docker.com/engine/reference/builder/#add
If <src> is a URL and <dest> does not end with a trailing slash, then a file is downloaded from the URL and copied to <dest>.
也就是说这条 ADD 命令,会从 URL 把文件下载下来,然后放到你指定的文件夹。

最后

在 app/assets/stylesheets/pdf.scss 写上

body {
font-family: “PingFang SC”, “Avenir”, Helvetica, Arial, sans-serif;
// 把 “PingFang SC” 写在这里,如果不这么写,一些字的渲染会和网页上不一致,比如”描述”里的 “述” 字会不同
}

这就完成了。

结果对比

更换字体前

(2021年4月) Ruby on Rails 导出 PDF 时如何指定字体(用了 Docker)

更换字体后

(2021年4月) Ruby on Rails 导出 PDF 时如何指定字体(用了 Docker)

总结

  1. 选择你想要的字体(比如上面用的是”苹方”)
  2. 如果是 macOS,去”字体册”里把字体文件找出来(比如上面是 “PingFang.ttc”)
  3. 把 PingFang.ttc 存到 URL 可公开访问的地方(比如 AWS S3)
  4. 在 Dockerfile 里写 ADD <URL> <目标文件夹地址>
  5. 在 CSS 里写上要用这个字体
  6. 完成

 

正文完
可以使用微信扫码关注公众号(ID:xzluomor)
post-qrcode
 0
评论(没有评论)

文心AIGC

2023 年 3 月
 12345
6789101112
13141516171819
20212223242526
2728293031  
文心AIGC
文心AIGC
人工智能ChatGPT,AIGC指利用人工智能技术来生成内容,其中包括文字、语音、代码、图像、视频、机器人动作等等。被认为是继PGC、UGC之后的新型内容创作方式。AIGC作为元宇宙的新方向,近几年迭代速度呈现指数级爆发,谷歌、Meta、百度等平台型巨头持续布局
文章搜索
热门文章
潞晨尤洋:日常办公没必要上私有模型,这三类企业才需要 | MEET2026

潞晨尤洋:日常办公没必要上私有模型,这三类企业才需要 | MEET2026

潞晨尤洋:日常办公没必要上私有模型,这三类企业才需要 | MEET2026 Jay 2025-12-22 09...
面向「空天具身智能」,北航团队提出星座规划新基准丨NeurIPS’25

面向「空天具身智能」,北航团队提出星座规划新基准丨NeurIPS’25

面向「空天具身智能」,北航团队提出星座规划新基准丨NeurIPS’25 鹭羽 2025-12-13 22:37...
钉钉又发新版本!把 AI 搬进每一次对话和会议

钉钉又发新版本!把 AI 搬进每一次对话和会议

钉钉又发新版本!把 AI 搬进每一次对话和会议 梦晨 2025-12-11 15:33:51 来源:量子位 A...
5天连更5次,可灵AI年末“狂飙式”升级

5天连更5次,可灵AI年末“狂飙式”升级

5天连更5次,可灵AI年末“狂飙式”升级 思邈 2025-12-10 14:28:37 来源:量子位 让更大规...
商汤Seko2.0重磅发布,合作短剧登顶抖音AI短剧榜No.1

商汤Seko2.0重磅发布,合作短剧登顶抖音AI短剧榜No.1

商汤Seko2.0重磅发布,合作短剧登顶抖音AI短剧榜No.1 十三 2025-12-15 14:13:14 ...
最新评论
ufabet ufabet มีเกมให้เลือกเล่นมากมาย: เกมเดิมพันหลากหลาย ครบทุกค่ายดัง
tornado crypto mixer tornado crypto mixer Discover the power of privacy with TornadoCash! Learn how this decentralized mixer ensures your transactions remain confidential.
ดูบอลสด ดูบอลสด Very well presented. Every quote was awesome and thanks for sharing the content. Keep sharing and keep motivating others.
ดูบอลสด ดูบอลสด Pretty! This has been a really wonderful post. Many thanks for providing these details.
ดูบอลสด ดูบอลสด Pretty! This has been a really wonderful post. Many thanks for providing these details.
ดูบอลสด ดูบอลสด Hi there to all, for the reason that I am genuinely keen of reading this website’s post to be updated on a regular basis. It carries pleasant stuff.
Obrazy Sztuka Nowoczesna Obrazy Sztuka Nowoczesna Thank you for this wonderful contribution to the topic. Your ability to explain complex ideas simply is admirable.
ufabet ufabet Hi there to all, for the reason that I am genuinely keen of reading this website’s post to be updated on a regular basis. It carries pleasant stuff.
ufabet ufabet You’re so awesome! I don’t believe I have read a single thing like that before. So great to find someone with some original thoughts on this topic. Really.. thank you for starting this up. This website is something that is needed on the internet, someone with a little originality!
ufabet ufabet Very well presented. Every quote was awesome and thanks for sharing the content. Keep sharing and keep motivating others.
热评文章
读懂2025中国AI走向!公司×产品×人物×方案,最值得关注的都在这里了

读懂2025中国AI走向!公司×产品×人物×方案,最值得关注的都在这里了

读懂2025中国AI走向!公司×产品×人物×方案,最值得关注的都在这里了 衡宇 2025-12-10 12:3...
5天连更5次,可灵AI年末“狂飙式”升级

5天连更5次,可灵AI年末“狂飙式”升级

5天连更5次,可灵AI年末“狂飙式”升级 思邈 2025-12-10 14:28:37 来源:量子位 让更大规...
戴尔 x OpenCSG,推出⾯向智能初创企业的⼀体化 IT 基础架构解决方案

戴尔 x OpenCSG,推出⾯向智能初创企业的⼀体化 IT 基础架构解决方案

戴尔 x OpenCSG,推出⾯向智能初创企业的⼀体化 IT 基础架构解决方案 十三 2025-12-10 1...
九章云极独揽量子位三项大奖:以“一度算力”重构AI基础设施云格局

九章云极独揽量子位三项大奖:以“一度算力”重构AI基础设施云格局

九章云极独揽量子位三项大奖:以“一度算力”重构AI基础设施云格局 量子位的朋友们 2025-12-10 18:...
乐奇Rokid这一年,一路狂飙不回头

乐奇Rokid这一年,一路狂飙不回头

乐奇Rokid这一年,一路狂飙不回头 梦瑶 2025-12-10 20:41:15 来源:量子位 梦瑶 发自 ...