加入收藏 | 设为首页 | 会员中心 | 我要投稿 安卓应用网 (https://www.0791zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > PHP > 正文

CakePhp 3.x,TCPDF,htmlspecialchars

发布时间:2020-05-25 09:18:21 所属栏目:PHP 来源:互联网
导读:我在文档后面安装了插件“CakePDF”: https://github.com/FriendsOfCake/CakePdf 现在我想构建第一个PDF,我收到以下错误: 这是我在bootstrap.php中的配置: Configure::write(CakePdf, [ engine = CakePdf.Tcpdf, margin = [ bo

我在文档后面安装了插件“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'
]);

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

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

这是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);
    }

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

正如您所想,问题是TCPDF类与mb_internal_encoding()混淆,mb_internal_encoding()在CakePHP h()函数中用于确定应用程序默认编码,以防没有显式的传递作为参数.

我不是TCPDF专家,多年来都没有使用它,但是从快速查看当前的源代码,我很难理解为什么它完全摆弄内部编码,因为唯一的mb_ *函数库使用的是mb_convert_encoding(),其中两个编码参数都被传递,因此根本没有使用内部编码.话虽如此,我会将此报告为TCPDF开发人员的错误/问题.

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

TL;博士

简而言之,只在视图模板中构建HTML,如果您确实需要访问PDF引擎实例,因为您需要做的事情只能通过这种方式实现,那么CakePDF不是您正在寻找的插件对于.

(编辑:安卓应用网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读