web-dev-qa-db-fra.com

Comment faire exécuter WKHTMLTOPDF via PHP?

Cela a été demandé dans une certaine mesure auparavant, mais il n'y a pas de solutions ou de réponses acceptées et je voudrais essayer d'être plus complet dans ma question afin:

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 que cela ne fonctionne pas et dans en fait cela fonctionne via SSH. Donc ...

J'ai essayé une variété de choses, la plus simple ne fait rien, échoue silencieusement:

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

- Source: Question sur le débordement de pile

Les liaisons complètes PHP ainsi que les suivantes me donnent des erreurs, que malgré ma meilleure recherche sur Google je ne peux pas comprendre:

Appel:

$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 que j'ai obtenu ceci (ci-dessous est 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 savoir ce qui ne va pas? Mon niveau PHP est du côté basique mais je ferai de mon mieux.

48
Jamie

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();
36
Michael Härtl

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

14
til

Vous voudrez peut-être configurer les en-têtes appropriés et le définir sur application/pdf ainsi que le configurer en ligne afin que les gens puissent le voir dans leurs navigateurs (presque tous les navigateurs récents le prennent en charge) 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;
?>
10
Brian F

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";
?>
8
soft genic

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);
4

Cela a fonctionné pour moi comme un moyen de pré-générer un rapport PDF puis utiliser un ID de session unique pour le récupérer à partir de la page de demande (de la même session).

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

Et que se passe-t-il lorsque vous exécutez:

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

Je suppose que puisque vous ne spécifiez aucun dossier pour le fichier, il essaiera de l'écrire dans le répertoire de travail actuel. Il se pourrait (et c'est probablement le cas) que l'utilisateur Web n'ait pas la permission d'écrire sur ce dossier. Vous devriez donc pouvoir résoudre ce problème en fournissant le chemin d'accès complet à un dossier accessible en écriture par l'internaute.

c'est à dire.

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

En dehors de cela, je ne suis pas sûr que wkhtmltopdf puisse fonctionner sans tête, il se pourrait qu'il nécessite un serveur X en cours d'exécution (sur un serveur qui n'exécute pas X, vous pouvez résoudre ce problème en installant Xvfb et en utilisant xvfb-run = pour exécuter wkhtmltopdf).

2
wimvds