6

バックグラウンド

PHPを介してiReportを使用して作成されたPDFレポートをブラウザにストリーミングしようとしています。一般的な問題は、PHPを使用してブラウザにバイナリデータをどのように書き込むかです。

ワーキングコード

header('Cache-Control: no-cache private');
header('Content-Description: File Transfer');
header('Content-Disposition: attachment, filename=climate-report.pdf');
header('Content-Type: application/pdf');
header('Content-Transfer-Encoding: binary');

$path = realpath( "." ) . "/output.pdf";

$em = java('net.sf.jasperreports.engine.JasperExportManager');
$result = $em->exportReportToPdf($pm);
header('Content-Length: ' . strlen( $result ) );

$fh = fopen( $path, 'w' );
fwrite( $fh, $result );
fclose( $fh );

readfile( $path );

動作しないコード

header('Cache-Control: no-cache private');
header('Content-Description: File Transfer');
header('Content-Disposition: attachment, filename=climate-report.pdf');
header('Content-Type: application/pdf');
header('Content-Transfer-Encoding: binary');

$path = realpath( "." ) . "/output.pdf";

$em = java('net.sf.jasperreports.engine.JasperExportManager');
$result = $em->exportReportToPdf($pm);
header('Content-Length: ' . strlen( $result ) );

echo $result;

質問

PDFが破損しないように、ファイルへの書き込みの中間ステップを実行してブラウザに直接書き込むにはどうすればよいですか?

アップデート

PDFファイルサイズ:

  • 動作中:594778バイト
  • 非動作:1059365バイト

ありがとうございました!

4

2 に答える 2

2

以前、JavaはUTF-16を使用するため、Javaからの書き込みで問題が発生しました。http://zeronine.org/lab/index.phpの関数outputPDFはを使用します。したがって:java_set_file_encoding("ISO-8859-1");

  java_set_file_encoding("ISO-8859-1");

  $em = java('net.sf.jasperreports.engine.JasperExportManager');
  $result = $em->exportReportToPdf($pm);

  header('Content-Length: ' . strlen( $result ) );

  echo $result;
于 2010-05-08T15:40:03.270 に答える
0

出力を書き込むだけです。次のことを確認してください。

  • 正しいヘッダーが設定されています
  • バイナリの前後に誤って他の文字が印刷されたことはありません(これには空白が含まれます)。
于 2010-05-08T05:02:47.827 に答える