2010-01-21 4 views
6

Je crée un PDF dynamique dans ColdFusion et j'ai un problème avec "pagebreak". La page en question pourrait avoir 1 enregistrement, ou jusqu'à 60 enregistrements. Chaque enregistrement est affiché dans 2 lignes d'une table. Certains des enregistrements renvoyés sont répartis entre les pages (la première ligne est à la fin de la première page, la deuxième ligne est la première rangée de la suivante).COLDFUSION: cfdocument et forcer un saut de page

Un enregistrement de l'échantillon en HTML affiché:

<tr> 
    <td>Title</td><td>Price</td> 
    <td colspan="2">Description</td> 
</tr> 

Par requête du client, Je suis en train d'afficher = < 9 enregistrements par page.

Voici un échantillon abêtis de quelque chose que j'ai essayé:

<cfdocument format="PDF"> 
<cfoutput query = "sqllookup"> 
<cfset loopcount = loopcount + 1> 
<cfif loopcount EQ '9'> 
<cfdocumentitem type="pagebreak" /> 
<cfelse> 
<tr> 
    <td>#Title#</td><td>#Price#</td> 
    <td colspan="2">#Description#</td> 
</tr> 
</cfif> 
</cfoutput> 
</cfdocument> 

Cela ne fonctionne pas, (il ne cache que le record 9). J'ai essayé plusieurs idées différentes, et je suis actuellement perplexe. Suis-je en train de regarder quelque chose?

Merci d'avance.

ColdFusion MX 7. (j'ai aussi couru le correctif pour problème de coupure du texte. http://kb2.adobe.com/cps/402/kb402093.html)

+0

Pas vraiment une réponse, mais une supposition. Avez-vous essayé de fermer la balise de la table après 9 enregistrements et créer la nouvelle table pour la nouvelle page? Le seul problème est que pour le texte long, vous aurez besoin de moins de lignes, cela peut nécessiter quelques tricheries Len(). – Sergii

Répondre

6

Vous cachez le record 9 parce que vous devez choisir entre l'affichage et le montrer:

if 9th record 
    break page 
else 
    show record 
end if 

Ce que vous voulez est plus comme:

<cfoutput query = "sqllookup"> 
    <!--- this is the 9th row, because 9 mod 9 is 0 ---> 
    <cfif not sqllookup.currentrow mod 9> 
     <cfdocumentitem type="pagebreak" /> 
    </cfif> 
    <tr> 
     <td>#Title#</td><td>#Price#</td> 
     <td colspan="2">#Description#</td> 
    </tr> 
</cfoutput> 
0

Essayez d'ajouter un style="page-break-inside: avoid;" à tout élément que vous ne voulez pas être partagé entre 2 pages .

Par exemple,

<tr style="page-break-inside: avoid;"> 
    <td>#Title#</td><td>#Price#</td> 
    <td colspan="2">#Description#</td> 
</tr> 
+0

La propriété CSS 'page-break-inside' ne fonctionne que pour Opera http://www.w3schools.com/cssref/pr_print_pagebi.asp –

+1

@JonathanWilson La question ne concerne pas le rendu vers un navigateur, mais vers un fichier PDF utilisant CF. J'ai été témoin (il y a 2+ ans) de ce travail correctement en utilisant CF. – Eddie

+0

Oh. J'ai mal compris cela. –

1

Après avoir lutté avec ce problème pendant plusieurs mois, j'ai découvert que l'emballage du cont ents d'un td avec un div (ie. <tr><td><div>Cell Contents</div></td></tr>) empêchera un saut de page à l'intérieur de la ligne. Avec cette configuration, un saut de page qui diviserait normalement la ligne entre les pages tombera plutôt avant la ligne, en créant un petit espace supplémentaire à la fin de la première page et en plaçant la ligne au début de la page suivante. Remarque sur les lignes avec plusieurs cellules: Une seule div td-imbriquée est suffisante pour provoquer le comportement ci-dessus pour toute la ligne.

<tr> 
    <td>Blah blah blah blah blah</td> 
    <td>Gnar gnar gnar gnar gnar</td> 
    <td><div>Soda POP soda POP soda POP</div></td> <!--- the fix ---> 
    <td>Stellar!</td> 
</tr> 
+0

Dans mes tests avec CF10 (bien que je crois que le moteur CFdocument n'a pas changé depuis CF8), le moteur de rendu semble garder les lignes ensemble si elles ont trois ou quatre lignes de hauteur, et les sépare à un moment donné. Cette solution DIV fonctionnait pour des lignes légèrement plus hautes - peut-être que l'algorithme pondère les éléments de niveau bloc et essaye de les garder ensemble, donc les tables d'imbrication à l'intérieur de vos tables peuvent décourager les sauts de page (aïe!) –

0

Pour moi, après avoir essayé tous les trucs et astuces du forum etc. - la seule chose qui a travaillé dans cf8 pour les grands blocs de code (y compris des images, des tables, bloc div etc.) est la suivante:

  • envelopper la partie de rupture non avec

    <div>...</div>

  • mais un super simple <br> après dans une nouvelle ligne (en code) par exemple.

    <div> ... your stuff ... </div> <br>

qui a fonctionné, l'enfer sait pourquoi ...

Questions connexes