如何让 WKHTMLTOPDF 通过 PHP 执行?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/5663814/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How do I get WKHTMLTOPDF to execute via PHP?
提问by Jamie
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...
我正在尝试通过 PHP 在共享服务器上启动并运行 WKHTMLTOPDF(在本例中为 MediaTemple (gs))。根据主持人的说法,没有理由这不起作用,实际上它是通过 SSH 工作的。所以...
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:
完整的 PHP 绑定以及以下内容给了我错误,尽管我用了最好的谷歌搜索,但我无法弄清楚:
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
-来源: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.
我还尝试了其他一些选项,但结果相同;没有PDF。那么我现在该怎么办,我如何找出问题所在?我的 PHP 水平在基本方面,但我会尽力而为。
回答by Michael H?rtl
You can also try my project here. It provides a clean OO interface to the command line utility:
你也可以在这里尝试我的项目。它为命令行实用程序提供了一个干净的 OO 界面:
https://github.com/mikehaertl/phpwkhtmltopdf
https://github.com/mikehaertl/phpwkhtmltopdf
Usage is very simple:
用法很简单:
<?php
use mikehaertl\wkhtmlto\Pdf;
$pdf = new Pdf;
// Add a HTML file, a HTML string or a page from a URL
$pdf->addPage('/home/joe/page.html');
$pdf->addPage('<html>....</html>');
$pdf->addPage('http://google.com');
// Add a cover (same sources as above are possible)
$pdf->addCover('mycover.html');
// Add a Table of contents
$pdf->addToc();
// Save the PDF
$pdf->saveAs('/tmp/new.pdf');
// ... or send to client for inline display
$pdf->send();
回答by til
回答by Brian F
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:
您可能希望设置适当的标题并将其设置为 application/pdf 以及将其设置为内联,以便人们可以在他们的浏览器中看到它(几乎所有最近的浏览器都支持此功能)并根据需要保存它。这是我正在使用的代码:
exec("/usr/local/bin/wkhtmltopdf ../uploads/test.pdf");
$file = "../uploads/test.pdf";
$pdf = file_get_contents("../uploads/test.pdf");
header('Content-Type: application/pdf');
header('Cache-Control: public, must-revalidate, max-age=0'); // HTTP/1.1
header('Pragma: public');
header('Expires: Sat, 26 Jul 1997 05:00:00 GMT'); // Date in the past
header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
header('Content-Length: '.strlen($pdf));
header('Content-Disposition: inline; filename="'.basename($file).'";');
ob_clean();
flush();
echo $pdf;
?>
回答by soft genic
For Linux:
对于 Linux:
exec('wkhtmltopdf http://somesite.com /home/user/file.pdf 2>&1');
For Windows:
对于 Windows:
<?php
exec('C://abc//wkhtmltopdf http://google.html form1.pdf');
echo "PDF Created Successfully";
?>
回答by CupcakePrincess1932
To create a pdf from php (on linux) you must use a wrapper.
要从 php(在 linux 上)创建 pdf,您必须使用包装器。
$cmd = '/usr/bin/xvfb-run --server-args="-screen 0, 1920x1080x24" /usr/bin/wkhtmltopdf http://google.com /tmp/google.pdf';
exec($cmd);
回答by Jason
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).
这对我来说是一种预先生成 PDF 报告然后使用唯一的会话 ID 从请求页面(同一会话)中获取它的方法。
$cmd = "/usr/local/bin/wkhtmltopdf 'http://127.0.0.1/myApp/pdfReport.php?key=something' tmp_reports/report_".$_POST['sessionid'].".pdf";
exec($cmd);
回答by wimvds
And what happens when you run :
运行时会发生什么:
$out = array();
exec("/path/to/binary/wkhtmltopdf http://www.google.com pdf1.pdf", $out);
print_r($out);
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.
IE。
exec("/path/to/binary/wkhtmltopdf http://www.google.com /path/to/pdf1.pdf");
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-runto run wkhtmltopdf).
除此之外,我不太确定 wkhtmltopdf 是否可以无头工作,可能是它需要一个正在运行的 X 服务器(在不运行 X 的服务器上,您可以通过安装 Xvfb 并使用xvfb-run运行 wkhtmltopdf来解决这个问题)。