php - remove - wkhtmltopdf latest version
¿Cómo puedo hacer que WKHTMLTOPDF se ejecute a través de PHP? (7)
Eche un vistazo a snappy , una biblioteca PHP5 que permite la generación de miniaturas, instantáneas o PDF desde una url o una página html. Es un contenedor para wkhtmltopdf / wkhtmltoimage.
Esto se ha pedido hasta cierto punto antes, pero no hay soluciones o respuestas aceptadas y me gustaría intentar ser más exhaustivo en mi pregunta, así que:
Estoy intentando que WKHTMLTOPDF esté funcionando a través de PHP en un servidor compartido (en este caso es MediaTemple (gs)). Según el host, no hay razón para que esto no funcione y, de hecho, funciona a través de SSH. Asi que...
He probado una variedad de cosas, la más básica no hace nada, solo falla silenciosamente:
exec("/path/to/binary/wkhtmltopdf http://www.google.com pdf1.pdf");
- Fuente: Pregunta sobre desbordamiento de pila
Los enlaces PHP completos junto con los siguientes me dan errores, que a pesar de mi mejor Google no puedo entender:
Llamada:
$html = file_get_contents("http://www.google.com");
$pdf = new WKPDF();
$pdf->set_html($html);
$pdf->render();
$pdf->output(WKPDF::$PDF_EMBEDDED,''sample.pdf'');
- Fuente: WKHTMLTOPDF en 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
Y una vez que obtuve esto (a continuación hay un extracto que no puedo reproducir ahora):
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.
También he probado algunas otras opciones pero con los mismos resultados; no PDF. Entonces, ¿qué hago ahora, cómo entiendo qué está mal? Mi nivel de PHP está en el lado básico pero lo haré lo mejor que pueda.
Es posible que desee configurar los encabezados adecuados y configurarlo en application / pdf, así como configurarlo en línea para que las personas puedan verlo en sus navegadores (casi todos los navegadores recientes lo admiten) y guardarlo si lo desean. Este es el código que estoy usando:
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;
?>
Esto me funcionó como una forma de generar un informe PDF y luego usar un ID de sesión único para obtenerlo de la página de solicitud (de la misma sesión)
$cmd = "/usr/local/bin/wkhtmltopdf ''http://127.0.0.1/myApp/pdfReport.php?key=something'' tmp_reports/report_".$_POST[''sessionid''].".pdf";
exec($cmd);
Para crear un pdf desde php (en linux) debe usar un contenedor.
$cmd = ''/usr/bin/xvfb-run --server-args="-screen 0, 1920x1080x24" /usr/bin/wkhtmltopdf http://google.com /tmp/google.pdf'';
exec($cmd);
También puedes probar mi proyecto aquí. Proporciona una interfaz OO limpia a la utilidad de línea de comandos:
https://github.com/mikehaertl/phpwkhtmltopdf
El uso es muy 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();
Y que pasa cuando corres:
$out = array();
exec("/path/to/binary/wkhtmltopdf http://www.google.com pdf1.pdf", $out);
print_r($out);
Supongo que, dado que no está especificando ninguna carpeta para el archivo, intentará escribirlo en el directorio de trabajo actual. Podría ser (probablemente este sea el caso) que el usuario web no tenga permiso de escritura en esa carpeta. Por lo tanto, debe poder resolver esto proporcionando la ruta completa a una carpeta que el usuario web pueda escribir.
es decir.
exec("/path/to/binary/wkhtmltopdf http://www.google.com /path/to/pdf1.pdf");
Aparte de eso, no estoy muy seguro de que wkhtmltopdf pueda funcionar sin cabeza, podría ser que requiera un servidor X en ejecución (en un servidor que no ejecute X se podría resolver esto instalando Xvfb y usando xvfb-run para ejecutar wkhtmltopdf).
Para Linux:
exec(''wkhtmltopdf http://somesite.com /home/user/file.pdf 2>&1'');
Para ventanas:
<?php
exec(''C://abc//wkhtmltopdf http://google.html form1.pdf'');
echo "PDF Created Successfully";
?>