5

HTMLフォームの入力とアップロードされたファイルに基づいて、smartyテンプレートを使用してphpページを生成しています。dompdf を使用して、生成されたページを pdf ファイルとして保存したいと考えています。

ユーザーが multipart/form-data を送信すると、データが自分自身にポストされます。その後、検証プロセスが実行されます。問題がなければ、テンプレート ファイルを使用して新しいページが生成されます。出力はありません。代わりに、dompdf はテンプレート ファイルを使用して pdf ファイルをストリーミングします。「DOMPDFが見つかりません」、メモリ不足などの問題のいくつかの段階を解決した後、「PDFをストリーミングできません:ヘッダーは既に送信されました」というエラーが発生しました。

最も一般的な問題の 1 つは、stream() が呼び出される前に改行、空白、または出力が存在することです。<?php と >? の前後の空白をチェックしました。

print_f または echo ステートメントもありません。この問題のトラブルシューティング方法を教えてください。smarty テンプレート ファイルまたは php ファイル自体のどこに問題があるのでしょうか。コードは次のとおりです。

require_once("dompdf/dompdf_config.inc.php");
spl_autoload_register('DOMPDF_autoload');
$html = $smarty->fetch('index.tpl');
$dompdf = new DOMPDF();
$dompdf->load_html($html);
$dompdf->set_paper('a4', 'portrait');
$dompdf->render();
$dompdf->stream("newfile.pdf");
4

10 に答える 10

18

簡単な解決策:

ストリームの前に行の下に書き込むと、正確に新しい行またはスペースが来る場所が表示されます

$f;
$l;
if(headers_sent($f,$l))
{
    echo $f,'<br/>',$l,'<br/>';
    die('now detect line');
}
于 2015-07-06T13:12:56.030 に答える
3

ほとんどの場合、これを引き起こしているコードのどこかに空白または改行があります。これをデバッグする簡単な方法は次のとおりです。

  1. たとえば、スクリプトの最後 (stream() 呼び出しの上) で何かをエコーし​​ます。echo "end!";exit;
  2. クリックしてページの「ソースを表示」すると、スペースが見やすくなります
  3. あなたの「終わり!」なら。文字列がスクリプトの最初に表示されない場合、どこかに文字が出力されます
  4. 「エコーエンド!」を動かします。スペースが挿入された場所が見つかるまで、コードまでさらに行を進めます

別の可能性は、印刷できない文字を導入する言語文字列をどこかで使用していることです。アプリケーションが多言語の場合は、英語を使用してテストしていることを確認してください

于 2013-10-23T08:58:10.323 に答える
1

このファイルの行 3105 を置き換えます。dompdf/lib/class.pdf.php

if ( headers_sent()) {
  die("Unable to stream pdf: headers already sent");
}

$output = ob_get_clean();
if ( headers_sent()) {
    echo $output; }

次に、PDF出力を生成しているファイルで、たとえばJoomlaコンポーネントから出力していた場合、 components/com_joomlacomponent/views/yourpdfdir/tmpl/default.php 開始phpタグの直後に入力します

<?php
ob_start();
于 2014-10-08T09:27:50.723 に答える
0

エコーアウトしようとしましたが、空白や改行は見つかりませんでした。最後に、php_SELF の代わりに別のページに php をリダイレクトすると、問題はなくなりました。コードを変更しませんでした。PHPが終了した後のhtmlタグの存在が問題の要因だったようです。

于 2013-10-23T11:28:12.473 に答える
0

この問題に遭遇しました。使用しているすべての変数を確認したい。あなたが渡している 1 つまたは複数の変数が空になり、レンダリングを台無しにしています。

徐々に開始し、すべてを取り除きphp、pdf の生成を試みます。それが機能する場合は、ブロックごとにコードを追加します。

これは、問題がどこにあるかを特定するのに役立ちます。

于 2015-02-03T14:54:51.253 に答える
0

ソースを表示するときに明らかな出力がなく、この問題がありました。私にとっての問題は、ヘッダー以外に何もなかったにもかかわらず、出力をフラッシュしたことであり、出力のストリーミングがブロックされ、「ヘッダーは既に送信されました」というメッセージが表示されました。それは本当でした。私の修正は、flush() および ob_flush() ステートメントを削除することでした。その後、ストリーミング出力が機能しました。

于 2016-08-06T20:11:38.587 に答える
-1

私の場合、問題は dompdf_config_inc.php で $_dompdf_show_warnings を false に設定することで解決されました

于 2015-03-20T12:19:00.187 に答える