wicked_pdf在unicode pdf转换(ruby)上显示未知字符

时间:2017-01-10 13:40:30

标签: ruby-on-rails ruby unicode wkhtmltopdf wicked-pdf

我尝试使用PCollection<KV<Trade, String>>(版本1.1)和wicked_pdf宝石从html页面创建pdf。 我的html页面包含一个日历表情符号,无论我使用什么字体

,它都能在浏览器中很好地显示
wkhtmltopdf-binary

但是,当我尝试使用rails控制台中gem的<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv='content-type' content='text/html; charset=utf-8' /> <style> unicode { font-family: 'OpenSansEmoji', sans-serif; } @font-face { font-family: 'OpenSansEmoji'; src: url(data:font/truetype;charset=utf-8;base64,<-- encoded_font_base64_string-->) format('truetype'); } </style> </head> <body> <div><unicode>&#128197;</unicode></div> </body> </html> 方法生成PDF时,

WickedPdf.new.pdf_from_html_file

我得到以下结果:

PDF result with unknown character

如您所见,第一个日历图标已正确显示,但是显示第二个字符,我们不知道它来自何处。

我已根据相关帖子stackoverflow_emoji_wkhtmltopdf的建议,通过UTF-8和UTF-16编码以及代理对进行了调查,并查看了此问题wkhtmltopdf_git_issue,但仍无法使此字符生成消失!

如果您有任何线索,那就非常欢迎。

提前感谢您的帮助!

修改

根据Eric Duminil和petkov.np的评论,我可以确认 - 上面的代码在Linux上正常运行。这似乎是Linux vs MacOS问题。任何人都可以建议MacOS绑定中的核心问题以及是否可以修复它?

1 个答案:

答案 0 :(得分:2)

我已多次编辑此答案,请参阅最后的注释以及评论。

我使用macOs 10.12.2并遇到同样的问题。我列出了所有浏览器等版本,但我怀疑最大的因素是OS / wkhtmltopdf版本。

  • Chrome:版本55.0.2883.95(64位)
  • Safari:版本10.0.2(12602.3.12.0.1)
  • wkhtmltopdf:0.12.3(补丁qt)

我使用以下示例代码段:

<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html" charset="utf-8">
    <style type="text/css">
      p {
        font-family: 'EmojiSymbols', sans-serif;
      }
      @font-face {
        font-family: 'EmojiSymbols';
        src: local('EmojiSymbols-Regular.woff'), url('EmojiSymbols-Regular.woff') format('woff');
      }

      span:before {
        content: '\01F60B';
      }
    </style>
  </head>
  <body>
    <p>
      
      <span></span>
      &#x1F60B;
      &#128523;
      &#xf0;&#x9f;&#x98;&#x8b;
    </p>
  </body>
</html>

我使用wkhtmltopdf选项致电--encoding 'UTF-8'

您可以看到呈现的结果here(我很抱歉这个蹩脚的屏幕截图)。一些简短的结论:

  1. Safari无法呈现原始&#39; UTF-8字节正常。它似乎将它们视为原始字节序列(html段落中的最后一行)。 Safari使一切都很好。
  2. Chrome渲染一切正常。
  3. 使用上面的选项,wkhtmltopdf可以渲染原始字节(排序),但不能正确呈现CSS content属性。每个人都适当的&#39;这个奇怪的幻象符号后面出现了unicode符号。
  4. 我已尝试过一切,但结果是一样的。 对我来说,即使Safari没有正确渲染原始字节这一事实也表明了一些特定于macOS的系统级问题。我不清楚这应该报告为wkhtmltopdf问题或者macOs构建中存在一些行为不端的依赖。

    编辑: Safari似乎工作正常,我的标记已被破坏。

    编辑: CSS解决方法可能会解决问题,请查看以下评论​​。

    最终修改:如评论中所示,CSS&#39; hack&#39;解决问题的方法是使用text-rendering: optimizeLegibility;。这似乎只在macOS / OS X上需要。

    从我的评论中:

      

    我刚刚发现了这个问题。乍一看似乎无关紧要,但添加了文本呈现:optimizeLegibility;我的样式删除了重复的字符(在macOS上)。为什么会发生这种情况超出了我作为问题的作者也使用   osx,显然这个操作系统的wkhtmltopdf构建存在一些问题。