如何通过PHP执行WKHTMLTOPDF?

好的,这个问题在一定程度上已经被问到了,但是没有解决scheme或者答案,所以我想在我的问题上试试更全面一些:

我试图WKHTMLTOPDF通过PHP共享服务器上运行(在这种情况下,它是MediaTemple(gs))。 根据主机,没有理由这将无法正常工作,实际上它通过SSH工作。 所以…

我试过了各种各样的东西,最基本的什么都不做,只是默默地失败:

exec("/path/to/binary/wkhtmltopdf http://www.google.com pdf1.pdf"); 

来源:堆栈溢出的问题

完整的PHP绑定以及以下给我的错误,尽pipe我最好的谷歌search我无法弄清楚:

呼叫:

 $html = file_get_contents("http://www.google.com"); $pdf = new WKPDF(); $pdf->set_html($html); $pdf->render(); $pdf->output(WKPDF::$PDF_EMBEDDED,'sample.pdf'); 

资料来源:Google Code上的WKHTMLTOPDF

错误:

 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. 

我也尝试了一些其他的select,但结果相同; 没有PDF。 那么现在我该怎么做,我怎么弄清楚什么是错的? 我的PHP级别在基本方面,但我会尽我所能。 提前谢谢了。

你也可以在这里尝试我的项目。 它为命令行实用程序提供了一个干净的OO界面:

https://github.com/mikehaertl/phpwkhtmltopdf

用法很简单:

 <?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(); 

看看活泼 ,一个PHP5库允许缩略图,快照或从一个网页或一个HTML页面的PDF生成。 这是wkhtmltopdf / wkhtmltoimage的包装。

您可能需要设置正确的头文件并将其设置为application / pdf,并将其设置为内联,以便人们可以在其浏览器中看到它(几乎每个最新的浏览器均支持此function),并在需要时进行保存。 这是我正在使用的代码:

 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 MYH:i:s').' GMT'); header('Content-Length: '.strlen($pdf)); header('Content-Disposition: inline; filename="'.basename($file).'";'); ob_clean(); flush(); echo $pdf; ?> 

对于Linux:

 exec('wkhtmltopdf http://somesite.com /home/user/file.pdf 2>&1'); 

对于Windows:

 <?php exec('C://abc//wkhtmltopdf http://google.html form1.pdf'); echo "PDF Created Successfully"; ?> 

而当你运行时会发生什么:

 $out = array(); exec("/path/to/binary/wkhtmltopdf http://www.google.com pdf1.pdf", $out); print_r($out); 

我的猜测是,因为你没有指定文件的任何文件夹,它会尝试写入到当前的工作目录。 这可能是(很可能是这种情况)web用户没有该文件夹的写入权限。 所以你应该能够通过提供一个可由webuser写入的文件夹的完整path来解决这个问题。

即。

 exec("/path/to/binary/wkhtmltopdf http://www.google.com /path/to/pdf1.pdf"); 

除此之外,我不太确定wkhtmltopdf是否可以无人工作,可能需要运行X服务器(在不运行X的服务器上,您可以通过安装Xvfb并使用xvfb-run来运行wkhtmltopdf来解决此问题)。

要创build一个从PHP(在Linux上)的PDF你必须使用包装。

 $cmd = '/usr/bin/xvfb-run --server-args="-screen 0, 1920x1080x24" /usr/bin/wkhtmltopdf http://google.com /tmp/google.pdf'; exec($cmd); 

这对我来说是一种预先生成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);