Как получить WKHTMLTOPDF для выполнения через PHP?

Это было задано до некоторой степени, но нет решений или принятых ответов, и я хотел бы попытаться быть более всеобъемлющим в моем вопросе, так что:

Я пытаюсь запустить WKHTMLTOPDF через PHP на общем сервере (в этом случае это MediaTemple (gs)). По словам хозяина, нет причин, по которым это не сработает, и на самом деле он работает через SSH. Так…

Я пробовал разные вещи, самый простой ничего не делает, просто молчал:

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

Источник: вопрос о переполнении стека

Полные привязки PHP вместе со следующими дают мне ошибки, которые, несмотря на мой лучший Googling, я не могу понять:

Вызов:

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

Источник: WKHTMLTOPDF в Google Code

Ошибка:

 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 находится на основной стороне, но я сделаю все возможное.

Вы также можете попробовать мой проект здесь. Он обеспечивает чистый интерфейс 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(); 

Посмотрите на snappy , библиотеку PHP5, позволяющую создавать эскизы, моментальные снимки или генерации PDF с URL-адреса или страницы html. Это оболочка для wkhtmltopdf / wkhtmltoimage.

Возможно, вы захотите настроить правильные заголовки и установить его в приложении / 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 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); 

Я предполагаю, что, поскольку вы не указали какую-либо папку для файла, она попытается записать ее в текущий рабочий каталог. Это может быть (ну, скорее всего, это так), что веб-пользователь не имеет права на запись в этой папке. Поэтому вы должны решить эту проблему, предоставив полный путь к папке, которая может быть записана веб-пользователем.

то есть.

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

Кроме того, я не совсем уверен, что wkhtmltopdf может работать без головы, возможно, для него нужен X-сервер (на сервере, который не запускает X, вы можете решить это, установив Xvfb и используя xvfb-run для запуска wkhtmltopdf).

Чтобы создать pdf-файл из php (на linux), вы должны использовать обертку.

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

Это работало для меня как способ предварительной генерации отчета в формате PDF, а затем использовать уникальный идентификатор сеанса для его получения с запрашивающей страницы (той же сессии).

 $cmd = "/usr/local/bin/wkhtmltopdf 'http://127.0.0.1/myApp/pdfReport.php?key=something' tmp_reports/report_".$_POST['sessionid'].".pdf"; exec($cmd);