将HTML导出为PDF时出现中文和日文字符编码问题

时间:2013-09-08 00:28:17

标签: ruby-on-rails heroku utf-8 character-encoding pdfkit

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

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

enter image description here

我一直在试图解决为什么像Block Elements和Georgian这样的Unicode字符块会导出但中文和日文不能导出的原因。此外,当我在本地计算机上执行导出时,导出正常工作,但在Heroku上导出时会导致上述输出。

有谁知道可能导致这种情况的原因?

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

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

亲自体验过Rails和Heroku,我可以告诉你原因是(A)系统上的字体与Heroku上的字体不匹配,或者(B)pdfkit无法加载通过链接的自定义字体CSS,或两者的某种组合

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

您也可以尝试uploading fonts to Heroku,然后从那里链接它们。但是,我发现这种方法在跨越多个系统或dev / staging / production环境时是不可靠的,因为每个系统都必须安装所需的字体。即使这样,PDFkit也会让你跳过箍来使CSS字体起作用(例如,由于不同操作系统对字体名称的解释有细微差别)。

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

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

现在你有了一个可拆卸的样式表,它可以移植并与每个系统自我兼容。

答案 2 :(得分:1)

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

如果有效,则将其添加到Dockerfile: 如果您确实使用Docker并且遇到同样的问题,只需在Docker上安装日语字体:apt-get install fonts-takao-mincho

如果有效,则将其添加到Dockerfile:

apt update && apt install -y \
# japanese fonts
fonts-takao-mincho