Bonjour à tous,

J'ai réussi aujourd'hui à intégrer WKHTMLTOPDF via composer dans PhpStorm.

Tout à l'air de fonctionner correctement, mais je n'ai aucun pdf qui m'est envoyé ou enregistré.

L'appel du script "vendor/autoloader.php" est fait.

Voici le code pour générer mon PDF :
Où se trouve le problème ?

<?php

namespace App\Controller;

use mikehaertl\wkhtmlto\Pdf;

class PrintsController extends AppController {

    public function __construct(){
        parent::__construct();
    }

    public function facture(){
        $printing = '<h1>TEST</h1>';
        //OU : avec ob_start et ob_get_clean : récupération d'un fichier
        var_dump($printing);
        $pdf = new Pdf($printing);
        $pdf->send();
        //ou : $pdf->saveAs('test.pdf');
    }
}

Merci pour vos lumières...

39 réponses


Bonjour jojo1084,

Pas de messages d'erreur du tout ?
Tu as bien l'affichage de erreurs php d'activée ?
Si tu mets un die('methode facture ok')est-ce que ça t'affiche bien methode facture ok ?
Avant de faire le send(), si tu fais un var_dump($pdf); die(); ça donne quoi ?

jojo1084
Auteur

Bonjour Connected,

Le die fonctionne tout as fait normalement, l'affichage des erreurs actif.

Voici le code :

<?php
namespace App\Controller;
use mikehaertl\wkhtmlto\Pdf;
class PrintsController extends AppController {
    public function __construct(){
        parent::__construct();
    }
    public function facture(){

        $printing = '<h1>FACTURE</h1>';
        //die($printing); ==> affichage OK
        $pdf = new Pdf($printing);
        var_dump($pdf);
        $pdf->send();
        var_dump($pdf);
    }
}

Et le résultat donné par le navigateur avec le var_dump (j'en fait 1 après la nouvelle instance de la classe Pdf puis un autre après l'envoi du Pdf (->send()) :

object(mikehaertl\wkhtmlto\Pdf)[9]
  public 'binary' => string 'wkhtmltopdf' (length=11)
  public 'commandOptions' => 
    array (size=0)
      empty
  public 'tmpDir' => null
  public 'ignoreWarnings' => boolean false
  public 'version9' => boolean false
  protected '_isCreated' => boolean false
  protected '_options' => 
    array (size=0)
      empty
  protected '_objects' => 
    array (size=1)
      0 => 
        array (size=1)
          'inputArg' => string '<h1>FACTURE</h1>' (length=16)
  protected '_tmpPdfFile' => null
  protected '_tmpFiles' => 
    array (size=0)
      empty
  protected '_command' => null
  protected '_error' => string '' (length=0)

object(mikehaertl\wkhtmlto\Pdf)[9]
  public 'binary' => string 'wkhtmltopdf' (length=11)
  public 'commandOptions' => 
    array (size=0)
      empty
  public 'tmpDir' => null
  public 'ignoreWarnings' => boolean false
  public 'version9' => boolean false
  protected '_isCreated' => boolean false
  protected '_options' => 
    array (size=0)
      empty
  protected '_objects' => 
    array (size=1)
      0 => 
        array (size=1)
          'inputArg' => string '<h1>FACTURE</h1>' (length=16)
  protected '_tmpPdfFile' => 
    object(mikehaertl\tmp\File)[13]
      protected '_fileName' => string 'C:\Windows\Temp\tmp693D.tmp.pdf' (length=31)
  protected '_tmpFiles' => 
    array (size=0)
      empty
  protected '_command' => 
    object(mikehaertl\wkhtmlto\Command)[12]
      public 'enableXvfb' => boolean false
      public 'xvfbRunBinary' => string 'xvfb-run' (length=8)
      public 'xvfbRunOptions' => string '--server-args="-screen 0, 1024x768x24"' (length=38)
      public 'escapeArgs' => boolean true
      public 'escapeCommand' => boolean false
      public 'useExec' => boolean false
      public 'captureStdErr' => boolean true
      public 'procCwd' => null
      public 'procEnv' => null
      public 'procOptions' => null
      public 'locale' => null
      protected '_command' => string 'wkhtmltopdf' (length=11)
      protected '_args' => 
        array (size=2)
          0 => string '"<h1>FACTURE</h1>"' (length=18)
          1 => string '"C:\Windows\Temp\tmp693D.tmp.pdf"' (length=33)
      protected '_execCommand' => string 'wkhtmltopdf "<h1>FACTURE</h1>" "C:\Windows\Temp\tmp693D.tmp.pdf"' (length=64)
      protected '_stdOut' => string '' (length=0)
      protected '_stdErr' => string '' (length=0)
      protected '_exitCode' => int 1
      protected '_error' => string 'Failed without error message: wkhtmltopdf "<h1>FACTURE</h1>" "C:\Windows\Temp\tmp693D.tmp.pdf"' (length=94)
      protected '_executed' => boolean false
  protected '_error' => string 'Failed without error message: wkhtmltopdf "<h1>FACTURE</h1>" "C:\Windows\Temp\tmp693D.tmp.pdf"' (length=94)

Serait-ce un problème de fichi!er temporaire à la vue des dernières lignes ?

Merci beaucoup !

Effectivement c'est possible, et si tu lances en ligne de commandes directement est-ce que ça fonctionne ?

Du style depuis ton terminal si tu fais : wkhtmltopdf http://www.google.com google.pdf ça donne quoi ?

jojo1084
Auteur

Désolé, je débute avec PhpStorm et tout ça... composer, ... m'est très peu connu depuis quelques jours.
Comment fait-on ?

@jojo, tu travailles sur Windows je suppose, voici un petit tuto

jojo1084
Auteur

En effet je suis sur windows... L'utilisation de l'invite de commande ça je connais. Je viens d'installer Composer pour Windows.
Rien n'y fait pour l'utilisation de la commande proposée par Connected... Désolé...
Voici le retour du CLI exécuté dans le dossier où se trouvent les 3 fichiers de wkhtmltopdf :

C:\Users\Johan\Dropbox\WEBSITE\AcaNet POO\vendor\mikehaertl\phpwkhtmltopdf\src>wkhtmltopdf http://www.google.com google.pdf

'wkhtmltopdf' n’est pas reconnu en tant que commande interne
ou externe, un programme exécutable ou un fichier de commandes.

C:\Users\Johan\Dropbox\WEBSITE\AcaNet POO\vendor\mikehaertl\phpwkhtmltopdf\src>

jojo1084
Auteur

Si ça peut servir, voici mon environnement de travail :

  • Windows 10
  • PhpStorm 8.0.3
  • WampServer avec PHP 5.5.12

Si ça peut vous aider pour trouver une solution... Je vous en remercie d'avance...

Il est possible que wkhtmltopdf ne soit pas dans le PATH. Par curiosité, on ne sait jamais lol, est-ce que tu as bien installé la librairie sur windows ? Je ne parle pas de celle installée via composer, mais celle sur le système. Car la librairie de mikehaertl ne fonctionne que si wkhtmltopdf est installé sur le système.

jojo1084
Auteur

Bonjour Connected,
D'abord, merci pour ton suivi de mes questions !!!
Je ne l'avais pas fait en effet...
Je viens de le faire et Oh Miracle! via l'invite de commande, cela fonctionne !
Mais pas via le code PHP...
J'ai toujours le même dump que celui noté ici en haut....

Que donne le code suivant ?

public function facture(){  

  $pdf = new Pdf('<h1>FACTURE</h1>');
  $pdf->setOptions(array(
    'commandOptions' => array(        
      'procOptions' => array(          
        'bypass_shell' => true,          
        'suppress_errors' => true,
      ),
    ),
  ));  

  if (!$pdf->send()) {
    throw new Exception('Erreur génération pdf : '. $pdf->getError());
  }

}
jojo1084
Auteur

Hello Conected,

Toujours pas de PDF en sortie....
Le code utilisé est exactement le même que celui que tu me proposes ci-dessus.
Voici l'erreur qui est affichée :

Au besoin et pour faciliter l'échange, tu peux utiliser TeamViewer et prendre le contrôle de mon pc pour que tu puisses voir en direct ce qui ne va pas...

Salut,

désolé ça ne va pas être possible teamviewer. On va trouver ne t'inquiète pas il faudra juste un peu plus de temps :)
Alors, ok

On va essayer de supprimer toutes les options :

public function facture(){  

  $pdf = new Pdf('<h1>FACTURE</h1>');

  if (!$pdf->send()) {
    throw new Exception('Erreur génération pdf : '. $pdf->getError());
  }

}

ça donne quoi ?

Si ça ne fonctionne pas est-ce qu'avec d'autres options ça fonctionne mieux :

public function facture(){  

  $pdf = new Pdf('<h1>FACTURE</h1>');
  $pdf->setOptions(array(
    'commandOptions' => array(
        'useExec' => true,
    ),
));  

  if (!$pdf->send()) {
    throw new Exception('Erreur génération pdf : '. $pdf->getError());
  }

}

Dans l'attente de tes retours :)

jojo1084
Auteur

Merci !
Hélas, aucun des 2 codes ne fonctionnent... Erreurs identiques...

Un petit récapitualtif de ce que j'ai, histoire d'être sûr :

  • Dans PhpStorm, j'ai importer la dépendence wkhtmltopdf de mikehaertl ; fait un require de 'vendor/autoload.php'
  • Sur Windows, j'ai installé la librairie wkhtmltopdf (la ligne de commande fonctionne) ainsi que le PATH dans les variables système

Vu les messages d'erreurs qu'on obtient, est-ce qu'il y aurait un problème de communication entre la classe PHP et la commande qu'elle envoie ?

Oui le soucis viendrait de là, du coup on va partir de la base :)
Dans un fichier php vierge, si tu fais :

echo exec('wkhtmltopdf http://www.google.com google.pdf');

En veillant à supprimer le fichier google.pdf s'il existe déjà dans le répertoire d'exécution (suite aux tests précedent), avant d'ouvrir la page.

jojo1084
Auteur

Alors, aucun fichier pdf généré... Aucune erreur affichée...
Si je fais un var_dump de la ligne de code ci-dessous, voici ce que j'obtiens :

string '' (length=0)

Essaye de faire ça pour voir :

exec('wkhtmltopdf --version', $exec);
echo '<pre>'.print_r($exec,true).'</pre>';

echo '<hr>';

exec('wkhtmltopdf http://www.google.com google.pdf', $exec); 
echo '<pre>'.print_r($exec,true).'</pre>';

Regarde dans c:\windows\temp si tu vois des traces
il doit y avoir la page html générée avec FACTURE, il y a aussi un pdf vide si la génération n'a pas pu se faire.

affiche aussi les erreurs

echo $pdf->getError();
jojo1084
Auteur

Merci pour ce commentaire supplémentaire qui hélas me renvoie toujours le même problème.
Pour résumé :

  • pas de pdf dans les fichiers temporaires
  • pas de fichiers HTML non plus...

Avec le code de Bowser65 voici le résultat affiché :

Array
(
)
Array
(
)

Essaye de réinstaller wkhtmltopdf et de redémarrer ton serveur. Puis essaye de réexécuter mon code.

jojo1084
Auteur

Je l'avais déjà fait et refais un fois encore maintenant, aucun changement. Malheureusement...................

Utilises tu des VM ?

jojo1084
Auteur

VM = Virtual Machine ?
Si oui, alors la réponse est non...
Je fonctionne sous Win10 avec WampServer. Ultérieurement, le site développé sera transféré sur mon serveur one.com

si tu prend l'un des exec de mon code et que tu les remplace par totalement autre chose, est ce que ça te fais un retour ?

Édit : Remplacer tout je parle de la commande et par autre chose je veux dire met n'importe quelle commande qui fait un retour et qui n'a aucun rapport avec WKHTMLtoPDF

jojo1084
Auteur

Ah, là j'ai un résultat...
Voici ce que j'ai tapé :

exec('shutdown -s -t 3600', $exec);
echo '<pre>'.print_r($exec,true).'</pre>';

La commande d'arrêt programmé se met bien en route...

Ok donc c'est PHP qui n'arrive pas à communiquer avec WKHTMLtoPDF côté système.

Est ce que WKHTMLtoPDF est bien renseigné dans ton PATH ?

jojo1084
Auteur

Oui, voici ce que j'y ai mis :
PATH = C:\Program Files\wkhtmltopdf\bin\
Dans le dossier PATH il y a :

  • wkhtmltoimage.exe
  • wkhtmltopdf.exe
  • wkhtmltox.dll

Lorsque jexécute la commande wkhtmltopdf http://www.google.be google.pdf de puis l'invite de commande, j'ai bien un pdf qui est créé.

Donc c'est php qui fait des siennes :(

Essaye d'éteindre l'intégralité de ton serveur qques minutes puis de tout démarrer (Que php se reset totalement et que ses tmp files soient effacés)

Puis réessaye d'exécuter mon bout de code

jojo1084
Auteur

Même résultat !!! A savoir : rien !!!
J'ai donc nettoyé les fichiers temporaires internet et windows.
ainsi que redémarré windows...

Ca en devient désespérant... :(

jojo1084
Auteur

Pareil... rien de nouveau...
Si je fais une autre commande avec shell_exec() cela fonctionne... mais pas pour wkhtmltopdf

jojo1084
Auteur

J'ai peut-être une information supplémentaire qui pourrait nous aider dans nos recherche.
J'ai bloqué la suppression du fichier temporaire pour voir que qu'il met dedans...
Et bien : il n'y a rien !!!!

  • Fichier illisible par Acrobat Reader,
  • Taille : 0 Ko
    !!!!!

En gros c'est PHP qui n'arrive pas à exécuter la commande wkhtmltopdf

Essaye d'exécuter ce code dans cmd :

php -r 'exec("wkhtmltopdf --version", $exec); print_r($exec,true)';
jojo1084
Auteur

L'invite de commande me renvoie une erreur :
Parse error: syntax error, unexpected ''exec(wkhtmltopdf --version,' (T_ENCAPSED_AND_WHITESPACE) in Command line code on line 1

Je constate aussi que lorsque je fais un var_dump($pdf->send()), la variable _isCreated est à FALSE...

jojo1084
Auteur

A tout hasard... une différence 32bits et 64bits peut-elle influencer ?

J'ai donc

  • Windows 10 Pro 64bits
  • WampServer 32bits
  • Et la libraire wkhtmltopdf installée : 64bits

Je pense pas... Essaye quand même d'installer WAMP en 64bits pour voir (garde les fichiers de config, uninstall le 32bits et ballance le 64 en y ajoutant ta config)

jojo1084
Auteur

D'après la documentation wkhtmltopdf, j'ai la bonne version installée.
Par pécuation, je l'ai réinstallée : aucunc changement !!!

Dans la classe php-shellcommand/src/Command.php, tu as la variable $useExec qui est à false.
essaye de la passer à true.
le commentaire dans le code précise que ça peut résoudre qques pb sous Windows.

jojo1084
Auteur

Salut à tous,
Encore un échec avec la modification proposée par Huggy...
Il doit y avoir quelque qui ne tourne pas rond sur mon système.
Je suis donc revenu à HTML2PDF... J'ai un résultat correct avec...

Merci quand même à tout le monde pour votre aide et votre suivi de ce topic...

Hello, je pense que le mieux dans ton cas et de passer par une VM, docker via boot2docker est très facile à prendre en main surtout avec les vidéos de Graf.
Tu verras ça te changera la vie de travailler sur du linux, tu n'auras pas c'est problèmes d'incompatibilités...

Bon courage en tous cas :)

Hello, je suis dans le même cas que toi ! pas d'erreur au première abord mais pas de PDF non plus ! par contre quand je vais un

echo $pdf->getError();

j'obtiens :
Failed without error message: wkhtmltopdf "C:\Windows\Temp\tmpC36D.tmp.html" "C:\Windows\Temp\tmpC36E.tmp.pdf"

voici tout mon code :

 public function generer(){

        ob_start();
        require BASE_REP . "_controleur/ctr_facture/template.php";
        $content = ob_get_clean();

        $pdf = new mikehaertl\wkhtmlto\Pdf();
        $pdf->addPage($content);
        $pdf->send("facture.pdf");
        echo $pdf->getError();
//      $pdf->saveAs(BASE_REP."www/_image/".uniqid().".pdf");
    }

je vais effectivement me tourner vers boot2docker je pense... A terme le site sera heberger sur un dédié linux ubuntu doinc pas de soucis en perspective mais bon j'aimerai bien tester le rendu en local quand je dev...
Si une personne trouve une solution je suis prenneur !! :)

Merci

Nico