这是我的代码:
$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 shell中(使用Debian)命令
shell_exec(“xvfb-run -a -s'-screen 0 640x480x16'wkhtmltopdf --dpi 300 - 页面大小A4 html://www.mysite.com /srv/www/mysite/public_html/tmp_pdf.pdf
工作,它在所需的位置生成一个pdf,但当我在php中执行命令时,没有任何东西被创建,我将返回到一个空的pdf文件(因为它不存在)。 有人能帮我弄清楚出了什么问题吗?
答案 0 :(得分: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);
答案 1 :(得分:0)
我不知道你的工具在那里,所以用一公吨的盐就可以了。
如果您有网址并且该工具会自行下载网址,则可能会阻止某些网络权限。如果你可以自己下载网址,只需给这个工具提供可能消除这种可能性的内容(或来自临时文件)。
同时检查您尝试写入的文件夹的权限。
既然你说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();
优点是整个文件不需要为此读入内存。