unicode - WkHTMLtoPDF Unicode 问题

标签 unicode wkhtmltopdf laravel-snappy knp-snappy

我已经阅读了几篇类似的 StackOverflow 帖子,但没有一个能够解决我的问题。

问题

我有一个由 WkHTMLtoPDF 生成的 PDF,其中包含一个 unicode RIGHT SINGLE QUOTATION MARK (U+2019 或 )字符。在浏览器中呈现,输出如下所示:

working image - in a browser

当我通过 WkHTMLtoPDF 运行它时,我得到以下信息:

failed image - in wkhtmltopdf

编码

我将以下内容用于我的 CSS:

@font-face {
    font-family: localGeorgia;
    src: url("file:///usr/share/fonts/truetype/georgia/GEORGIA.TTF");
}

body {
    overflow: visible !important;
    font-family: localGeorgia, Georgia, Times, "Times New Roman", serif;
    font-size: 12px;
}

我还将Georgia 字体从本地计算机复制到服务器(/usr/share/fonts/truetype/georgia/ 目录中有几个文件)并且我运行了fc-cache -fv清除字体缓存并运行fc-list验证 Georgia已正确安装。 localGeorgia字体系列是作为一种形式添加的,因为我仍然没有得到工作显示。

我已经通过在线文档和我的操作系统的字符映射验证了 Georgia 字体确实支持 RIGHT SINGLE QUOTATION MARK (见下文)虽然我不知道如何明确证明这个字形在 TrueType 文件中(我不熟悉打开或解析 TrueType 文件)

Windows character map for Georgia font

在这一点上,我不清楚为什么 WkHTMLtoPDF 会显示这些乱七八糟的字符而不是正确的 unicode 字形

附加细节(环境等)

我正在运行 Ubuntu 16.04

Laravel 5.3 版

我正在使用 Laravel-Snappy 0.3.3 版(使用 KNP-Snappy 0.4.3 版)

我对 Snappy 的配置非常简单:
<?php
return array(
    'pdf' => array(
        'enabled' => true,
        'binary'  => base_path('vendor/h4cc/wkhtmltopdf-amd64/bin/wkhtmltopdf-amd64'),
        'timeout' => false,
        'options' => array(),
        'env'     => array(),
    ),
    'image' => array(
        'enabled' => false,
        'binary'  => '/usr/local/bin/wkhtmltoimage',
        'timeout' => false,
        'options' => array(),
        'env'     => array(),
    ),
);

安装的 wkhtmltopdf 版本为 0.12.3(带补丁的 qt)

要生成 PDF,我正在调用 ->render()在 View 上,将其传递给 PDF::loadHTML ,然后调用 ->inline()结果并返回响应。这是我如何生成 PDF 的最小示例:
$property = Property::find(1);
$view = View::make("pdf.flier")->with(["property" => $property]);
$pdf = PDF::loadHTML($view->render())->inline();
return response($pdf)->header("application/pdf")->header("Content-Disposition", "attachment; filename=flier.pdf");

HTML 非常简单:
<html>
<head>
    <base href="{{ url("/") }}" />
    <link rel="stylesheet" type="text/css" href="css/flier.css" />
</head>
<body>
    <img src="{{ $property->image }}" />
    <h1>{{ $property->title }}</h1>
</body>
</html>

CSS 给出 h1图像顶部的绝对位置

最佳答案

几天后,我终于想通了

问题确实 不是 与字体说谎。如果是这样,我会看到一个字形无法加载(例如 - 一个框或问号会出现在 unicode 字符的位置)

相反,我看到的是 几个 不正确的字形出现在所需的 Unicode 字符的位置。这表示 编码 问题,不是 字体 问题。 WkHTMLtoPDF 将 3 字节 unicode 字符解释为 3 个单独的 1 字节 ASCII 字符

问题是我的浏览器默认编码为 UTF-8,但 WkHTMLtoPDF 没有(至少在 0.12.3 版本中没有)。修复很简单:更新我的配置文件

<?php
return array(
    'pdf' => array(
        'enabled' => true,
        'binary'  => base_path('vendor/h4cc/wkhtmltopdf-amd64/bin/wkhtmltopdf-amd64'),
        'timeout' => false,
        'options' => array(
            'encoding' => 'utf-8'
        ),
        'env'     => array(),
    ),
    'image' => array(
        'enabled' => false,
        'binary'  => '/usr/local/bin/wkhtmltoimage',
        'timeout' => false,
        'options' => array(
            'encoding' => 'utf-8'
        ),
        'env'     => array(),
    ),
);

注:在我的研究中,我发现了一些声称“--encoding”选项对他们不起作用的人的例子,但是在 HTML 中添加元字符集标记确实:
<meta charset="utf-8">

关于unicode - WkHTMLtoPDF Unicode 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49723737/

相关文章:

python - PDF 打印受密码保护的页面(最好让 wkhtmltopdf 使用 cookie)

php - 如何在 Linux (centos) 上安装带有 PHP 绑定(bind)的 wkhtmltopdf

Laravel snappy return Failed to load about :blank, with network status code 301 and http status code 0 - Protocol "about"is unknown 错误

css - Laravel snappy(^0.3.3) - 无法包含 css 样式、图像

html - pdf 中的 CSS 网格/flex

python - ProgrammingError : (1064, '您的 SQL 语法有误;检查与您的 MySQL 服务器版本对应的手册以了解正确的语法

android - 为什么不能在SD卡中使用特殊字符(超过10000个unicode)文件名?

unicode - 字符中间的大项目符号的 Unicode 字符是什么?

python - 如何在 Snowflake 中规范化 unicode 字符串?

php - 无法通过 php 中的 exec() 函数运行 wkhtmltopdf 命令,但相同的命令在命令行上有效