生成要打印的表结构时,TCPDF返回错误


TCPDF returning error while generating table structure to print

我在SmartJobBoard中使用TCPDF。PDF是在旧服务器上正确生成的。

在我们将网站移动到新服务器后,它在创建PDF发票时开始显示错误。TCPDF库显示以下错误。

Notice: Undefined index: cols in /home/pb_admin/public_html/pb/system/ext/tcpdf/tcpdf.php on line 22174
Notice: Undefined index: thead in /home/pb_admin/public_html/pb/system/ext/tcpdf/tcpdf.php on line 21705
Notice: Undefined index: rows in /home/pb_admin/public_html/pb/system/ext/tcpdf/tcpdf.php on line 22162
Warning: array_push() expects parameter 1 to be array, null given in /home/pb_admin/public_html/pb/system/ext/tcpdf/tcpdf.php on line 22164
Warning: array_push() expects parameter 1 to be array, null given in /home/pb_admin/public_html/pb/system/ext/tcpdf/tcpdf.php on line 22164
Warning: array_push() expects parameter 1 to be array, null given in /home/pb_admin/public_html/pb/system/ext/tcpdf/tcpdf.php on line 22164
Notice: Undefined index: thead in /home/pb_admin/public_html/pb/system/ext/tcpdf/tcpdf.php on line 21718
Exception Object
(
    [message:protected] => PDF generation failed: Some data has already been output, can't send PDF file
    [string:Exception:private] => 
    [code:protected] => 0
    [file:protected] => /home/pb_admin/public_html/pb/system/ext/tcpdf/tcpdf.php
    [line:protected] => 29841
    [trace:Exception:private] => Array
        (
            [0] => Array
                (
                    [file] => /home/pb_admin/public_html/pb/system/ext/tcpdf/tcpdf.php
                    [line] => 9062
                    [function] => Error
                    [class] => ExceptionThrowingTCPDF
                    [type] => ->
                    [args] => Array
                        (
                            [0] => Some data has already been output, can't send PDF file
                        )
                )
            [1] => Array
                (
                    [file] => /home/pb_admin/public_html/pb/system/lib/payment/Invoices/InvoiceManager.php
                    [line] => 141
                    [function] => Output
                    [class] => TCPDF
                    [type] => ->
                    [args] => Array
                        (
                            [0] => invoice_3284.pdf
                            [1] => D
                        )
                )
            [2] => Array
                (
                    [file] => /home/pb_admin/public_html/pb/system/user-scripts/payment/view_invoice.php
                    [line] => 55
                    [function] => generatePDFVersion
                    [class] => SJB_InvoiceManager
                    [type] => ::
                    [args] => Array
                        (
                            [0] => 


Rechnung
Datum: 01.10.2014
Rechnung #3284
Status der Rechnung: In Bearbeitung (Zahlung auf Rechnung (Abonnement wird freigeschalten, sobald Zahlungseingang erfolgt ist.))
Rechnungsempfänger


Zahlungsempfänger
Ocean Harvest GmbH
Ruessenstrasse 18
6340 Baar
Konto:
Bank: UBS AG, Zug
IBAN: CH81 0027 3273 1186 8701 T

Beschreibung    Betrag
PlacementBooster.ch
Firmen-Abonnement: 12 Monate
50 Mitarbeiter (51 Accounts)    CHF 13,808.00
Zwischensumme   CHF 13,808.00
MWST-Nr. CHE-108.643.082 MWST MWST Ref.-Nr. 417985  CHF 1,104.64
Insgesamt   CHF 14,912.64
                            [1] => 3284
                        )
                )
            [3] => Array
                (
                    [file] => /home/pb_admin/public_html/pb/system/core/ModuleManager.php
                    [line] => 127
                    [function] => execute
                    [class] => SJB_Payment_ViewInvoice
                    [type] => ->
                    [args] => Array
                        (
                        )
                )
            [4] => Array
                (
                    [file] => /home/pb_admin/public_html/pb/system/core/System.php
                    [line] => 140
                    [function] => executeFunction
                    [class] => SJB_ModuleManager
                    [type] => ->
                    [args] => Array
                        (
                            [0] => payment
                            [1] => view_invoice
                            [2] => 
                            [3] => /view-invoice/
                        )
                )
            [5] => Array
                (
                    [file] => /home/pb_admin/public_html/pb/system/core/PageConstructor.php
                    [line] => 29
                    [function] => executeFunction
                    [class] => SJB_System
                    [type] => ::
                    [args] => Array
                        (
                            [0] => payment
                            [1] => view_invoice
                            [2] => 
                            [3] => /view-invoice/
                        )
                )
            [6] => Array
                (
                    [file] => /home/pb_admin/public_html/pb/system/core/System.php
                    [line] => 193
                    [function] => getPage
                    [class] => SJB_PageConstructor
                    [type] => ::
                    [args] => Array
                        (
                            [0] => SJB_UserPageConfig Object
                                (
                                    [uri] => /view-invoice/
                                    [module] => payment
                                    [function] => view_invoice
                                    [template] => 
                                    [title] => View Invoice
                                    [parameters] => 
                                    [keywords] => 
                                    [page_exists] => 1
                                    [page_id] => 539
                                    [has_raw_output] => 
                                    [numberOfViews] => 
                                    [description] => 
                                )
                        )
                )
            [7] => Array
                (
                    [file] => /home/pb_admin/public_html/pb/system/core/Request.php
                    [line] => 209
                    [function] => getPage
                    [class] => SJB_System
                    [type] => ::
                    [args] => Array
                        (
                            [0] => SJB_UserPageConfig Object
                                (
                                    [uri] => /view-invoice/
                                    [module] => payment
                                    [function] => view_invoice
                                    [template] => 
                                    [title] => View Invoice
                                    [parameters] => 
                                    [keywords] => 
                                    [page_exists] => 1
                                    [page_id] => 539
                                    [has_raw_output] => 
                                    [numberOfViews] => 
                                    [description] => 
                                )
                        )
                )
            [8] => Array
                (
                    [file] => /home/pb_admin/public_html/pb/index.php
                    [line] => 72
                    [function] => execute
                    [class] => SJB_Request
                    [type] => ->
                    [args] => Array
                        (
                        )
                )
        )
    [previous:Exception:private] => 
)

为什么会发生这种错误?

尝试插入。。。

//Change To Avoid the PDF Error
  ob_end_clean();

如果这不起作用,请尝试使用ob_clean();相反

就在你做之前:

$pdf->Output($filename, $output_dest);

出现此错误是因为TCPDF在最终渲染完成之前抛出错误。为了防止TCPDF创建无法工作的PDF,它决定崩溃。

万一TCPDF不再喜欢你了,看看DomPDF:)

TCPDF需要100%有效的XHTML语法

即使是"HTML Tidy"也不会显示所有的HTML错误。在我的案例中,我有一个tr标签没有关闭,在我更正后,警告消失了,但pdf文件很难看。例如,通过将colspan=12更改为colspan=”12”,将rowspan=2更改为rowspan=”2”来解决该问题。

您必须通过ob_*函数捕获所有缓冲区,在ob_start函数之前没有回声、打印或标头:

<?php
ob_start();
[ ... ]
$content_pdf = ob_get_contents();
ob_end_flush();
?>

享受您的代码!

问题是您的PHP脚本在发送PDF之前正在打印到浏览器。为什么PHP在发送PDF之前要打印到浏览器?因为存在错误,并且PHP被配置为将错误打印到浏览器。

上面给出的两个解决方案是抑制错误的(糟糕的)解决方案。修复代码,错误就会消失,然后PDF就可以正常发送了。

为什么PHP会抛出错误?让我们看看:

Notice: Undefined index: cols in /home/pb_admin/public_html/pb/system/ext/tcpdf/tcpdf.php on line 22174
Notice: Undefined index: thead in /home/pb_admin/public_html/pb/system/ext/tcpdf/tcpdf.php on line 21705
Notice: Undefined index: rows in /home/pb_admin/public_html/pb/system/ext/tcpdf/tcpdf.php on line 22162
Warning: array_push() expects parameter 1 to be array, null given in /home/pb_admin/public_html/pb/system/ext/tcpdf/tcpdf.php on line 22164
Warning: array_push() expects parameter 1 to be array, null given in /home/pb_admin/public_html/pb/system/ext/tcpdf/tcpdf.php on line 22164
Warning: array_push() expects parameter 1 to be array, null given in /home/pb_admin/public_html/pb/system/ext/tcpdf/tcpdf.php on line 22164
Notice: Undefined index: thead in /home/pb_admin/public_html/pb/system/ext/tcpdf/tcpdf.php on line 21718

前三个错误是代码在检查数组元素是否已设置之前试图访问该元素的问题。由于问题在/tcpdf/tcpdf.php文件中,我认为您无法解决此问题。用TCPDF提交一个错误。

接下来的四个错误很可能是由于前三个错误造成的。修复前三个错误,接下来的四个错误也很可能得到解决。

如果你发布了一个错误报告,那么请在这个答案的评论中发布它的链接。谢谢

我认为您应该在操作中设置调试级别0。使用Configure::write('debug',0);

您应该检查所有开始标记是否都有匹配的结束标记!这是html中最不可疑的错误之一,可能也是您出现错误的原因:"标头已发送"

在我的例子中,tcpdf.php中出现错误是因为我在HTML中有一些错误——一个未关闭的td标记。像这样的HTML错误似乎会在tcpdf.php文件中引发很多错误,包括那些与实际错误没有任何逻辑链接的错误。

我的建议是通过删除发送到输出的整个"html"来隔离错误,只添加一个字母。如果你得到了空的pdf,开始检查你的html变量。

遇到了同样的问题。这个问题是由于错误的html,因此TCPDF抛出了错误。在修复了html问题后,TCPDF对我来说很好,要修复html问题,请单击此处。