【问题标题】:WkHTMLtoPDF Unicode IssueWkHTMLtoPDF Unicode 问题
【发布时间】:2023-03-08 23:28:01
【问题描述】:

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

问题

我有一个由 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以验证@ 987654333@ 已正确安装。 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,我在视图上调用 -&gt;render(),将其传递给 PDF::loadHTML,然后在结果上调用 -&gt;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 wkhtmltopdf laravel-snappy knp-snappy


    【解决方案1】:

    几天后,我终于弄明白了

    问题确实出在字体上。如果是这样,我会看到一个字形无法加载(例如 - 一个框或问号会出现在 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">
    

    【讨论】:

    • 这也是我发现的!添加:&lt;meta http-equiv="Content-type" content="text/html; charset=utf-8" /&gt;&lt;meta charset="UTF-8" /&gt; 为我解决了这个问题
    • 这是一个不错的 RCA。点赞!
    猜你喜欢
    • 2012-07-27
    • 2013-01-05
    • 1970-01-01
    • 1970-01-01
    • 2016-02-20
    • 2015-01-12
    • 2012-08-07
    • 1970-01-01
    相关资源
    最近更新 更多