Bonjour,
Je suis débutant cakephp et je souhaiterai intégrer html2pdf dans cakephp 2.0.
Comme indiqué dans le topic http://www.grafikart.fr/forum/topic/2081 comment importer html2pdf, j'ai supprimé le .class du fichier html2pdf.class.php dans le dossier App/Lib/html2pdf/ (j'espère avoir bien compris!!!).
j'ai fais mon appel dans ma vue (pdf.ctp):
<?php
App::import('Lib','html2pdf/html2pdf');
try{
$pdf = new HTML2PDF('P','A4','fr');
$pdf->pdf->SetDisplayMode('fullpage');
$pdf->writeHTML($content);
$pdf->Output('test.pdf');
}
catch(HTML2PDF_exception $e){
die($e);
}
?>
le problème est que lorsque j'affiche la vue dans le navigateur, cela n'affiche pas le pdf mais le code suivant:
%PDF-1.7 3 0 obj <> /Resources 2 0 R /Contents 4 0 R>> endobj 4 0 obj <> stream x?3?35W(W0R?R0P?R??R)@???g``???????f?
h?+??)??p?? $R?M??a!?;??+T?(F&???? ( p ????)X)??!) ???9?%?? !^ %??? W!6?@???? endstream endobj 1 0 obj <> endobj 5 0 obj << /Type /OCG /Name (??print) /Usage << /Print <> /View <> >> >> endobj 6 0 obj << /Type /OCG /Name (??view) /Usage << /Print <> /View <> >> >> endobj 7 0 obj <> endobj 2 0 obj << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] /Font << /F1 7 0 R >> /XObject << >> /Properties <> /ExtGState << >> >> endobj 8 0 obj << /Creator (??HTML2PDF - TCPDF) /Producer (??TCPDF 5.0.002 (http://www.tcpdf.org) (TCPDF)) /CreationDate (D:20111107123141+00'00') /ModDate (D:20111107123141+00'00') >> endobj 9 0 obj << /Type /Catalog /Pages 1 0 R /OpenAction [3 0 R /Fit] /PageLayout /SinglePage /PageMode /UseNone /Names << >> /ViewerPreferences << /Direction /L2R >> /OCProperties <> <>]>>>> >> endobj xref 0 10 0000000000 65535 f 0000000384 00000 n 0000000786 00000 n 0000000009 00000 n 0000000175 00000 n 0000000444 00000 n 0000000563 00000 n 0000000680 00000 n 0000000945 00000 n 0000001194 00000 n trailer << /Size 10 /Root 9 0 R /Info 8 0 R >> startxref 1553 %%EOF
quelqu'un peut-il m'aider à comprendre l'erreur?
merci d'avance pour votre aide et merci à Grafikart pour ses super tutos !!!
Ayant pas mal galéré, je poste la manière dont j'exporte un PDF sur CakePHP 2.0.5 en mode "inline", c'est à dire en affichant le pdf généré directement dans le navigateur:
J'ai téléchargé html2pdf et placé le dossier dans le répertoire /app/vendor/ puis renommer le dossier en html2pdf et enfin renommer le fichier /app/vendor/html2pdf/html2pdf.class.php en /app/vendor/html2pdf/html2pdf.php
Créer le fichier /app/View/Layouts/pdf.ctp
<?php
echo $content_for_layout;
?>
Comme vous le voyez, le layout ne contient pas le header("Content-type: application/pdf");
Dans le controller :
public function exportpdf(){
//pour éviter les outputs du debug de cake
Configure::write('debug',0)
//la solution depuis cakephp 2
$this->response->type('pdf');
$this->layout='pdf';
}
La vue /app/View/Moncontroller/exportpdf.ctp
<?php
$content = '<page>SALUT</page>';
App::import('Vendor', 'html2pdf/html2pdf');
$pdf = new HTML2PDF('P', 'A4', 'fr');
$pdf->pdf->SetDisplayMode('fullpage');
$pdf->writeHTML($content);
$pdf->Output('fichier.pdf');
?>
Et voilà, j’espère que cela puisse aider.
Moi aussi j'ai rencontré ce problème d'affichage de pdf quand je l'envoie directement dans firefox ou chrome avec FPDF.
J'ai procédé de la manière suivante pour le résoudre.
Dans mon controller j'ai rajouté
function beforeRender() {
if($this->request->params'action']=="pdf") {
$this->response->type('application/pdf');
$this->layout=null;
}
}
public function pdf() {
//code
}
Et dans ma vue pdf.ctp
App::import('Vendor', 'Fpdf', array('file' => 'fpdf'.DS.'FPDF.php'));
suivi de mon code
merci,
j'ai ajouté un header mais le résultat est toujours le même :
<?php header("Content-type:application/pdf"); ?>
<?php ob_start();?>
<table>
<tr>
<td>Salut</td>
</tr>
</table>
<?php $content = ob_get_clean();
App::uses('HTML2PDF','html2pdf');
try{
$pdf = new HTML2PDF('P' , 'A4' , 'en');
$pdf->writeHTML($content);
$pdf->Output('fichier.pdf');
}
catch(HTML2PDF_exception $e){
die($e);
}
?>
il refuse toujours de l'interpréter comme un pdf!!!
Petite précision: le fichier fonctionne parfaitement si je force le téléchargement avec la commande:
$pdf->Output('fichier.pdf','D');
Rajoute header('Content-type: application/pdf'); avant le output
tu es sûr que ton navigateur supporte la lecture de PDF ? (chrome ne le gère pas par défaut
J'ai bien replacé le header avant l'output mais l'erreur apparait toujours !
Chrome installé sur mon poste, arrive bien à lire les PDF. il lit d'ailleurs ce fameux pdf une fois uploadé sur le serveur local via la commande suivante.
$pdf->Output('chemins du dossier/file.pdf','F');
De plus l'erreur apparaît sur l'ensemble des navigateurs testés (IE, SAFARI, CHROME, FF).
J'ai également tenté de de désactiver l'affichage du layout et mis le debug à 0 : sans succès !
J'ai réussi à créer mon PDF et cette erreur ne pose pas vraiment de problème (dans l’immédiat !) car mon objectif était d'uploader le document sur le serveur (Et ça fonctionne !), toutefois j'aimerais bien comprendre pourquoi il refuse de le lire directement dans le navigateur lors de sa génération (c'est pas franchement pratique pour créer l'apparence du PDF).
Merci d'avance pour ton aide.
Il faut que tu rediriges vers le fichier pdf lui-même pour qu'il soit lu par le navigateur.
Donc conserve cette ligne
$pdf->Output('chemins du dossier/file.pdf','F');
Ensuite dans ton controller
public function renderPdf() {
$this->layout='pdf';
$this->render();
$this->redirect('/chemins du dossier/file.pdf');
}
Et dans le View/Layouts/pdf.ctp
header("Content-type: application/pdf");
echo $content_for_layout;
Salut je ne connais pas grand chose en génération de pdf via html2pdf dans cakephp, mais j'ai trouvé un tutoriel qui explique ceci, peut être que la solution est à l'intérieur :
Intégrer html2pdf dans cakephp 1.3
Ce tutoriel est destinée à la version 1.3 mais il est facile de migration pour la version 2.0
Super merci ça ma beaucoup aidé :D mais un petit problème encore :
quand je fais un die($content); j'ai bien ma page qui s'affiche en html
mais impossible de le générer le pdf quand je supprime ce die($content);:
$content = ob_get_clean();
//die($content);
try{
App::import('Vendor', 'html2pdf/html2pdf');
Server error
The website encountered an error while retrieving http://www.mondomaine.com:8888/monprojet/members/orders/pdf/130. It may be down for maintenance or configured incorrectly.
Here are some suggestions:
Reload this webpage later.
HTTP Error 500 (Internal Server Error): An unexpected condition was encountered while the server was attempting to fulfill the request.
Une idée?
Merci mille fois amethyste, je commeçais à m'arracher les cheveux !
Ça faisait trois heures que j'étais dessus...
Je remonte ce post, mais j'ai eu le même soucis et la seule façon de le résoudre a été de déplacer le dossier html2pdf dans le répertoire Vendor et donc de mettre :
App::import('Vendor', 'html2pdf/html2pdf');
En espérant que ça aide du monde.
Merci beaucoup @amethyste ça fonctionne très bien ! et merci @grafikart pour ton tuto sur le sujet