CakePhp 3.x,TCPDF,htmlspecialchars

Ley*_*yla 6 php cakephp tcpdf cakephp-3.0

我在文档后面安装了插件"CakePDF":https://github.com/FriendsOfCake/CakePdf

现在我想构建第一个PDF,我收到以下错误:

在此输入图像描述

这是我在bootstrap.php中的配置:

Configure::write('CakePdf', [
    'engine' => 'CakePdf.Tcpdf',
    'margin' => [
        'bottom' => 15,
        'left' => 50,
        'right' => 30,
        'top' => 45
    ],
    'download' => true,
    'encoding' => 'UTF-8'
]);
Run Code Online (Sandbox Code Playgroud)

我编写的唯一代码是模板中的以下代码:

$pdf = new TCPDF('P', 'mm', 'A4', true, 'UTF-8', false);
Run Code Online (Sandbox Code Playgroud)

这是functions.php中第68行的代码:

function h($text, $double = true, $charset = null)
    {
        if (is_string($text)) {
            //optimize for strings
        } elseif (is_array($text)) {
            $texts = [];
            foreach ($text as $k => $t) {
                $texts[$k] = h($t, $double, $charset);
            }
            return $texts;
        } elseif (is_object($text)) {
            if (method_exists($text, '__toString')) {
                $text = (string)$text;
            } else {
                $text = '(object)' . get_class($text);
            }
        } elseif (is_bool($text)) {
            return $text;
        }

        static $defaultCharset = false;
        if ($defaultCharset === false) {
            $defaultCharset = mb_internal_encoding();
            if ($defaultCharset === null) {
                $defaultCharset = 'UTF-8';
            }
        }
        if (is_string($double)) {
            $charset = $double;
        }
        return htmlspecialchars($text, ENT_QUOTES | ENT_SUBSTITUTE, ($charset) ? $charset : $defaultCharset, $double);
    }
Run Code Online (Sandbox Code Playgroud)

我非常困惑,无法找到任何解决方案.有人有想法吗?

lor*_*key 10

在尝试查找和调试相同的错误超过一个小时后,我只是将值重置UTF-8为使用TCPDF后 - 一切都像以前一样工作:

$pdf = new TCPDF('P', 'mm', 'A4', true, 'UTF-8', false);

///...create, save, display your pdf

// Reset the encoding forced from tcpdf
mb_internal_encoding('UTF-8');
Run Code Online (Sandbox Code Playgroud)

我也尝试在调用之后直接重置它new TCPDF,一切都很好.我不知道这个重置会出现什么问题:)我的PDF在此之后仍然看起来一样,但电子邮件再次发送.


ndm*_*ndm 0

正如您所想到的,问题是 TCPDF 类与 混淆mb_internal_encoding(),它在 CakePHPsh()函数中使用来确定应用程序的默认编码,以防没有明确的编码作为参数传递。

我不是 TCPDF 专家,已经很久没有使用它了,但是从快速浏览当前的源代码来看,我很难理解为什么它会干扰内部编码,因为这是mb_*该库的唯一功能使用 is mb_convert_encoding(),其中两个编码参数都被传递,因此根本不使用内部编码。话虽这么说,我会将其作为错误/问题报告给 TCPDF 开发人员。

无论如何,您遇到这个问题只是因为您使用 CakePDF 的方式错误。无需手动创建 PDF 引擎实例,这就是 CakePDF 自动为您做的事情,这几乎是该插件的全部要点,它抽象了 PDF 创建,以便您只需在视图模板中构建适当的 HTML。这样,您还可以避免当前遇到的 TCPDF 编码问题,因为视图模板是在创建 PDF 引擎实例之前渲染的。

太长了;博士

长话短说,仅在视图模板中构建 HTML,如果您确实需要访问 PDF 引擎实例,因为您需要做的事情只能通过这种方式实现,那么 CakePDF 不是您正在寻找的插件为了。