无法删除 mPDF 中的 PHP 通知

2023-12-06

我正在使用mPDF 库直接从 HTML 输出生成 PDF 文档。问题是这个 mPDF 库是按原样编写的,并且它生成了许多通知(未定义的索引、未定义的偏移量等)。我尝试了一切来停止输出它们,但还没有任何帮助。

我试着把error_reporting(E_ALL ^ E_NOTICE);error_reporting(E_ALL & ~E_NOTICE);我将其插入到我的index.php中,插入到直接包含mpdf.php的类和方法中,并且也插入到mpdf.php的开头。我也尝试过与ini_set('display_errors', 0);- 所有这些指令都适用于整个 Web 应用程序,但不适用于 mpdf。因此,即使 PDF 格式正确且有效,我也无法输出它(让用户下载它)。

另外,我的 HTML(简单的表格,实际上没什么特别的)也出现了问题,而示例工作正常并且没有任何通知。

所以我需要的帮助是:要么去掉通知,要么更好地帮助我找出 mPDF 不适合我的原因。

如果我使用这段代码:

include_once(DIR_MPDF.'mpdf.php');
$mpdf = new mPDF();
$mpdf->useOnlyCoreFonts = true;
$mpdf->SetDisplayMode('fullpage');
$mpdf->SetAutoFont(0);
$mpdf->WriteHTML('<table><tr><td>HELLO WORLD</td></tr></table>');
$mpdf->Output();
exit;

一切正常,但如果我尝试输出以下 HTML:

$mpdf->WriteHTML('<table><tr><td>HELLO WORLD</td><td>HELLO WORLD</td></tr></table>');

我收到通知,因此无法输出 PDF。

如果我将 mPDF 的输出保存到文件中(例如使用file_put_contents()),即使我使用复杂的 HTML,PDF 也是有效的,因此可读 - 但通知仍然会打印到浏览器中。无论如何,我需要提供 PDF 供下载,而不是保存到文件系统中。

好的,我找到了一个解决方案,虽然它不是最佳实践(但它有效):我将代码括起来ob_start(); and ob_end_clean();同时捕获我输出的 $pdf 字符串而不是 mPDF。

最终代码:

ob_start();
include(DIR_MPDF.'mpdf.php');
$html = $this->render(TRUE);

$mpdf = new mPDF('utf-8','A4');

$mpdf->useOnlyCoreFonts = true;
$mpdf->SetDisplayMode('fullpage');
$mpdf->SetAutoFont(0);

$stylesheet = file_get_contents(DIR_APPLICATION.'view/stylesheet/declaration.css');
$mpdf->WriteHTML($stylesheet,1);

$mpdf->WriteHTML($html);

$pdf = $mpdf->Output('', 'S');
$ob = ob_get_contents();
ob_end_clean();

if (headers_sent())
    die('Some data has already been output to browser, can\'t send PDF file');
header('Content-Description: File Transfer');
header('Content-Transfer-Encoding: binary');
header('Cache-Control: public, must-revalidate, max-age=0');
header('Pragma: public');
header('Expires: Sat, 26 Jul 1997 05:00:00 GMT');
header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
header('Content-Type: application/force-download');
header('Content-Type: application/octet-stream', false);
header('Content-Type: application/download', false);
header('Content-Type: application/pdf', false);
if (!isset($_SERVER['HTTP_ACCEPT_ENCODING']) OR empty($_SERVER['HTTP_ACCEPT_ENCODING'])) {
    header('Content-Length: '.strlen($pdf));
}
header('Content-disposition: attachment; filename="invoice.pdf"');
echo $pdf;
exit;

虽然没有答案,并且因为我没有找到任何其他合适的解决方案,但这里是我迄今为止所拥有的内容的摘要(主要是从上面的问题复制而来):

ob_start(); // <--| This is very important to start output buffering and to catch out any possible notices
include(DIR_MPDF.'mpdf.php');
$html = $this->render(TRUE);

$mpdf = new mPDF('utf-8','A4');

$mpdf->useOnlyCoreFonts = true;
$mpdf->SetDisplayMode('fullpage');
$mpdf->SetAutoFont(0);

$stylesheet = file_get_contents(DIR_APPLICATION.'view/stylesheet/declaration.css');
$mpdf->WriteHTML($stylesheet,1); // <--| By the second param we are saying to MPDF that it is icnluding only stylesheet

$mpdf->WriteHTML($html);

$pdf = $mpdf->Output('', 'S'); // <--| With the binary PDF data in $pdf we can do whatever we want - attach it to email, save to filesystem, push to browser's PDF plugin or offer it to user for download
$ob = ob_get_contents(); // <--| Here we catch out previous output from buffer (and can log it, email it, or throw it away as I do :-) )
ob_end_clean(); // <--| Finaly we clean output buffering and turn it off

// The next headers() section is copied out form mPDF Output() method that offers a PDF file to download
if (headers_sent())
    die('Some data has already been output to browser, can\'t send PDF file');
header('Content-Description: File Transfer');
header('Content-Transfer-Encoding: binary');
header('Cache-Control: public, must-revalidate, max-age=0');
header('Pragma: public');
header('Expires: Sat, 26 Jul 1997 05:00:00 GMT');
header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
header('Content-Type: application/force-download');
header('Content-Type: application/octet-stream', false);
header('Content-Type: application/download', false);
header('Content-Type: application/pdf', false);
if (!isset($_SERVER['HTTP_ACCEPT_ENCODING']) OR empty($_SERVER['HTTP_ACCEPT_ENCODING'])) {
    header('Content-Length: '.strlen($pdf));
}
header('Content-disposition: attachment; filename="invoice.pdf"');
echo $pdf; // <--| With the headers set PDF file is ready for download after we call echo
exit;

正如上面评论中所写,接下来我(或客户:-))将如何处理从 mPDF 返回的 PDF 数据。我通过应用程序在更多地方使用此 PDF 生成,并且主要提供 PDF 供下载,但我也将其附加到电子邮件中(用户付款,我生成 PDF 发票并通过电子邮件发送)。

我没有找到解决方案(也没有更多时间这样做)来阻止 mPDF 生成通知,并且还没有失去“修复”mpdf.php(及其 1.34 MB PHP 代码)的想法,因此这是(目前)唯一适合我的解决方案。

也许它会对某人有所帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法删除 mPDF 中的 PHP 通知 的相关文章

  • 如何在php项目中使用Piwik设备检测器?

    我想用php 设备检测器 https github com piwik device detector这是著名的 Piwik 项目的一部分 但我不明白如何在我的 php 代码中包含和使用该代码 我不想使用作曲家 I wrote
  • 排除“解析错误,意外的‘>’”错误[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我收到这个
  • mysql REGEXP 不匹配

    我有一个正则表达式 旨在捕获字符串中的电话号码 1 s d 3 s d 3 s d 4 我尝试使用以下查询在 MySql 数据库中查询此正则表达式 SELECT FROM everything instances meta AS m WHE
  • 插入值数组

    我有一个具有可变数量值的数组 除了内部带有查询的循环之外 是否有更有效或更好的方法将它们插入到我的数据库中 At 这个网站 http www desilva biz mysql insert html 有一个很好的 MySQL 多插入查询示
  • 让网站登录也能在 WordPress 上使用

    我使用 PHP 和 MySQL 开发了一个网站 该网站已经有登录和注册表单 myweb com 我已经在这个网址添加了 wordpressmyweb com blog 我想禁用 WordPress 上的登录和注册页面并强制用户使用我的 基本
  • XPath 直到下一个标签

    与之前在这里问过的其他人类似的问题 但由于我不知道如何应用这些建议 所以我需要一些帮助 我想找到一个 html 文档的节点 其结构如下 摘录 可能有所不同 h2 My title 1 h2 h3 Sub heading h3 p span
  • 来自同一数组的引用键

    我试图引用同一数组中项目的键 值对 glossary args array name gt Glossary Terms singular name gt Glossary Term add new gt Add New Term edit
  • HTML/PHP if-else 语句

    我正在使用 Bootstrap 创建一个网站 我想输入 if else 语句 但我不知道该怎么做 让我解释 Here is an image of my current HTML snippet 现在我想要的是 如果我通过 An Aussc
  • PHP exec - 检查是否启用或禁用

    有没有办法检查 php 脚本是否exec 在服务器上启用还是禁用 这将检查该功能是否确实有效 权限 权利等 if exec echo EXEC EXEC echo exec works
  • 获取当前 URL/URI,不带某些 $_GET 变量

    在 Yii 中如何获取当前页面的 URL 例如 http www yoursite com your yii application lg pl id 15 但不包括 GET lg 无需手动解析字符串 我的意思是 我正在寻找类似的东西Yii
  • 未找到“Guzzle\Http\Client”类

    我正在尝试在 sitepoint 上跟进本教程http www sitepoint com guzzle php http client http www sitepoint com guzzle php http client 我这里是一
  • 音频端播放新文件

    我有一个webapp https radio repjesus com当您使用 ajax jquery 单击链接时加载并播放音轨 一切正常 但当曲目结束时 曲目将设置为循环 并且这种情况可以永远持续下去 我希望播放器从数据库中自动加载随机曲
  • MySQL 中复制一条记录

    我有一个表 我想复制表中的特定行 我知道这不是最好的方法 但我们正在寻找快速解决方案 这比我最初想象的要难 我需要做的就是将整个记录复制到 MySql 中自动增量表中的新记录 而不需要指定每个字段 这是因为该表将来可能会发生变化 并且可能会
  • 将数组内爆为来自 mysql 查询的逗号分隔字符串

    在过去的 1 1 2 天里 我一直在尝试将 16 行 id 存储到一个字符串中 并用逗号分隔每个 id 我得到的数组来自 MySQL 我得到的错误是 implode 函数 传递了无效参数 str array string while row
  • 在 PHP 中查找数字的倍数

    我想在 PHP 中找到一个数字的所有倍数 我正在使用这样的东西 if count 20 计算出如果 count不等于20 但我还需要这个脚本来检查是否 count不等于 20 40 60 80 100 120 140 160 等 有任何想法
  • 用于查找 标记之间的所有内容的正则表达式

    我正在尝试找到一种方法来列出之间的所有内容 a and a 标签 所以我有一个链接列表 我想获取链接的名称 不是链接的位置 而是它们在页面上的名称 对我来说真的很有帮助 目前我有这个 lines preg split r n r conte
  • Laravel 4:Facades 是如何解决的?

    我有点想看看 Laravel 4 发生了什么facades在引擎盖下 我们以这个 Facade 为例 File get someArgs 如果我没有记错的话 逐步 过于简化 的调用将是 static method invocation wh
  • /etc/php5/conf.d 文件夹中的 .ini 文件有什么用?

    我知道 ini 文件位于 etc php5 cli与 PHP 的 CLI 使用有关 文件位于 etc php5 fpm是关于 PHP 的 FastCGI FPM 方面 但是位于以下位置的 ini 文件又如何呢 etc php5 conf d
  • 针对 Woocommerce 中多个产品类别计数的 ajax 添加到购物车的 JS 警报

    在 Woocommerce 中 当达到特定产品类别的购物车中的产品的特定数量时 我尝试显示 JavaScript 甜蜜警报 并在达到二级类别的产品的特定数量时显示另一个警报 商品通过 AJAX 添加到购物车 这就是我想使用 JavaScri
  • 将数组值与同一数组中的其他值进行比较

    我想要实现的是 它将循环遍历数组 然后它会检查数组中的项目在三个点上是否相同 product id 尺寸值和颜色值 我想创建一个新数组 其中列出了项目 我唯一不想要的是重复的值 我希望重复的值如果在这三个点上相同 则数量将被计算在一起 就像

随机推荐

  • 使用自定义顺序对行重新排序

    给定数据 library data table DT data table category LETTERS 1 3 b 1 3 DT category b 1 A 1 2 B 2 3 C 3 Using dplyr 如何重新排列行以获得特
  • 如何使用 proto-buffers 有效地完成继承

    我有一个基类消息 message Animal optional string name 1 optional int32 age 2 以及扩展动物的子类 message Dog optional string breed 1 因此 在构建
  • EF DbContext。如何避免缓存?

    花了很多时间 但仍然无法理解如何避免在DbContext中进行缓存 我在下面附上了一些简单案例的实体模型来演示我的意思 问题在于 dbcontext 缓存结果 例如 我有下一个用于从数据库查询数据的代码 using TestContext
  • Linux C Socket:recv 调用被阻止

    在我的应用程序中 我为一个简单的http服务器创建了一个线程 然后在我的应用程序中我尝试连接到http服务器 但控制在recv调用上被阻止 挂起 但是 如果尝试使用 linux GET 命令连接到我的应用程序的 http 服务器 我将成功连
  • UIImagePNGRepresentation ..... writeToFile 始终是横向的

    每次我用相机拍照 然后保存时 图像总是横向的 这意味着我的 Xib 中的 UIImageView 是错误的 它的肖像 这就是我想要和期望的 我可以通过将图像旋转 90 度来纠正此问题 但即使如此 我也无法禁用显示原始风景照片和动画旋转本身的
  • iPhone 上的数据应使用哪个 JSON 库

    似乎至少有三个不同的库可用于从 HTTP 请求中提取 JSON 数据 TouchJSON http code google com p touchcode BSJSONAdditions 在 json org 列出 http blakese
  • c# 从右到左打印

    我正在处理一些阿拉伯语数据 我想从右到左打印它 我试过这个 StringFormat format new StringFormat StringFormatFlags DirectionRightToLeft e Graphics Dra
  • 由于 jill.rar + jack.rar,Android 构建失败

    灵感来自这个答案 我在用着 java jar BUILDTOOLSPATH jill jar output classes jayce src java jar BUILDTOOLSPATH jack jar import classes
  • 适用于多种语言的 C# 字符串格式

    我正在尝试英文字符和汉字左右对齐的格式 由于中文字符的宽度不同 我无法与 string format 对齐 Example String Format 0 40 1 8 some string 20 00 String Format 0 4
  • Subversion - 使用 SVNParentPath 时如何控制单个存储库的用户访问?

    我有颠覆存储库 可以正常工作 所有用户都需要密码身份验证 我的配置发布在下面 我如何修改此配置 以便允许单个用户对我的存储库之一具有只读访问权限 提供的示例需要使用 SVNParentPath 而不是 SVNPath 前者允许您指定包含多个
  • mysql中如何获取行id

    我想获取不同idfeedback的行id SELECT l idfeedback store curRow curRow 1 AS row number FROM feedback store l JOIN SELECT curRow 0
  • 我可以为 Android Auto 制作任何应用程序吗?

    我是 Android Auto 新手 有一个疑问 我有一个应用程序 用户只需选择商品并付款 可以将我的应用引入 Android Auto 吗 因为我进行了很多搜索 但只找到了媒体和消息应用程序的示例 研究媒体和消息 SDK 中的示例 它们没
  • 浏览器关闭时.net core cookie 身份验证

    我在 net core mvc 应用程序中使用 cookies 身份验证 我的要求之一是在浏览器关闭时注销用户 我在应用程序中将滑动过期时间设置为 5 分钟 正如预期的那样 如果用户在 5 分钟后返回网站 用户将被重定向到登录页面 但如果用
  • .bash_profile 中定义的别名在 OS X 中不起作用

    我在我的中定义了三个别名 bash profile但我的 bash shell 没有读取它 定义的别名在我的终端中不起作用 我无法解决此问题 alias handybook cd Users rsukla development repos
  • JavaFX .exe 文件因主类异常而失败

    我开发了一个 JavaFX 应用程序 并使用本机打包工具 包括 Inno Setup 5 和 WiX 来创建 exe 文件和安装程序 该程序是一个独立的应用程序 这意味着它有自己的 JRE 和 lib 文件夹中的一些外部 jar 当我安装并
  • 使用带有 typescript 的 webpack 进行反应时导入无法识别图像模块

    我遇到一个问题 在使用 webpack 加载图像文件时出现以下错误 如果我使用 webpack dev server 运行应用程序 则会显示图像 以便能够将其拉入 文件夹结构如下所示 home home tsx images test2 p
  • 如何使任何悬停颜色比原始颜色更暗/更亮

    我想要做到这一点 以便当您将鼠标悬停在某个元素上时 它总是比最初更暗或更亮 无论颜色如何 像这样但普遍的东西 darker Background red width 100px height 100px darker hover Backg
  • Laravel 调度程序日志

    哪里做Laravel 存储调度程序的日志也就是说 如果我们设置一个调度程序 间隔 2 小时 并且它已在中午 12 点执行 那么它应该在下午 2 点执行吗 Laravel 如何知道调度程序不应该在下午 1 点执行 我遇到了两种存储日志的方法
  • 需要有关如何实现 js/css 版本控制的建议

    所以我正在实现这个 js css 版本控制方案 我基本上附加了 js css 文件的校验和 我想到的策略是 基本上获取这个校验和值 然后计算文件的校验和 我认为可能来自缓存 如果它们匹配 则客户端拥有最新的文件 如果不匹配 则客户端拥有最新
  • 无法删除 mPDF 中的 PHP 通知

    我正在使用mPDF 库直接从 HTML 输出生成 PDF 文档 问题是这个 mPDF 库是按原样编写的 并且它生成了许多通知 未定义的索引 未定义的偏移量等 我尝试了一切来停止输出它们 但还没有任何帮助 我试着把error reportin