WkHTMLtoPDF Unicode问题

ste*_*esu 4 unicode wkhtmltopdf laravel-snappy knp-snappy

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

问题

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

工作图像 - 在浏览器中

当我通过WkHTMLtoPDF运行时,我得到以下内容:

失败的图像 - 在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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

Windows字符映射为Georgia字体

在这一点上,我不清楚为什么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(),
    ),
);
Run Code Online (Sandbox Code Playgroud)

已安装的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");
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

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

ste*_*esu 9

几天之后,我终于弄明白了

这个问题确实说谎的字体.如果是这样,我会看到一个字形无法加载(例如 - 一个框或一个问号将出现代替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(),
    ),
);
Run Code Online (Sandbox Code Playgroud)

注意:在我的研究中,我发现一些人声称"--encoding"选项对他们不起作用的例子,但是为HTML添加了一个meta charset标记:

<meta charset="utf-8">
Run Code Online (Sandbox Code Playgroud)

  • 这也是我发现的!添加:`<meta http-equiv ="Content-type"content ="text/html; charset = utf-8"/> <meta charset ="UTF-8"/>`为我解决了这个问题 (5认同)