首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Yii2 Mpdf -升级后_MPDF_SYSTEM_TTFONTS不工作

Yii2 Mpdf -升级后_MPDF_SYSTEM_TTFONTS不工作
EN

Stack Overflow用户
提问于 2020-11-30 09:42:06
回答 2查看 799关注 0票数 0

我已经使用Bitnami中最新的服务器堆栈重新安装了我的Yii2应用程序。但还有一个问题我无法以任何方式解决。

Mpdf没有看到我的自定义字体,尽管它是在Pdf实例化之前定义的:define("_MPDF_SYSTEM_TTFONTS", Yii::getAlias('@webroot/fonts/'));

我得到了这个错误:

代码语言:javascript
复制
2020-11-28 15:29:08 [5.173.161.70][-][is46fr5fu08dvg8lthf00obqio][error][Mpdf\MpdfException:1] Mpdf\MpdfException: Cannot find TTF TrueType font file "Roboto-Regular.ttf" in configured font directories. in /opt/bitnami/hrpanel2/vendor/mpdf/mpdf/src/Fonts/FontFileFinder.php:33
Stack trace:
#0 /opt/bitnami/hrpanel2/vendor/mpdf/mpdf/src/Mpdf.php(3861): Mpdf\Fonts\FontFileFinder->findFontFile()
#1 /opt/bitnami/hrpanel2/vendor/mpdf/mpdf/src/Mpdf.php(4154): Mpdf\Mpdf->AddFont()
#2 /opt/bitnami/hrpanel2/vendor/mpdf/mpdf/src/Mpdf.php(10875): Mpdf\Mpdf->SetFont()
#3 /opt/bitnami/hrpanel2/vendor/mpdf/mpdf/src/Mpdf.php(1483): Mpdf\Mpdf->SetDefaultFont()
#4 /opt/bitnami/hrpanel2/vendor/kartik-v/yii2-mpdf/src/Pdf.php(271): Mpdf\Mpdf->__construct()
#5 /opt/bitnami/hrpanel2/vendor/kartik-v/yii2-mpdf/src/Pdf.php(247): kartik\mpdf\Pdf->setApi()
#6 /opt/bitnami/hrpanel2/vendor/kartik-v/yii2-mpdf/src/Pdf.php(359): kartik\mpdf\Pdf->getApi()
#7 /opt/bitnami/hrpanel2/vendor/kartik-v/yii2-mpdf/src/Pdf.php(236): kartik\mpdf\Pdf->output()
#8 /opt/bitnami/hrpanel2/common/models/Report.php(208): kartik\mpdf\Pdf->render()
#9 /opt/bitnami/hrpanel2/frontend/modules/urzad/controllers/ReportController.php(54): common\models\Report->download()

我也尝试过声明绝对路径,而不是@webroot,但是它并没有改变任何事情。

我想这已经停止工作,因为更新的组件,但我不知道如何纠正这一点。如有任何提示将不胜感激。

这是我的composer.json:

代码语言:javascript
复制
"name": "yiisoft/yii2-app-advanced",
"description": "Yii 2 Advanced Application Template",
"keywords": ["yii2", "framework", "advanced", "application template"],
"homepage": "http://www.yiiframework.com/",
"type": "project",
"license": "BSD-3-Clause",
"support": {
    "issues": "https://github.com/yiisoft/yii2/issues?state=open",
    "forum": "http://www.yiiframework.com/forum/",
    "wiki": "http://www.yiiframework.com/wiki/",
    "irc": "irc://irc.freenode.net/yii",
    "source": "https://github.com/yiisoft/yii2"
},
"minimum-stability": "stable",
"require": {
    "php": ">=5.4.0",
    "yiisoft/yii2": "*",
    "yiisoft/yii2-bootstrap": "*",
    "yiisoft/yii2-swiftmailer": "*",
    "lajax/yii2-translate-manager": "1.*",
    "kartik-v/yii2-editable": "*",
    "mongosoft/yii2-soap-server": "*",
    "phpoffice/phpexcel": "*",
    "kartik-v/yii2-mpdf": "*",
    "kartik-v/yii2-grid": "@dev",
    "yiisoft/yii2-jui": "~2.0.0",
    "2amigos/yii2-ckeditor-widget" : "~1.0",
    "kartik-v/yii2-widget-switchinput": "*",
    "philippfrenzel/yii2fullcalendar":"*",
    "yiisoft/yii2-imagine": "~2.0.0",
    "kartik-v/yii2-detail-view": "*",
    "kartik-v/yii2-widget-datepicker": "@dev",
            "tuyakhov/yii2-youtube": "*"
},
"require-dev": {
    "yiisoft/yii2-codeception": "*",
    "yiisoft/yii2-debug": "*",
    "yiisoft/yii2-gii": "*",
    "yiisoft/yii2-faker": "*",
    "yiisoft/yii2-swiftmailer": "*",
    "lajax/yii2-translate-manager": "1.*",
    "kartik-v/yii2-editable": "*",
    "mongosoft/yii2-soap-server": "*",
    "phpoffice/phpexcel": "*",
    "kartik-v/yii2-mpdf": "*",
    "kartik-v/yii2-grid": "@dev",
    "yiisoft/yii2-jui": "~2.0.0",
    "2amigos/yii2-ckeditor-widget" : "~1.0",
    "kartik-v/yii2-widget-switchinput": "*",
    "philippfrenzel/yii2fullcalendar":"*",
    "yiisoft/yii2-imagine": "~2.0.0",
    "kartik-v/yii2-detail-view": "*",
    "kartik-v/yii2-widget-datepicker": "@dev",
            "tuyakhov/yii2-youtube": "*"
},
"config": {
    "process-timeout": 1800
},
"extra": {
    "asset-installer-paths": {
        "npm-asset-library": "vendor/npm",
        "bower-asset-library": "vendor/bower"
    }
}

下面是包含Pdf定义的函数的完整代码:

代码语言:javascript
复制
    define("_MPDF_SYSTEM_TTFONTS", Yii::getAlias('@webroot/fonts/'));

    Yii::$app->response->format = \yii\web\Response::FORMAT_RAW;

    $content = Yii::$app->controller->renderPartial($view, $data);
    $header = Yii::$app->controller->renderPartial($headerView, $data);
    $cssInline = file_get_contents(Yii::getAlias('@webroot/source/css/report.css'));

    $pdf = new Pdf([
        'mode' => Pdf::MODE_UTF8,
        'format' => Pdf::FORMAT_A4,
        'orientation' => Pdf::ORIENT_PORTRAIT,
        'destination' => $destination,
        'content' => $content,
        'cssInline' => $cssInline,
        'cssFile' => Yii::getAlias('@webroot/source/css/common_rep.css'),
        'defaultFont' => 'roboto',
        'marginTop' => isset($margins[0]) ? $margins[0] : '',
        'marginRight' =>  isset($margins[1]) ? $margins[1] : '',
        'marginBottom' =>  isset($margins[2]) ? $margins[2] : '',
        'marginLeft' =>  isset($margins[3]) ? $margins[3] : '',
        'marginHeader' => isset($margins[4]) ? $margins[4] : '',
        'options' => [
            'title' => $this->getDocTitle(),
            'img_dpi' => 300,
            'debug' => true,
            'fontdata' => [
                "dejavusanscondensed" => [
                    'R' => "Roboto-Regular.ttf",
                    'I' => "Roboto-Regular.ttf",
                    'B' => "Roboto-Bold.ttf",
                ],
            ]
        ],
        'methods' => [
            'SetHTMLHeader' => [$header],
            'setHTMLFooter'=>['<table width="100%"><tr><td width="25%"></td><td width="50%" align="center"><img src="/img/logo-grey.png"/></td><td width="25%" align="right" valign="bottom">{PAGENO}</td></tr></table>'],
        ]
    ]);

    $pdf->filename = $this->getDocFilename(). '.pdf';
    return $pdf->render();
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-11-30 18:50:39

在没有约束的情况下,您对kartik-v/yii2-mpdf的依赖性安装了上一个mPDF版本8.x,它以不同的方式处理字体。

快速解决方案:将composer约束更改为"kartik-v/yii2-mpdf": "1.0.1"并执行编写器更新,这将在_MPDF_SYSTEM_TTFONTS仍然工作的地方安装mPDF 6.x。

如果您需要更新的PHP支持,那么首先在您的composer.json文件中更改您的PHP需要--这将排除在composer更新时一些可能出现的不兼容库。

然后安装kartik-v/yii2-mpdf的最后一个版本(也有一个上限)并设置它的options键,如下所示:

代码语言:javascript
复制
$defaultConfig = (new Mpdf\Config\ConfigVariables())->getDefaults();
$fontDirs = $defaultConfig['fontDir'];

$defaultFontConfig = (new Mpdf\Config\FontVariables())->getDefaults();
$fontData = $defaultFontConfig['fontdata'];

$pdf = new Pdf([
        ...
        'options' => [
            ...
            'fontDir' => array_merge($fontDirs, [
                Yii::getAlias('@webroot/fonts/'),
            ]),
            'fontdata' => array_merge($fontData, [
                 "dejavusanscondensed" => [
                     'R' => "Roboto-Regular.ttf",
                     'I' => "Roboto-Regular.ttf",
                     'B' => "Roboto-Bold.ttf",
                  ],
            ]),
            'default_font' => 'dejavusanscondensed'
        ],
        ...
    ]);

也许可以将字体命名为"roboto“,以防止将来出现混乱。

有关更多细节,请参阅文档。https://mpdf.github.io/fonts-languages/fonts-in-mpdf-7-x.html

通常,您不希望在您的*中使用星号*作为约束。总是包括上限,以防止这些变化的行为。

票数 1
EN

Stack Overflow用户

发布于 2020-11-30 10:17:23

只要尝试导入你的字体在简单的模板文件,如果它运行良好,问题将与您的路径别名。(我的意思是使用@web,或者在您的例子中使用@webroot)

或者您可以使用应用程序资产,您可以编写自己的应用程序,也可以定义要用于应用程序的所有依赖项。此外,还有一些别名的例子,你可以尝试一下,如果你像那里一样使用它们,会发生什么。

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65071159

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档