0

これは私のコードです:

$url = escapeshellarg("http://www.mysite.com");
$command = shell_exec("xvfb-run -a -s '-screen 0 640x480x16' wkhtmltopdf --dpi 300  --page-size A4 $url /srv/www/mysite/public_html/tmp_pdf.pdf");
$str = file_get_contents("/srv/www/mysite/public_html/tmp_pdf.pdf");
header('Content-Type: application/pdf');
header('Content-Length: '.strlen($str));
header('Content-Disposition: inline; filename="pdf.pdf"');
header('Cache-Control: private, max-age=0, must-revalidate');
header('Pragma: public');
ini_set('zlib.output_compression','0');
die($str);

私のbashシェル(Debianを使用)では、コマンド

shell_exec("xvfb-run -a -s '-screen 0 640x480x16' wkhtmltopdf --dpi 300 --page-size A4 html://www.mysite.com /srv/www/mysite/public_html/tmp_pdf.pdf

動作し、目的の場所に pdf を生成しますが、php でコマンドを実行すると何も作成されず、null pdf ファイルに返されます (存在しないため)。誰かが何が間違っているのか理解するのを手伝ってくれますか?

4

2 に答える 2

1

問題は、Apache サーバーが、pdf を書き込もうとしたフォルダー (私の例では /srv/www/mysite/public_html/) への書き込みアクセス権を持っていないことでした。

そのため、フォルダの場所を /tmp (全員が書き込み権限を持つ場所) に変更しただけで、機能するようになりました。修正されたコードは次のとおりです。

$url = escapeshellarg("http://www.mysite.com");
$command = shell_exec("xvfb-run -a -s '-screen 0 640x480x16' wkhtmltopdf --dpi 300  --page-size A4 $url /tmp/tmp_pdf.pdf");
$str = file_get_contents("/tmp/tmp_pdf.pdf");
header('Content-Type: application/pdf');
header('Content-Length: '.strlen($str));
header('Content-Disposition: inline; filename="pdf.pdf"');
header('Cache-Control: private, max-age=0, must-revalidate');
header('Pragma: public');
ini_set('zlib.output_compression','0');
die($str);
于 2012-04-25T10:41:00.087 に答える
0

私はあなたのツールを知らないので、これを 1 トンの塩と一緒に取ってください。

URL があり、ツールがその URL 自体をダウンロードする場合は、ネットワーク アクセス許可がブロックされている可能性があります。自分で URL をダウンロードして、その可能性を排除するコンテンツ (または一時ファイルから) をこのツールに提供できる場合。

また、そこに書き込もうとしているフォルダーのアクセス許可も確認してください。

Debian と言うので、以下を実行します。

which xvfb-run

これにより、shell_exec の呼び出しで使用する実行可能ファイルへのフル パスが得られます。

ファイルのストリーミングについては、readfile を使用します。

$filePath = "/srv/www/mysite/public_html/tmp_pdf.pdf";

header('Content-Type: application/pdf');
header('Content-Length: ' . filesize($filePath));
header('Content-Disposition: inline; filename="pdf.pdf"');
header('Cache-Control: private, max-age=0, must-revalidate');
header('Pragma: public');
ini_set('zlib.output_compression','0');

readfile($filePath);
exit();

利点は、このためにファイル全体をメモリに読み込む必要がないことです。

于 2012-04-25T10:43:22.683 に答える