2009-10-22 7 views
3

Je génère une facture pdf en utilisant fpdf.fpdf - retourner à la page précédente

Certaines factures contenant de nombreux éléments, et les détails doivent aller dans la deuxième page. Cependant, j'ai besoin du total, et d'autres détails à afficher sur la première page.

Maintenant, si je peux ajouter une nouvelle page comme ceci: $ pdf-> AddPage(); Mais, cela met tout dans la deuxième page, quoi que ce soit après cette déclaration.

Il semble qu'il n'y ait aucun moyen de spécifier la page pour les méthodes d'écriture ou de cellule.

Le rendu et les calculs sont peu complexes. Ils ne doivent donc pas être stockés dans un tableau temporaire et affichés après avoir entièrement rendu la première page.

Merci.

Répondre

2
if(!empty($this->replace) && !empty($this->replacement)){ 
    $this->pages[$n]=str_replace($this->replace,$this->replacement,$this->pages[$n]); 
} 

J'ajouté ce code à la classe fpdf dans _putpages() juste sous/Page ligne de contenu 2851

Exemple après avoir ajouté ci-dessus au code:

$pdf->replace = array("{paid_msg}","{balance}"); 
$pdf->replacement = array("Paid","0.00"); 

Il peut être une chaîne ou un tableau.

+0

belle fonctionne bien! – dano

3

FPDF ne vous permet pas de revenir à une page précédente. Une fois que vous avez terminé avec une page - soit en appelant AddPage() ou en manquant d'espace lorsque SetAutoPageBreak() est activé - vous avez terminé avec elle. La solution de contournement consiste à générer votre document sans le total, l'écrire dans un fichier temporaire puis le recharger (à l'aide de FPDI: http://www.setasign.de/products/pdf-php-solutions/fpdi/) et ajouter le total à l'emplacement correct.

+0

Merci. L'absence de cette fonctionnalité est gênante. – Natkeeran

4

J'ai eu une question très similaire et je suis allé de l'avant et vient d'ajouter la fonction à la classe:

function SetPage($num) { 
    $this->page = $num; 
} 

Cela ne littéralement ce que vous attendez. Mais, lorsque vous essayez de revenir à la page suivante, vous devez le définir explicitement ou ajouter à la fonctionnalité Cell(). Voici où il ajoute une page:

if($this->y+$h>$this->PageBreakTrigger && !$this->InHeader && !$this->InFooter && $this->AcceptPageBreak()) 

Ce contrôle pour AcceptPageBreak et, évidemment, si la hauteur de la page est inférieure à où nous finirons si nous restons sur la page. Ce que j'ai fait était ajouter un conditionnel ici pour vérifier s'il y avait une autre page ci-dessous. S'il y avait, plutôt que d'ajouter une nouvelle page, je suis allé de l'avant et juste mis mon Y à ma marge et utilisé la fonction ci-dessus pour visiter cette page. En tant que tel:

if ($this->page < count($this->pages)) { 
     $this->SetPage(($this->page)+1); 
     $this->y = .5; 
    } 

Si vous êtes mal à l'aise avec déconner avec FPDF, cela pourrait ne pas être pour vous, mais ma prise de conscience après avoir résolu cette question était en fait que le script était très facile à naviguer et à gauche une grande chambre pour des améliorations simples. Notez qu'au lieu de vérifier ci-dessus pour une autre page, vous pouvez également ajouter une variable que vous pourriez appeler et qui indiquerait temporairement au script qu'au lieu d'ajouter une page, vous n'avez qu'à passer à la suivante.

+0

Cela a fonctionné pour moi! N'oubliez pas d'aller à la dernière page avant d'appeler Sortie afin que toutes les pages soient éditées, ou ajoutez ceci en haut de la fonction Sortie FPDF: '$ this-> page = count ($ this-> pages);' – John

0

Des solutions astucieuses ici, mais je ne recommande pas cette supercherie, car elle va à l'encontre du modèle FPDF de base et causera tôt ou tard probablement d'autres problèmes sur la route.

La programmation est déjà assez complexe!

Donc, séparez le modèle de la facture ou quoi que ce soit de la présentation. Construire le modèle entier. Ensuite, affichez la présentation (le PDF dans ce cas).

0

J'ai trouvé très approprié la méthode * str_replace *, en raison de la nécessité d'écrire "n de m pages". J'ai d'abord écrit le nombre n normalement comme j'ai construit chaque page et finalement remplacé le chiffre m dans $ pdf-> pages [$ i] page par page.

0

J'ai rencontré ce problème en ayant une disposition à deux colonnes, où une colonne pouvait être si grande qu'elle s'étendrait à la page suivante. Je voulais remettre la position Y à la même position Y que la première colonne, afin qu'elles soient alignées les unes sur les autres, mais aussi continuer le document sous la plus grande des deux colonnes.

Ma solution était d'enregistrer la "position verticale" du document, qui comprend le numéro de page ($pdf->PageNo()) et la position Y ($pdf->GetY()).

Vous devez stocker deux positions verticales différentes. Tout d'abord, stockez le "point de départ" qui est l'endroit où vous allez commencer votre deuxième colonne. Ensuite, stockez le «plus gros point» qui est le plus bas dans le document. Le plus gros point était délicat parce que vous ne pouvez pas regarder le numéro de page ou la valeur Y seul, vous devez regarder les deux.

J'ai créé ces trois méthodes pour m'aider.

Cette solution n'inclut pas la position X dans l'exemple.

public function GetVerticalPosition() { 
    // Include page and Y position of the document 
    return array(
    'page' => $this->PageNo(), 
    'y' => $this->GetY(), 
); 
} 

public function SetVerticalPosition($pos) { 
    // Set the page and Y position of the document 
    $this->page = $pos['page']; 
    $this->SetY($pos['y']); 
} 

public function FurthestVerticalPosition($aPos, $bPos = null) { 
    if ($bPos === null) $bPos = $this->GetVerticalPosition(); 

    // Returns the "furthest" vertical position between two points, based on page and Y position 
    if ( 
    ($aPos['page'] > $bPos['page']) // Furthest position is located on another page 
    || 
    ($aPos['page'] == $bPos['page'] && $aPos['y'] > $bPos['y']) // Furthest position is within the same page, but further down 
) { 
    return $aPos; 
    }else{ 
    return $bPos; 
    } 
} 

L'utilisation est assez simple. Avant de dessiner vos colonnes à hauteur variable, vous devez saisir la position de départ et commencer à collecter la position maximale.

$startPos = $this->GetVerticalPosition(); 
$furthestPos = $this->GetVerticalPosition(); 

Après avoir rendu chaque cellule, avant de rendre une autre cellule au même niveau, vous voulez mettre à jour la position la plus (si nécessaire), puis réglez à la position de départ. Lorsque vous avez terminé le rendu de vos colonnes, définissez le document sur la distance maximale que vous avez enregistrée jusqu'à présent. Maintenant, vos colonnes sont correctement alignées et le pointeur de document est situé immédiatement après la colonne la plus éloignée.

0

J'ai eu le même problème et j'ai surpassé quelques méthodes de la classe FPDF et ai été en mesure de le réparer d'une manière assez simple. Pour passer d'une page à l'autre, il suffit de changer l'attribut page de l'objet FPDF. Cependant, une fois que vous revenez sur une page, lorsque vous passez à la page suivante, vous finissez par ajouter une nouvelle page au lieu de passer à la page déjà existante. Pour résoudre ce problème, j'ai créé un booléen appelé add_new_page et je l'ai utilisé dans ma méthode accept_page_break réécrite pour voir s'il fallait créer une nouvelle page ou passer à une page déjà existante.

def prev_page(self): 
    self.page -= 1 
    self.add_new_page = False 

def next_page(self): 
    self.page += 1 

def accept_page_break(self): 
    "Accept automatic page break or not" 
    if self.add_page: 
     return self.auto_page_break 
    else: 
     self.page += 1 
     self.add_new_page = True 
0

Juste un simple "hack", mais les données doit être commandé par numéro de page (pas très difficile^^)

Mettez dans votre "boucle" données quelque chose comme placer:

// ensure we are on the good page, but fields HAVE TO be ordered by page number 
while($this->fpdf->PageNo() != $myData->getPage()){ 
    $this->fpdf->AddPage(); 
} 

Et vous avez terminé! Pas besoin de modifier FPDF: D

Questions connexes