【问题标题】:TCPDF & mPDF error: Some data has already been output to browser, can't send PDF fileTCPDF & mPDF 错误:一些数据已经输出到浏览器,无法发送 PDF 文件
【发布时间】:2013-12-07 10:59:00
【问题描述】:

问题:

TCPD & mPDF 错误:一些数据已经输出到浏览器,无法发送 PDF 文件 我放弃了尝试使用 TCPDF 修复错误并安装 mPDF 只是为了在尝试将文档呈现到浏览器时得到相同的错误。我可以很好地保存文档,并在检索时将其显示在浏览器中。

此外,此错误仅在从我的开发服务器切换到我的主机服务器后才出现。在 DEV 服务器上运行良好(DEV 服务器 = WAMPSERVER,PROD 服务器 = Hostgator Linux)。

疑难解答:

我已经阅读了互联网上有关此问题的大量其他讨论,但我找不到与空白相关的问题。我已将请求压缩为以下内容:

<?php
ob_start(); 
$html = "Hello World";
include("../mpdf.php");
$mpdf=new mPDF(); 
$mpdf->WriteHTML($html);
$mpdf->Output();
ob_end_clean();
?>

在 writeHtml 之前使用 ob_clean() 方法尝试了与 TCPDF 相同的概念。在所有情况下都出现相同的错误(我可以向所有人保证,这不是与空格相关的问题 - 我什至以十六进制查看文件,以确保编辑器没有插入奇怪的字符)。

可能的线索:

当我将整个 mPDF 库、类和文件夹移动到 public_html 文件夹而不是从我的应用程序文件夹(一个 symfony 项目)中时,我终于能够了解发生了什么。在这种情况下,当我将浏览器指向示例页面时,它呈现得很好,完全没有错误(顺便说一句,它超级快)。因此,我知道它有效,并且我知道关于代码或安装(在 mPDF/TCPPDF 方面)没有空白相关问题或任何其他相关问题。这让我相信 symfony 正在插入某种类型的标头(我尝试使用 clearHttpHeaders() 删除),或者我在 PROD 服务器上的某处缺少 PHP INI 或 CONFIG 设置。

有人知道这里发生了什么吗?

更新:流转储:

Request URL:http://www.example.com/mpdf
Request Method:GET
Status Code:200 OK

Request Headers
GET /mpdf HTTP/1.1
Host: www.example.com
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,/;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Cookie: __utma=44708724.1463191694.1383759419.1383759419.1383765151.2; __utmz=44708724.1383759419.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); PHPSESSID=9c7c802200b9d8eefe718447755add5f; __utma=1.813547483.1383767260.1385127878.1385130071.38; __utmb=1.7.10.1385130071; __utmc=1; __utmz=1.1383767260.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)

Response Headers
Cache-Control:no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Connection:Keep-Alive
Content-Type:text/html
Date:Fri, 22 Nov 2013 14:59:52 GMT
Expires:Thu, 19 Nov 1981 08:52:00 GMT
Keep-Alive:timeout=5, max=75
Pragma:no-cache
Server:Apache
Transfer-Encoding:chunked

什么都没有在我身上跳出来......还有其他想法吗?

【问题讨论】:

  • 您是否已经转储了流(如客户端所见)并查看了它?
  • 没有。我恳求无知。我不知道如何转储流。如果我的方向正确,我会很高兴。
  • 最好的办法是使用 Firefox,安装 Firebug 扩展,在 Firebug 中启用该站点的网络模块 - 这将逐字节显示您的客户端收到的内容......包括空格,换行符等我的提示:罪魁祸首将是 \r - Windows 忽略,但 Linux 不会忽略
  • 我试试看。
  • 嗯...和我的问题一样。我尝试删除我的 css 样式并且它可以工作。有什么建议吗?

标签: php symfony pdf tcpdf mpdf


【解决方案1】:

很可能是 BOM 标记,使用您的 IDE 将其删除,其他热修复可以是:

<?php

$html = "Hello World";
include("../mpdf.php");

ob_clean(); // cleaning the buffer before Output()

$mpdf=new mPDF(); 
$mpdf->WriteHTML($html);
$mpdf->Output();

?>

【讨论】:

  • 谢谢,但我想我提到我尝试了这两个修复(查看十六进制代码以尝试找到 BOM 标记,并且我尝试了 ob_clean() 的所有迭代)。还有其他想法吗?
【解决方案2】:

这可能是 PHP 在 pdf-> 输出之前发出的一些警告。警告文本被发送到客户端的浏览器,因此无法发送文件。
如果 DEV 和 PROD 的警告级别不同,则可以解释行为差异。

在我的情况下,使用 TCPDF,我有很多警告,例如“date() 依赖系统的时区设置是不安全的......”,然后是错误“一些数据已经输出到浏览器,可以“不发送 PDF”。
在我的 php 源代码中添加函数 date_default_timezone_set() 解决了警告和错误。

【讨论】:

  • 这很有帮助。有同样的问题,原来是 b/c 我留下了错误报告(直到我完成配置新服务器)。谢谢
【解决方案3】:

我也有同样的问题,在 $pdf->output() 之前添加这一行:

error_reporting(E_ALL);

然后我发现我在一些文件上有 BOM。 我看到一条警告消息发送到浏览器。

祝你好运!!

问候

【讨论】:

    【解决方案4】:

    可能是因为在您的 HTML 代码的结果中有一些错误要输出以创建 TCPDF ...

    如果上述方法不起作用,请尝试在 TCPDF 的类文件中将 Charset 设置为 UTF-8 可能会解决您的问题...

    因为一周前我的项目中发生了这种类型的错误......

    【讨论】:

      【解决方案5】:

      删除您在页面开头包含的所有文件。在我的情况下,它是一个与数据库连接的文件。它对我有用。 (来自@Nicolas400 的提示)

      【讨论】:

        【解决方案6】:

        尝试在include("../mpdf.php"); 之前使用ob_clean();

        【讨论】:

          【解决方案7】:

          我遇到了同样的错误。

          Data has already been sent to output, unable to output PDF file
          

          这意味着在使用 mPDF 创建 pdf 之前,一些数据存储在发送到浏览器的缓冲区中。因此无法创建 PDF。

          只要这样做.. 如果您正在为 pdf 准备数据,请在页面的第一行添加以下 php 内置函数。

          op_start();
          

          并在 mPDF 代码之前(在您调用 mpdf 之前)之前添加以下 php 内置函数

          ob_end_flush();
          
          require_once __DIR__ . '/vendor/autoload.php';
          
          $mpdf = new \Mpdf\Mpdf();
          $mpdf->WriteHTML($html);
          $mpdf->Output();
          

          这样它会在处理 mPDF 之前清除所有缓冲区输出。

          【讨论】:

            【解决方案8】:

            我遇到了同样的错误。

            使用op_start();ob_end_clean(); 解决这个问题

            PHP 是一种解释性语言,因此每个语句都一个接一个地执行,因此 PHP 倾向于将 HTML 分块发送到浏览器,从而降低性能。使用输出缓冲生成的 HTML 存储在缓冲区或字符串变量中,并在 PHP 脚本中的最后一条语句执行后发送到缓冲区进行渲染。

            但默认情况下未启用输出缓冲。为了启用输出缓冲,必须在任何回显脚本中的任何 HTML 内容之前使用 ob_start() 函数。

            [参考学分][1]

            [PHP | ob_start()函数][2]

            public function gen_pdf($html, $user_id, $paper = 'A4') {
                    ob_start();//Enables Output Buffering
                    $mpdf = new mPDF('UTF-8', $paper, '', '', 15, 15, 30, 20, 15, 5);
                    $mpdf->mirrorMargins = 1; // Use different Odd/Even headers and footers and mirror margins
            
                    $header = '';
                    $footer = '';
                    
                    $mpdf->SetHTMLHeader($header);
                    $mpdf->SetHTMLFooter($footer);
            
                    $mpdf->SetWatermarkText('Watermark', 0.1);
                    $mpdf->showWatermarkText = true;
                    $mpdf->WriteHTML($html);
                    $fileName = date('Y_m_d_H_i_s');
                    ob_end_clean();//End Output Buffering
                    $mpdf->Output('Example_' . $fileName . '.pdf', 'I');
                }
            

            这样它会在处理 mPDF 之前清除所有缓冲的输出。

            祝你好运... [1]:https://www.geeksforgeeks.org/php-ob_start-function/ [2]:https://www.php.net/manual/en/function.ob-start.php

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-01-05
              • 2020-05-15
              • 2013-04-07
              • 2012-04-05
              • 2017-09-28
              相关资源
              最近更新 更多