如何通过 PHP 执行 WKHTMLTOPDF?
之前已经在某种程度上被问过,但没有解决方案或可接受的答案,我想尝试在我的问题中更全面,因此:
我正在尝试通过 PHP 在共享服务器上运行 WKHTMLTOPDF 并运行(在此如果是 MediaTemple (gs))。根据主机的说法,这没有理由不起作用,事实上它是通过 SSH 工作的。所以......
我尝试了各种各样的事情,最基本的没有任何作用,只是默默地失败:
exec("/path/to/binary/wkhtmltopdf http://www.google.com pdf1.pdf");
完整的 PHP 绑定以及以下内容给了我错误,尽管我最好的谷歌搜索我无法弄清楚:
呼叫:
$html = file_get_contents("http://www.google.com");
$pdf = new WKPDF();
$pdf->set_html($html);
$pdf->render();
$pdf->output(WKPDF::$PDF_EMBEDDED,'sample.pdf');
错误:
Fatal error: Uncaught exception 'Exception' with message 'WKPDF didn't return
any data. <pre>Loading pages (1/6) [> ] 0% [======> ] 10% terminate called
after throwing an instance of 'std::bad_alloc' what(): std::bad_alloc </pre>'
in /path/to/wkhtmltopdf.php:206 Stack trace: #0 /path/to/index.php(8):
WKPDF->render() #1 {main} thrown in /path/to/wkhtmltopdf.php on line 206
一旦我得到了这个(下面是摘录,因为我现在无法重现它):
Qt Concurrent has caught an exception thrown from a worker thread. This is not
supported, exceptions thrown in worker threads must be caught before
control returns to Qt Concurrent.
我还尝试了其他一些选项但结果相同;没有 PDF。那么我现在该怎么办,如何找出问题所在?我的PHP水平还处于初级阶段,但我会尽力而为。
This has been asked to some degree before but there are no solutions or accepted answers and I'd like to try and be more comprehensive in my question so:
I'm trying to WKHTMLTOPDF up and running via PHP on a shared server (in this case it's MediaTemple (gs)). According to the host there is no reason this won't work and in fact it is working via SSH. So...
I've tried a variety of things, the most basic does nothing, just silently fails:
exec("/path/to/binary/wkhtmltopdf http://www.google.com pdf1.pdf");
- Source: Question on Stack Overflow
The full PHP bindings along with the following give me errors, which despite my best Googling I can't figure out:
Call:
$html = file_get_contents("http://www.google.com");
$pdf = new WKPDF();
$pdf->set_html($html);
$pdf->render();
$pdf->output(WKPDF::$PDF_EMBEDDED,'sample.pdf');
- Source: WKHTMLTOPDF on Google Code
Error:
Fatal error: Uncaught exception 'Exception' with message 'WKPDF didn't return
any data. <pre>Loading pages (1/6) [> ] 0% [======> ] 10% terminate called
after throwing an instance of 'std::bad_alloc' what(): std::bad_alloc </pre>'
in /path/to/wkhtmltopdf.php:206 Stack trace: #0 /path/to/index.php(8):
WKPDF->render() #1 {main} thrown in /path/to/wkhtmltopdf.php on line 206
And once I got this (below is an extract as I can't reproduce it now):
Qt Concurrent has caught an exception thrown from a worker thread. This is not
supported, exceptions thrown in worker threads must be caught before
control returns to Qt Concurrent.
I've also tried a few other options but with the same results; no PDF. So what do I do now, how do I figure out what's wrong? My PHP level is on the basic side but I'll do my best.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
您也可以在这里尝试我的项目。它为命令行实用程序提供了一个干净的 OO 界面:
https://github.com/mikehaertl/phpwkhtmltopdf
用法非常简单:
You can also try my project here. It provides a clean OO interface to the command line utility:
https://github.com/mikehaertl/phpwkhtmltopdf
Usage is very simple:
看一下 snappy,一个 PHP5 库,允许从 url 或 html 页面生成缩略图、快照或 PDF 。它是 wkhtmltopdf/wkhtmltoimage 的包装。
Have a look at snappy, a PHP5 library allowing thumbnail, snapshot or PDF generation from a url or a html page. It's a wrapper for wkhtmltopdf/wkhtmltoimage.
对于 Linux:
对于 Windows:
For Linux:
For Windows:
您可能需要设置适当的标题并将其设置为 application/pdf 以及将其设置为内联,以便人们可以在浏览器中看到它(几乎每个最新的浏览器都支持此功能)并根据需要保存它。这是我正在使用的代码:
You may want to set up proper headers and set it to application/pdf as well as setting it to inline so that people can see it in their browsers (almost every recent browser supports this) and save it if they want. This is the code that I'm using:
要从 php(在 Linux 上)创建 pdf,您必须使用包装器。
To create a pdf from php (on linux) you must use a wrapper.
当你运行时会发生什么:
我的猜测是,由于你没有为该文件指定任何文件夹,它会尝试将其写入当前工作目录。网络用户可能没有该文件夹的写入权限(很可能就是这种情况)。因此,您应该能够通过提供网络用户可写入的文件夹的完整路径来解决此问题。
IE。
除此之外,我不太确定 wkhtmltopdf 是否可以无头工作,它可能需要一个正在运行的 X 服务器(在不运行 X 的服务器上,您可以通过安装 Xvfb 并使用 xvfb-run 运行 wkhtmltopdf)。
And what happens when you run :
My guess is that since you are not specifying any folder for the file, it will try to write it to the current working directory. It could be (well most probably this is the case) that the webuser doesn't have write permission on that folder. So you should by able to solve this by providing the full path to a folder that is writeable by the webuser.
ie.
Apart from that I'm not quite sure that wkhtmltopdf can work headless, it could be that it requires a running X server (on a server not running X you could solve this by installing Xvfb and using xvfb-run to run wkhtmltopdf).
这对我来说是一种预生成 PDF 报告的方法,然后使用唯一的会话 ID 从请求页面(同一会话的)获取它。
This worked for me as a way to pre-generate a PDF report then use a unique session ID to fetch it from the requesting page (of the same session).