WkHTMLtoPDF Unicode问题

14

我已经阅读了几篇类似的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 (with patched 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绝对定位在图片上方。

1个回答

33

经过几天的努力,我终于弄明白了

问题不在于字体。如果是的话,我会看到一个字形无法加载(例如 - 方框或问号将出现在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"选项不起作用,但是将一个meta字符集标签添加到HTML中可以解决这个问题:

<meta charset="utf-8">

12
我也发现了这个问题!添加以下代码 < meta http-equiv="Content-type" content="text/html; charset=utf-8" /><meta charset="UTF-8" /> 可以解决我的问题。 - Kerwin Sneijders
那是一个很棒的 RCA,已点赞! - Sukhvir Singh
可以确认这个有效。在我的模板中添加<meta charset="utf-8">后,德语Umlaute和其他特殊字符如货币符号€在生成的PDF中显示正确,非常感谢! - L. Heinrichs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接