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...
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 ?
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 ?
Désolé, je débute avec PhpStorm et tout ça... composer, ... m'est très peu connu depuis quelques jours.
Comment fait-on ?
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>
Si ça peut servir, voici mon environnement de travail :
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.
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());
}
}
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 :)
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 :
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.
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();
Merci pour ce commentaire supplémentaire qui hélas me renvoie toujours le même problème.
Pour résumé :
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.
Je l'avais déjà fait et refais un fois encore maintenant, aucun changement. Malheureusement...................
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
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 ?
Oui, voici ce que j'y ai mis :
PATH = C:\Program Files\wkhtmltopdf\bin\
Dans le dossier PATH il y a :
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
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... :(
Pareil... rien de nouveau...
Si je fais une autre commande avec shell_exec() cela fonctionne... mais pas pour wkhtmltopdf
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 !!!!
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)';
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...
A tout hasard... une différence 32bits et 64bits peut-elle influencer ?
J'ai donc
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)
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.
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