54 votes

Comment faire pour que WKHTMLTOPDF s'exécute via PHP ?

Ok, cette question a déjà été posée dans une certaine mesure mais il n'y a pas de solutions ou de réponses acceptées et j'aimerais essayer d'être plus complet dans ma question :

J'essaie de faire fonctionner WKHTMLTOPDF via PHP sur un serveur partagé (dans ce cas, c'est MediaTemple (gs)). Selon l'hôte, il n'y a aucune raison pour que cela ne fonctionne pas et en fait, cela fonctionne via SSH. Alors...

J'ai essayé plusieurs choses, la plus basique ne fait rien, elle échoue en silence :

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

- Source : Question sur Stack Overflow

Les liaisons PHP complètes ainsi que les éléments suivants me donnent des erreurs, que je n'arrive pas à comprendre malgré mes efforts sur Google :

Appelez :

$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 sur Google Code

Erreur :

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

Et une fois, j'ai obtenu ceci (ci-dessous un extrait car je ne peux pas le reproduire maintenant) :

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.

J'ai également essayé quelques autres options, mais avec les mêmes résultats : pas de PDF. Alors que dois-je faire maintenant, comment puis-je trouver ce qui ne va pas ? Mon niveau de PHP est plutôt basique mais je vais faire de mon mieux. Merci d'avance.

42voto

Michael Härtl Points 4576

Vous pouvez également essayer mon projet ici. Il fournit une interface OO propre à l'utilitaire de ligne de commande :

https://github.com/mikehaertl/phpwkhtmltopdf

L'utilisation est très 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();

16voto

til Points 81

Jetez un coup d'œil à snappy PHP5, une bibliothèque permettant la génération de vignettes, d'instantanés ou de PDF à partir d'une url ou d'une page html. C'est un wrapper pour wkhtmltopdf/wkhtmltoimage.

10voto

Brian F Points 36

Il est possible que vous souhaitiez mettre en place des en-têtes appropriés et définir le format application/pdf, ainsi que le mettre en ligne afin que les gens puissent le voir dans leur navigateur (presque tous les navigateurs récents le supportent) et l'enregistrer s'ils le souhaitent. Voici le code que j'utilise :

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

10voto

soft genic Points 493

Pour Linux :

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

Pour Windows :

<?php
exec('C://abc//wkhtmltopdf http://google.html form1.pdf');

echo "PDF Created Successfully";
?>

5voto

Lttldude9 Points 21

Pour créer un pdf à partir de php (sous linux), vous devez utiliser un wrapper.

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

exec($cmd);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X