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 shell(使用 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 中执行命令时,什么都没有创建,我返回到一个空的 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

我不知道那里有你的工具,所以用一公吨盐拿走这个。

如果您有 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 回答