获取已经发送的标题'使用TCPDF

时间:2014-06-05 19:22:54

标签: php html pdf tcpdf

编辑2:问题没有解决;我找到了一个解决方法,切换到该文件的旧版本,使用ezpdf而不是TCPDF,并改变它以获得所需的打印输出(我不知道为什么整个网站中只有一个页面被更改为TCPDF,但显然它发生了)。我仍然想知道是否有办法解决这个问题,因为TCPDF的代码在运行php 5.2的服务器上正常运行,但不是新服务器。但是,它不再是一个主要优先事项。

提交PDF请求后,我什么都没得到;只是一个空白页面。这是从另一台服务器获取的所有代码(我们将php版本更新为5.3),并且代码在第一台服务器上正常工作。

  

警告:无法修改标头信息 - 已发送的标头(在path / tcpdf.php中的文件路径处开始输出)    TCPDF错误:某些数据已输出到浏览器,无法发送PDF文件

经过一些调试后,我发现问题是“已经发送错误的标题”, 我在更新这个网站时遇到了好几次。使用meta http-equiv可以修复大多数这些错误,因为它们大多只是页面刷新。但是,TCPDF使用标头来制作PDF文件并强行下载。

我怎样才能得到案例' D'工作,不需要标题,如果它不能完成,可以案例'我'改为在没有标题的情况下工作?

我尝试在ob_clean()之前使用$pdf->output()。我也尝试删除require_once('./common/tcpdf/config/lang/eng.php')。这些都为其他人解决了问题,我对这个话题进行了广泛的研究。我不认为它会在这种情况下起作用,因为我知道该网站此时已经开始输出。

我想要的是使用标题(meta http-equiv?)的替代方案,以防“D' D' (优先)或案例'我' (可行)在下面的代码中,这将给我相同的结果(pdf下载或在新的选项卡或窗口中打开的PDF)。当然,除非有另一种解决办法。如果没有,我将不使用TCPDF重新编写页面。

编辑:在原始服务器上,'生成pdf'导致页面重新加载,然后,经过漫长的等待(当它查询数据库时),它强制下载用户。在新服务器上,重新加载页面,发生查询的漫长等待,然后菜单实际中断(注销被删除,另一个按钮移动到菜单栏的其余部分下方),没有其他任何事情发生。

取自tcpdf.php的代码:

case 'I': {
                // Send PDF to the standard output
                echo "<script>console.log('some log');</script>";
                if (ob_get_contents()) {
                    $this->Error('Some data has already been output, can\'t send PDF file');
                }
                if (php_sapi_name() != 'cli') {
                    //We send to a browser
                    header('Content-Type: application/pdf');
                    if (headers_sent()) {
                        $this->Error('Some data has already been output to browser, can\'t send PDF file');
                    }
                    header('Cache-Control: public, must-revalidate, max-age=0'); // HTTP/1.1
                    header('Pragma: public');
                    header('Expires: Sat, 26 Jul 1997 05:00:00 GMT'); // Date in the past
                    header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');  
                    header('Content-Length: '.$this->bufferlen);
                    header('Content-Disposition: inline; filename="'.basename($name).'";');
                }
                echo $this->getBuffer();
                break;
            }
                case 'D': {
                    // Download PDF as file
                    if (ob_get_contents()) {
                        $this->Error('Some data has already been output, can\'t send PDF file');
                    }
                    header('Content-Description: File Transfer');
                    if (headers_sent()) {

                        $this->Error('Some data has already been output to browser, can\'t send PDF file');
                    }
                    header('Cache-Control: public, must-revalidate, max-age=0'); // HTTP/1.1
                    header('Pragma: public');
                    header('Expires: Sat, 26 Jul 1997 05:00:00 GMT'); // Date in the past
                    header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
                    // force download dialog
                    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);
                    // use the Content-Disposition header to supply a recommended filename
                    header('Content-Disposition: attachment; filename="'.basename($name).'";');
                    header('Content-Transfer-Encoding: binary');
                    header('Content-Length: '.$this->bufferlen);
                    echo $this->getBuffer();
                    break;
                }

3 个答案:

答案 0 :(得分:1)

在设置标题之前有一个回声。 只需删除:

echo "<script>console.log('some log');</script>";

在结束标题

之前可能没有eny echo或print

答案 1 :(得分:1)

添加

code ob_start() 
早期函数中的

和ob_end_flush();在$ pdf-&gt; output()

之后

答案 2 :(得分:0)

我在网络上看到了很多参考,它们使用ob_start(),并在文件末尾使用ob_end_flush()。 也许在某些情况下可行,尽管我真的不知道怎么做。没有不同意-只是说我不理解,我也没有发现它可以解决问题。

但是,我发现在文件顶部使用ob_start()和在输出之前使用ob_end_clean()应该可以解决问题。

Optional.ofNullable(rewardEntity.getLastModifiedDate())
    .map(r -> r.toZonedDateTime())
    .orElse(null) // or some other default value