WkHTMLtoPDF Unicode 问题
WkHTMLtoPDF Unicode Issue
我已经阅读了几篇类似的 Whosebug 帖子,其中 none 能够解决我的问题。
问题
我有一个由 WkHTMLtoPDF 生成的 PDF,其中包含一个 unicode RIGHT SINGLE QUOTATION MARK
(U+2019 或 ’
)字符。在浏览器中呈现,输出如下所示:
当我通过 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 文件)
在这一点上,我不清楚为什么 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()
,将其传递给 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 字符的位置。这表示 encoding 问题,而不是 font 问题。 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">
我已经阅读了几篇类似的 Whosebug 帖子,其中 none 能够解决我的问题。
问题
我有一个由 WkHTMLtoPDF 生成的 PDF,其中包含一个 unicode RIGHT SINGLE QUOTATION MARK
(U+2019 或 ’
)字符。在浏览器中呈现,输出如下所示:
当我通过 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 文件)
在这一点上,我不清楚为什么 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()
,将其传递给 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 字符的位置。这表示 encoding 问题,而不是 font 问题。 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">