3

我运行一个基于 Web 的时间线制作工具,它允许用户在 HTML/JavaScript 中创建时间线,然后在完成后将它们导出为 PDF 文件进行打印。

当时间线包含某些 Unicode 字符时,我有几个用户报告了将时间线导出为 PDF 的问题。例如,这里是显示网页和生成的 PDF 文件的屏幕截图:

在此处输入图像描述

我一直在试图弄清楚为什么某些 Unicode 字符块(例如 Block Elements 和 Georgian)会导出,而中文和日语则不会。此外,当我在本地计算机上执行导出时,导出工作正常,但在 Heroku 上导出时会导致上述输出。

有谁知道这可能是什么原因造成的?

为了完整起见,后端使用 Ruby on Rails,它使用 PDFKit gem 将 HTML 页面转换为 PDF,并且该站点托管在 Heroku 上。

4

3 回答 3

2

听起来这可能是服务器上的字体问题。时间线的网页版本正确呈现,因为您在运行浏览器的客户端计算机上显然具有正确的字体。另一方面,PDF 是在服务器上生成的,因此必须使用那里可用的字体。

如果是这种情况,那么使用既存在于服务器上又支持正确 CJK 字符的字体应该可以解决此问题。

于 2013-09-09T14:37:25.510 回答
1

在使用 Rails 和 Heroku 亲身体验过这一点后,我可以告诉你原因是 (A) 系统上的字体与 Heroku 上的字体不匹配,或者 (B)pdfkit加载通过 CSS 链接的自定义字体时遇到问题,或者两者兼而有之

最有可能的是,您在本地系统上引用了与 Heroku 上的字体不匹配的字体(其中包含特殊字符的字形)。在 Heroku 的 bash 中运行fc-list以获取其已安装字体的列表,并将您的字体替换为具有所需扩展字符集的字体。但是,现在您必须确保此字体也安装在本地计算机上。dev(更糟糕的是,您可以为和使用不同的字体production。)

您也可以尝试将字体上传到 Heroku,然后从那里链接它们。但是,我发现这种方法在跨多个系统或开发/登台/生产环境时不可靠,因为每个系统都必须安装所需的字体。即便如此,PDFkit也会让您跳过箍来让 CSS 字体工作(例如,因为不同操作系统对字体名称的解释存在细微差异)。

我发现的最佳解决方案是将字体编码并直接嵌入到 CSS 中。Base-64 对字体进行编码,并将其添加到样式表中:

@font-face {
    font-family: 'OpenSans';
    src: url(data:font/truetype;charset=utf-8;base64,AAEAAAATAQA...
}

现在您有了一个防弹样式表,该样式表可移植且可与每个系统自兼容。

于 2013-12-06T08:54:34.557 回答
1

如果您确实使用 Docker 并且遇到上述同样的问题,请尝试在 Docker 上安装日文字体:apt-get install fonts-takao-mincho

如果它有效,则将其添加到您的 Dockerfile 中:

apt update && apt install -y \
# japanese fonts
fonts-takao-mincho
于 2017-11-13T12:32:32.170 回答