3

mPDF ライブラリを使用して、HTML 出力から直接 PDF ドキュメントを生成しています。問題は、この mPDF ライブラリがそのまま記述されており、何十もの通知 (未定義のインデックス、未定義のオフセットなど) が生成されていることです。それらの出力を停止するために何かを試みましたが、まだ何も役に立ちませんでした。

index.phpに挿入したものとerror_reporting(E_ALL ^ E_NOTICE);同様に、mpdf.phpを直接含むクラスとメソッド、およびmpdf.phpの先頭に配置しようとしました。error_reporting(E_ALL & ~E_NOTICE);私も組み合わせてみました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())、PDF は有効であるため、複雑な HTML を使用しても読み取り可能ですが、通知はブラウザに出力されます。とにかく、ファイルシステムに保存するのではなく、ダウンロード用に PDF を提供する必要があります。

OK、私は 1 つの解決策を見つけましたが、それはベスト プラクティスではありません (ただし、機能します): mPDF の代わりに出力する $pdf 文字列をキャッチアウトしながらob_start();、コードを囲みます。ob_end_clean();

最終的なコード:

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;
4

3 に答える 3

0

答えはなく、他に適切な解決策が見つからなかったため、これまでのところの要約を以下に示します(主に上記の質問からコピー)。

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コードを含む)を「修復」することをまだ忘れていません。したがって、これは(今のところ)私のために働く唯一の解決策。

多分それは誰かを助けるでしょう。

于 2012-02-07T14:47:46.380 に答える
0

$mpdf->Output()afterを使えばob_end_clean()ブラウザでPDFも予告なく表示できます!私はこれをOpenCartで使用しています。ob_start()ただし、 andを使用する必要がありますob_end_clean()

于 2014-08-04T01:19:48.587 に答える
0

各ページの新しい表見出しを書き出そうとしたときにエラーが発生したようです。V5.4 26210行目でコメントアウトしました

#$this->TableHeaderFooter($tablefooter,$tablestartpage,$tablestartcolumn,'F',$level, $firstSpread, $finalSpread);   // mPDF 5.3.36

見出しが描画されないため、この行をコメントアウトしても、通知が消える以外に効果はありませんでした。

于 2013-02-11T02:22:56.387 に答える