bonjour,
j'essaie de généré un fichier pdf à partir de tcpdf, tout le passe bien le fichier pdf est bien crée, mon problème est que dans le rubrique facturation il y a plusieurs facture pdf , mais il n' y a qu'un seul fihier pdf qui se crée et quand tu telecharge c'est la même information. je suis confus dans ma tête je ne sais plus ou se trouve l'erreur, quelqu'un pourrait m'expliquer la procédure à suivre?

voici le code de génération du fichier pdf, c'est un peu long veuillez m'excuser

<?php
$name=$user['User']['nom'];
$adresse=$user['User']['adresse'];
$country=$user['User']['country'];

//$time  =$date;
//echo time;
//$dateMySQL = $time;
//$datte = new DateTime($dateMySQL);

App::import('Vendor','xtcpdf');

 class MYPDF extends TCPDF {

    //Page header
    public function Header() {
        // Logo
        $image_file = K_PATH_IMAGES.'allchapels.jpg';
        $this->Image($image_file, 10, 10, 15, '', 'JPG', '', 'T', false, 300, '', false, false, 0, false, false, false);
        // Set font

    }

    // Page footer
    public function Footer() {
        // Position at 15 mm from bottom
        $this->SetY(-15);
        // Set font
        $this->SetFont('helvetica', 'I', 8);
        // Page number
        $this->Cell(0, 10, 'Page '.$this->getAliasNumPage().'/'.$this->getAliasNbPages(), 0, false, 'C', 0, '', 0, false, 'T', 'M');
    }
}

$pdf = new MYPDF('L', PDF_UNIT, 'A4', true, 'UTF-8', false);
 // set document information
$pdf->SetCreator(PDF_CREATOR);
$pdf->SetAuthor('Allchaples');
$pdf->SetTitle('invoice');
$pdf->SetSubject('invoice allchaples');
$pdf->SetKeywords('Allchaples');

// set default header data
$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE, PDF_HEADER_STRING);
// set header and footer fonts
$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));

// set default monospaced font
$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);

// set margins
$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);

// set auto page breaks
$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);

// set image scale factor
$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
$pdf->AddPage();

$html = <<<EOF
<!-- EXAMPLE OF CSS STYLE -->
<style>
    h1 {
        color: navy;
        font-family: times;
        font-size: 24pt;
        text-decoration: underline;
    }
    p.first {
        color: #003300;
        font-family: helvetica;
        font-size: 12pt;
    }
    p.first span {
        color: #006600;
        font-style: italic;
    }
    p#second {
        color: rgb(00,63,127);
        font-family: times;
        font-size: 12pt;
        text-align: justify;
    }
    p#second > span {
        background-color: #FFFFAA;
    }

    .first {
        color: #003300;
        font-family: helvetica;
        font-size: 8pt;
        border: 1px solid #cccccc;
    }

    .trait {

        background-color: #c4d3d8;
    }
    .td{
        border: 1px solid #cccccc;

    }

    .traite{
       background-color: #ebeeef;

    }
    .tva{
       background-color:#f2f2f2;

    }
    .ttc{
       background-color: #cccecf;
       color:#07748f;
    }
    .taille{
       font-family: helvetica;
       font-size: 11pt;
       color:#000000;
    }

    .tdd{
       font-family: helvetica;
       font-size: 7pt;
       color:#000000;
    }

    .lowercase {
        text-transform: lowercase;
    }
    .uppercase {
        text-transform: uppercase;
    }
    .capitalize {
        text-transform: capitalize;
    }
</style>

<table  cellpadding="0" cellspacing="0" border="0">
<tr>
<td width="656" align="left"></td>
<td width="263" align="left" calss="tdd">
 Facture acquittée : <b>$ref</b> <br>
 Date :<b>$time</b> <br>
 Date de paiement :<b>$time</b><br>
 Commande :<b>$commande</b><br>
</td>
</tr></table>

 <br><br>

 <table  cellpadding="0" cellspacing="0" border="0">
<tr>
<td width="570" align="left"></td>
<td width="349" align="left" >
Contact de facturation:<br>
 <table width="315"  cellpadding="4" cellspacing="0" class="first">
 <tr>
 <td width="281" height="88" class="taille">
$name<br>
$adresse<br>
$country
</td></tr></table>
</td>
</tr></table>

 <br><br><br>
<table class="first" cellpadding="4" cellspacing="0" border"1">
 <tr class="trait" >
    <td class="td">OFFRES</td>
        <td class="td">QUANTITE</td>
        <td class="td">PRIX UNITAIRE</td>
        <td class="td">PRIX HT</td>
    </tr>
    <tr>
        <td class="td">$nom</td>
        <td class="td">1</td>
        <td class="td">$price</td>
        <td class="td">$price</td>
    </tr>
     <tr class="traite">
       <td colspan="2"></td>
        <td class="td" align="right">Sous total</td>
        <td class="td">$price</td>
    </tr>
</table><br><br><br>

<table  cellpadding="0" cellspacing="0" border="0">
<tr>
<td width="599" align="left"></td>
<td width="320" align="left" >
<table class="first" cellpadding="4" cellspacing="0" border"1"  width="343" align="right">
 <tr>
        <td width="202" align="left"  class="td">PRIX HT</td>
        <td width="119" align="center"  class="td">$price</td>
    </tr>
    <tr class="tva">
        <td class="td" align="left">TVA (20%)</td>
        <td class="td" align="center"> - </td>
     </tr>
    <tr class="ttc">
        <td class="td" align="left"><b>TOTAL TTC</b></td>
        <td class="td" align="center"><b>$price</b></td>
    </tr>
</table>

</td>
</tr></table>
 EOF;

// output the HTML content
$pdf->writeHTML($html, true, false, true, false, '');
$pdf->lastPage();
echo $pdf->Output(WWW_ROOT . 'files'.DS.'pdf' . DS . 'facture.pdf', 'F');
?>

12 réponses


wenz
Auteur

Bonjour, svp personne pour me donner un coup de main

Explique mieux ton pb stp !!!
par exemple tu dis que c'est toujours le même fichier mais dans la fonction Output tu mets toujours le même nom de fichier 'facture.pdf'
ensuite tu dis que les données sont toujours les mêmes , regarde d'où viennent $nom $price !!!

Bonjour.
C'est un peu le bordel tout ça.
Le code que tu nous montre, il se trouve où, dans une fonction de controller ou dans une vue ?
Si tu importes une classe/librairie, tu es juste censé définir la configuration et non réécrire la classe et/ou certaines de ses fonctions.
Ensuite, tu veux juste générer un pdf pour la visualisation pour l'utilisateur ou créér le fichier pdf afin de le stocker sur ton serveur ?
Car si c'est le deuxième cas, tu ne peux pas nommer deux fichiers exactement pareil dans le même chemin.

wenz
Auteur

le code se trouve dans la vue, dans le controleur payment j'ai une function paypal_return avec

$this->layout ='pdf';
$this->render('/users/pdf_view');

qui renvoie vers la vue et genere le fichier dès qu'un abonné effectue un paiement avec succes.
mon problème c'est comment faire pour que le fichier pdf generé corresponde à un paiement précis.

J'ai l'intime conviction que tu ne veux pas comprendre.

mon problème c'est comment faire pour que le fichier pdf generé corresponde à un paiement précis.

Alors que nous t'avons dit que c'est normal étant donné que tu donnes un nom de fichier unique dans l'output :

$pdf->Output(WWW_ROOT . 'files'.DS.'pdf' . DS . 'facture.pdf', 'F');

Soit tu changes le chemin en définissant par exemple un dossier nommé par l'identifiant de la facture, ce qui pourrait donner :

$pdf->Output(WWW_ROOT . 'files' . DS . 'pdf' . DS . $ref . DS . 'facture.pdf', 'F');

Ou alors tu modifies le nom du fichier facture par un autre, qui devra être également unique bien sûr.

wenz
Auteur

Ah bon, je ne fait pas par expres, merci pour les details, j'avais pas bien compris ce que tu disais,le fichier est bien crée, j'ai ajouté le numero de référence du commande qui se crée aléatoirement,

echo $pdf->Output(WWW_ROOT . 'files'.DS.'pdf' . DS . 'facture'.$ref.'.pdf', 'F');

pour ce qui concerne l'affichage c'est le meme problème, il n'affiche que le meme pdf, voici ma fonction qui permet d'afficher le pdf

public function pdf(){
    $this->loadModel('Transaction');
    $this->loadModel('User');
    $user_id=$this->Auth->user('id');
    if (!$this->Auth->user('id')) {
    $this->redirect('/users/login');
             }
    $invoice=$this->Transaction->find('all',array(
    'conditions'=>array('user_id'=>$user_id),
    'fields'=>array('reference'),
    ));
    foreach($invoice as $key){
        $ref=$key['Transaction']['reference'];;
        $re='facture' .$ref. '.pdf';

    $this->viewClass = 'Media';
    $params = array(
        'id' => $re ,
        'name' =>$re ,
        'download' => false,
        'extension' => 'pdf',
        'path' => WWW_ROOT .'files'.DS.'pdf' . DS
    );

    $this->set($params);
    }
    }

j'ai fait une erreur quelque part?

Pour commencer, tu devrais un peu mieux lire la documentation de CakePHP :

class MediaView
Obsolète depuis la version 2.3: Utilisez Envoyer des fichiers à la place.

Ensuite, pourquoi créer un fichier pdf que tu stockes sur ton serveur, si tu permets à l'utilisateur de le voir directement sur une vue ?

wenz
Auteur

no ça sera pas affichage , ça sera telecahrger je suis entrain de faire des test pour voir comment ça fonction c'est pourquoi,
donc la nouvelle façon c'est d'utiliser CakeResponse::file()?

Que ce soit pour afficher un fichier ou juste forcer un téléchargement, il te faut utiliser CakeResponse oui, comme il est indiqué ici : Envoyer des fichiers.

wenz
Auteur

Lartak mais version cake c'est 2.2.4 quand j'utilise CakeResponse::file() j'ai l'erreur suivante: Error: Call to undefined method CakeResponse::file()

Tu es en mode dev et tu as une version 2.2.* alors que les versions les plus récentes sont les 2.6.* ?
Tu utilises bien :

$this->response->file(/* params */);

Si oui, as-tu bien mis le composant RequestHandler dans ton AppController par exemple ?

wenz
Auteur

oui c'est toujours la même erreur, voici la façon dont j'utilise CakeResponse: $this->response->file($path, array('download' => true, 'name' => $nam ));