Yii2 Mpdf - _MPDF_SYSTEM_TTFONTS 升级后不起作用
Yii2 Mpdf - _MPDF_SYSTEM_TTFONTS does not work after upgrade
我已经使用 Bitnami 的最新服务器堆栈重新安装了我的 Yii2 应用程序。但是还有一个问题我无法以任何方式解决。
尽管在 Pdf 实例化之前定义了自定义字体,但 Mpdf 看不到我的自定义字体:
define("_MPDF_SYSTEM_TTFONTS", Yii::getAlias('@webroot/fonts/'));
我收到这个错误:
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:
"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 定义:
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();
只需尝试在简单的模板文件中导入您的字体,如果它工作正常,问题将出在您的路径别名上。 (我的意思是例如@web 或者你的情况是@webroot)
或者您可以使用应用程序资产,您可以编写自己的资产,并且可以定义要用于应用程序的所有依赖项。还有一些带有别名的例子,你可以试试如果你像那里那样使用它们会发生什么。
您对 kartik-v/yii2-mpdf
的依赖性没有限制地安装了最后一个 mPDF 版本 8.x,它以不同的方式处理字体。
快速解决方案:将您的作曲家约束更改为 "kartik-v/yii2-mpdf": "1.0.1"
并执行作曲家更新,这将安装 mPDF 6.x,其中 _MPDF_SYSTEM_TTFONTS
仍然有效。
如果您需要更新的 PHP 支持,请首先在您的 composer.json 文件中更改您的 PHP 需求 - 这将排除作曲家更新中一些潜在的不兼容库。
然后安装 kartik-v/yii2-mpdf
的最新版本(也有更高版本限制)并像这样设置它的 options
密钥:
$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
通常,您不希望在 composer.json 中使用星号 *
作为约束条件。始终包括上限以防止这些行为变化。
我已经使用 Bitnami 的最新服务器堆栈重新安装了我的 Yii2 应用程序。但是还有一个问题我无法以任何方式解决。
尽管在 Pdf 实例化之前定义了自定义字体,但 Mpdf 看不到我的自定义字体:
define("_MPDF_SYSTEM_TTFONTS", Yii::getAlias('@webroot/fonts/'));
我收到这个错误:
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:
"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 定义:
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();
只需尝试在简单的模板文件中导入您的字体,如果它工作正常,问题将出在您的路径别名上。 (我的意思是例如@web 或者你的情况是@webroot)
或者您可以使用应用程序资产,您可以编写自己的资产,并且可以定义要用于应用程序的所有依赖项。还有一些带有别名的例子,你可以试试如果你像那里那样使用它们会发生什么。
您对 kartik-v/yii2-mpdf
的依赖性没有限制地安装了最后一个 mPDF 版本 8.x,它以不同的方式处理字体。
快速解决方案:将您的作曲家约束更改为 "kartik-v/yii2-mpdf": "1.0.1"
并执行作曲家更新,这将安装 mPDF 6.x,其中 _MPDF_SYSTEM_TTFONTS
仍然有效。
如果您需要更新的 PHP 支持,请首先在您的 composer.json 文件中更改您的 PHP 需求 - 这将排除作曲家更新中一些潜在的不兼容库。
然后安装 kartik-v/yii2-mpdf
的最新版本(也有更高版本限制)并像这样设置它的 options
密钥:
$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
通常,您不希望在 composer.json 中使用星号 *
作为约束条件。始终包括上限以防止这些行为变化。