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

wicked_pdf shows unknown character on unicode pdf conversion (ruby)

我正在尝试使用 wicked_pdf(版本 1.1)和 wkhtmltopdf-binary gem 从 html 页面创建 pdf。 我的 html 页面包含一个日历表情符号,无论我使用什么字体,它都能在浏览器中很好地显示

<!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>

但是,当我尝试在 rails 控制台中使用 gem 的 WickedPdf.new.pdf_from_html_file 方法生成 PDF 时,

 File.open(File.expand_path('~/<--pdf_filename-->.pdf'), 'wb+') {|f| f.write  WickedPdf.new.pdf_from_html_file('<--absolute_path_of_html_file-->')}  

我得到以下结果:

PDF result with unknown character

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

我已经按照相关 post Whosebug_emoji_wkhtmltopdf and looked at this issue wkhtmltopdf_git_issue 的建议通过 UTF-8 和 UTF-16 编码以及代理项对进行了调查,但仍然无法使该字符消失!

如果您有任何线索,我们非常欢迎。

在此先感谢您的帮助!

编辑

根据 Eric Duminil 和 petkov.np 的评论,我可以确认 - 上面的代码在 Linux 上对我来说是正确的。似乎这是一个 Linux 与 MacOS 的问题。任何人都可以建议 MacOS 绑定问题的核心是什么以及是否可以修复?

我已经多次编辑了这个答案,请看最后的注释和评论。

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

  • 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: 'F60B';
      }
    </style>
  </head>
  <body>
    <p>
      
      <span></span>
      &#x1F60B;
      &#128523;
      &#xf0;&#x9f;&#x98;&#x8b;
    </p>
  </body>
</html>

我正在使用 --encoding 'UTF-8' 选项调用 wkhtmltopdf

你可以看到渲染结果here(我很抱歉这张蹩脚的截图)。一些简短的结论:

  1. Safari 无法正确呈现 'raw' UTF-8 字节。它似乎将它们视为原始字节序列(html 段落的最后一行)。 Safari 渲染一切正常。
  2. Chrome 渲染一切正常。
  3. 使用上述选项,wkhtmltopdf 可以(某种程度上)呈现原始字节,但不能正确呈现 CSS content 属性。每次 'proper' 出现的 unicode 符号后面都会跟着这个奇怪的幻影符号。

我几乎什么都试过了,但结果都是一样的。 对我来说,即使是 Safari 也不能正确呈现原始字节这一事实表明某些 system-level macOS 特定的问题。 我不清楚是否应该将其报告为wkhtmltopdf 问题或 macOs 构建中存在一些行为不当的依赖项。

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

编辑: CSS 解决方法可能有用,请查看下面的评论。

最终编辑: 如评论中所示,解决问题的 CSS 'hack' 使用 text-rendering: optimizeLegibility;。这似乎只需要 macOS/OS X.

来自我下面的评论:

I just found this issue. It seems irrelevant at first glance, but adding text-rendering: optimizeLegibility; to my styles removed the duplicate characters (on macOS). Why this happens is beyond me. As the issue author also uses osx, it's apparent there is some problem withwkhtmltopdf builds for this os.