TCPDF& mPDF错误:有些数据已经输出到浏览器,无法发送PDF文件

时间:2013-11-22 14:13:46

标签: php symfony pdf tcpdf mpdf

问题:

TCPDF& 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项目)中移动时,我终于能够了解到发生了什么。在这种情况下,当我将浏览器指向示例页面时,它渲染得很好而没有任何错误(并且它是超快的btw)。所以,我知道它有效,而且我知道在代码或安装方面没有与空白相关的问题或任何其他相关问题(在mPDF / TCPDF方面)。这让我相信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

没有什么东西可以跳出来......还有其他想法吗?

8 个答案:

答案 0 :(得分:4)

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

<?php

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

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

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

?>

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

我遇到同样的问题,并在$ pdf-&gt; output():

之前添加此行
error_reporting(E_ALL);

然后我发现我的某些文件有BOM。 我看到一条警告信息发送到浏览器。

祝你好运!!

此致

答案 3 :(得分:0)

可能是因为你的HTML代码结果有一些错误输出来创建TCPDF ...

OR

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

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

我有同样的错误。

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之前清除所有缓冲区输出。

答案 7 :(得分:0)

我有同样的错误。

使用op_start();ob_end_clean();

解决此问题

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

但是默认情况下不启用输出缓冲。为了启用输出缓冲,必须先使用ob_start()函数,然后再在脚本中回显任何HTML内容。

[参考信用] [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