我正在使用 DomPDF 和 CakePdf 来生成 pdf。好工具,但只有一件事我不明白:CSS 中“page-break-before”的行为。通常它工作得很好:当我想要时分页,但有时它会变得疯狂并在内部或之前导致许多分页符。难以置信的。
现在代码源(每页都有注释):
<style type="text/css">
@page {
margin: .5cm;
}
body {
padding-top: 20px;
padding-bottom: 80px;
font-family: 'helvetica', Arial, Helvetica, sans-serif;
font-size: 100%;
position: relative;
}
ul, li {
margin: 0;
padding: 0;
}
ul {
margin-left: 40px;
}
p, li {
font-size: .875em;
line-height: 1.6em;
margin: 0;
}
#header, #footer {
position: fixed;
/*left: 0;
right: 0;*/
}
#header {
top: 0;
}
#footer {
/*top: 1005px;*/
height: 60px;
bottom: 0;
background: #E28900;
}
#headerDiv {
border-top-width: 6px;
border-top-style: solid;
border-top-color: #E28900;
/*padding-top: 20px;*/
}
img#logo {
position: absolute;
top: 26px;
left: 0;
width: 120px;
}
#footerDiv {
position: relative;
padding-top: 20px;
}
#footerDiv p {
color: #fff;
font-size: .75em;
text-align: center;
}
#footer .pagenum {
position: absolute;
color: #fff;
font-size: .75em;
font-weight: bold;
bottom: 25px;
right: 10px;
}
#footer .pagenum:before { content: counter(page); }
h1#convention {
margin: 0 auto;
text-align: center;
font-size: 2.8em;
line-height: 1em;
padding: 250px 0 0 0;
color: #E28900;
text-transform: uppercase;
font-weight: normal;
font-family: 'titre';
}
h1#convention span {
display: block;
}
h1#convention small {
display: block;
margin: 20px 0 0;
padding: 0 100px 0 100px;
font-family: 'helvetica';
font-weight: bold;
text-align: center;
font-size: .4em;
line-height: 1.2em;
color: #006D93;
text-transform: none;
}
#adresse_client {
position: absolute;
left: 70px;
top: 680px;
}
#adresse_scio {
position: absolute;
text-align: right;
right: 70px;
top: 800px;
}
#adresse_client p, #adresse_scio p {
font-size: .9em;
}
#adresse_client b, #adresse_scio b {
font-weight: normal;
color: #006D93;
font-size: .75em;
}
#adresse_scio a {
text-decoration: none;
color: #E28900;
}
.page-break {
page-break-before: always;
}
/* style page 2 */
#adresse_client2 {
margin-top: 40px;
margin-bottom: 70px;
margin-right: 70px;
}
#adresse_client2 p {
color: #006D93;
text-align: right;
}
#lettre {
margin: 0 70px;
}
#lettre p {
line-height: 1.2em;
text-align: justify;
}
#lettre #signature {
margin-top: 60px;
}
#lettre #signature p {
text-align: right;
}
/* style page 3 */
#headerFormation {
margin: 0 70px 30px 70px;
}
#headerFormation td {
padding: 10px 0;
border-top: 1px solid #ddd;
border-bottom: 1px solid #ddd;
}
#headerFormation h3 {
display: inline;
color: #000;
font-size: .85em;
margin: 0;
padding: 0;
}
#contenuFormation {
margin: 0 70px 0;
}
h2#nomFormation {
font-family: 'share';
color: #006D93;
font-weight: bold;
font-size: 1.6em;
line-height: 1em;
margin: 10px 70px;
}
/* style page 4 */
#headerConvention {
margin: 0 0 5px 70px;
}
#headerConvention h2 {
color: #006D93;
font-family: 'share';
font-size: 2em;
margin: 0;
padding: 0;
}
#conventionPersonnes {
margin-bottom: 30px;
}
#conventionPersonnes td {
border-top: 1px solid #ddd;
border-bottom: 1px solid #ddd;
padding: 10px 0;
font-size: .85em;
}
#conventionPersonnes small {
color: #006D93;
}
#contenuConvention p, #contenuConvention li {
font-size: .85em;
line-height: 1.4em;
}
#contenuConvention {
margin: 0 70px 0;
}
#contenuConvention h3 {
margin: 20px 0 5px 0;
padding: 0;
font-family: 'helvetica';
font-size: .85em;
text-transform: uppercase;
color: #E28900;
}
#contenuConvention h4 {
text-align: center;
font-size: .75em;
margin: 0 20px 10px 20px;
padding: 0;
}
#conventionSignatures {
margin-top: 40px;
border: 1px solid #ddd;
}
#conventionSignatures strong {
color: #006D93;
}
#conventionSignatures td {
padding: 10px;
}
#conventionSignatures td.first {
border-right: 1px solid #ddd;
}
/* style page 5 */
#cgv {
margin: 0 70px;
}
#cgv h2 {
font-family: 'helvetica';
font-size: .85em;
text-transform: uppercase;
color: #006D93;
}
#cgv p, #cgv li {
font-size: .625em;
}
</style>
<!-- HEADER, FOOTER -->
<div id="header">
<div id="headerDiv"></div>
</div>
<div id="footer">
<div id="footerDiv">
<p>Immeuble CIT 3 rue de l'Arrivée 75749 Paris Cedex 15 / SAS au capital de 50 00 0 € - RCS de Paris 751 962 119</p>
</div>
<div class="pagenum"></div>
</div>
<!-- PAGE 1 -->
<?php echo $this->Html->image('/home/scio/app/webroot/img/scio-conseil-et-formation.png', array('alt' => 'Scio conseil & formation', 'id' => 'logo')); ?>
<h1 id="convention">
<span>Convention de formation</span>
<small><?php echo $stage['Formation']['libelle']; ?></small>
</h1>
<div id="adresse_client">
<p><b>Pour :</b></p>
<p><strong><?php echo strtoupper($client['SocietesEtablissement']['name']); ?></strong></p>
<p><?php echo $client['SocietesEtablissement']['adresse1']; ?></p>
<?php
if(!empty($client['SocietesEtablissement']['adresse2']))
echo '<p>'. $client['SocietesEtablissement']['adresse2'] .'</p>';
?>
<p><?php echo $client['SocietesEtablissement']['code_postal'] . ' ' . $client['SocietesEtablissement']['ville']; ?></p>
</div>
<div id="adresse_scio">
<p><b>Scio, Conseil & Formation</b></p>
<p><strong>Joël NICOLAS</strong></p>
<p>Associé Dirigeant</p>
<p>Tel. 01 83 94 79 05</p>
<p><a href="mailto:joel.nicolas@scio.fr">joel.nicolas@scio.fr</a></p>
</div>
<!-- PAGE 2 -->
<div class="page-break">
<div id="adresse_client2">
<p><strong><?php echo strtoupper($client['SocietesEtablissement']['name']); ?></strong></p>
<p><?php echo $client['SocietesEtablissement']['adresse1']; ?></p>
<?php
if(!empty($client['SocietesEtablissement']['adresse2']))
echo '<p>'. $client['SocietesEtablissement']['adresse2'] .'</p>';
?>
<p><?php echo $client['SocietesEtablissement']['code_postal'] . ' ' . $client['SocietesEtablissement']['ville']; ?></p>
</div>
<div id="lettre">
<p>Paris,<br />
<?php
$listeJours = array(
1 => "lundi",
2 => "mardi",
3 => "mercredi",
4 => "jeudi",
5 => "vendredi",
6 => "samedi",
7 => "dimanche"
);
$listeMois = array(
"01" => "janvier",
"02" => "février",
"03" => "mars",
"04" => "avril",
"05" => "mai",
"06" => "juin",
"07" => "juillet",
"08" => "août",
"09" => "septembre",
"10" => "octobre",
"11" => "novembre",
"12" => "décembre"
);
$dateHisto = strtotime($histo['CommandeHisto']['histo_date']);
$jourDateHisto = date('d', $dateHisto);
$journeeDateHisto = date('N', $dateHisto);
$moisDateHisto = date('m', $dateHisto);
$anneeDateHisto = date('Y', $dateHisto);
?>
<?php echo 'Le ' . $listeJours[$journeeDateHisto] . ' ' . $jourDateHisto . ' ' . $listeMois[$moisDateHisto] . ' ' . $anneeDateHisto . '</p>'; ?>
<br />
<p>Objet : Convention de Formation</p>
<br />
<p>Madame, Monsieur,</p>
<br />
<p>Nous vous prions de bien vouloir trouver ci-joint notre offre concernant :</p>
<br />
<?php if(empty($stage['Commande']['formation_id']) && empty($stage['Commande']['event_group_id'])) { ?>
<p><strong><?php echo $stage['Commande']['intitule']; ?></strong></p>
<br />
<p>Ainsi que les éléments cités en annexe ci-dessous :</p>
<br />
<ul>
<li>la Convention de formation </li>
<li>les conditions générales de vente SCIO Conseil & Formation</li>
</ul>
<br />
<p>Pour accord de votre part, nous vous remercions de bien vouloir nous retourner complété, daté et paraphé l’exemplaire de la "Convention de formation".</p>
<?php } else { ?>
<p><strong><?php echo $stage['Formation']['libelle'] . ' - réf. ' . $stage['Formation']['reference']; ?></strong></p>
<br />
<p>Ainsi que les éléments cités en annexe ci-dessous :</p>
<br />
<ul>
<li>le programme de formation</li>
<li>la Convention de formation </li>
<li>les conditions générales de vente SCIO Conseil & Formation</li>
</ul>
<br />
<p>Pour accord de votre part, nous vous remercions de bien vouloir nous retourner complété, daté et paraphé l’exemplaire de la "Convention de formation".</p>
<br />
<p>Si le coût de la prestation est pris en charge par un organisme collecteur, veuillez cocher le libellé prévu à cet effet et préciser ses coordonnées sur le feuillet "Convention de formation".</p>
<br />
<?php } ?>
<p>Nous espérons que notre offre répondra à vos attentes, et restons à votre disposition pour toute information complémentaire,</p>
<br />
<p>Nous vous prions d’agréer, Madame, Monsieur, l’expression de nos salutations distinguées.</p>
<div id="signature">
<p>Joël NICOLAS </p>
<p><i>Dirigeant</i></p>
</div>
</div>
</div>
<?php if(!empty($stage['Commande']['formation_id'])) { ?>
<!-- PAGE 3 -->
<div class="page-break"></div>
<!-- Si on met un page-break à un élément qui fait plusieurs pages, il y a des sauts de pages bizarres -->
<div>
<h2 id="nomFormation"><?php echo $stage['Formation']['libelle'] ; ?></h2>
<div id="headerFormation">
<table cellpadding="0" cellspacing="0" border="0" width="100%">
<tr>
<td width="50%" align="left"><h3><small style="font-weight: normal;">Programme de formation : </small> <?php echo 'réf. ' . $stage['Formation']['reference']; ?></h3></td>
<td width="50%" align="right"><h3><small style="font-weight: normal;">Sous-gamme</small> <?php echo $gamme['Gamme']['libelle']; ?></h3></td>
</tr>
</table>
</div>
<div id="contenuFormation">
<p><span style="color: #E28900;">Personnes concernées :</span> <?php echo $stage['Formation']['cible']; ?></p>
<br />
<p><span style="color: #E28900;">Objectifs pédagogiques :</span></p>
<?php echo $stage['Formation']['objectifs']; ?>
<br />
<p><span style="color: #E28900;">Programme détaillé :</span></p>
<div id="programme">
<?php echo $stage['Formation']['programme']; ?>
</div>
</div>
</div>
<?php } ?>
<!-- PAGE 4 -->
<div class="page-break">
<div id="headerConvention">
<h2>Convention de formation</h2>
</div>
<div id="contenuConvention">
<table cellpadding="0" cellspacing="0" border="0" width="100%" id="conventionPersonnes">
<tr>
<td width="50%" valign="top">
<p><small>Entre :</small></p>
<p><strong>SCIO Conseil & Formation</strong><br />
Immeuble CIT<br />
3 rue de l’Arrivée<br />
75015 PARIS<br />
<i>RCS de Paris : 751 962 119</i></p>
</td>
<td width="50%" valign="top">
<p><small>Et :</small></p>
<p><strong><?php echo strtoupper($client['SocietesEtablissement']['name']); ?></strong><br />
<?php echo $client['SocietesEtablissement']['adresse1']; ?><br />
<?php
if(!empty($client['SocietesEtablissement']['adresse2']))
echo $client['SocietesEtablissement']['adresse2'] .'<br />';
?>
<?php echo $client['SocietesEtablissement']['code_postal'] . ' ' . $client['SocietesEtablissement']['ville']; ?><br />
<?php echo '<i>SIRET : ' . $client['SocietesEtablissement']['siret'] . '</i>'; ?></p>
</td>
</tr>
</table>
<?php if(empty($stage['Commande']['formation_id']) && empty($stage['Commande']['event_group_id'])) { ?>
<?php
echo '<h3>Objet de la prestation : '. $stage['Commande']['intitule'] .'</h3>';
echo html_entity_decode($stage['Commande']['commentaires']);
echo '<h3>Conditions tarifaires & facturation</h3>';
echo '<ul>';
echo '<li>Coût de la prestation : <strong>'. number_format($stage['Commande']['montant'],2,',',' ').' € HT *</strong></li>';
if(isset($remise) && !empty($remise)) {
echo '<li>';
echo 'Remise : <strong>-'. number_format($remise['Invoice']['montant'],2,',',' ') .' €</strong>';
echo '</li>';
}
echo '</ul>';
?>
<?php } else { ?>
<h3>1. Objet de la prestation</h3>
<h4><?php echo $stage['Formation']['libelle'] . ' (' . $stage['Formation']['reference'] . ')'; ?></h4>
<p><small style="font-size: .8125em; line-height: 1.2em; color: #888;">Cette prestation s’inscrit dans les actions de formation professionnelle mentionnées à l’article L6313-1 du code du travail Le client reconnaît avoir pris connaissance des conditions particulières relatives aux prestations de formation et déclare en accepter les termes.</small></p>
<h3>2. Conditions d'exécution de la prestation</h3>
<ul>
<li>Nombre de participants : <strong><?php echo $stage['Commande']['participants']; ?></strong></li>
<li>Nombre de jours :
<strong>
<?php
$duree = explode('.', $stage['Formation']['duree']);
if($duree[1] == 5) {
echo number_format($stage['Formation']['duree'],'1',',',' ');
} else {
echo $duree[0];
}
?> jours
</strong>
</li>
<li>Nombre de sessions : <strong><?php echo $stage['Formation']['duree_nb']; ?></strong></li>
</ul>
<h3>3. Dates d'exécution</h3>
<ul>
<li>
Date(s) de session(s) :
<strong>
<?php
if(empty($stage['Commande']['event_group_id']) && $stage['Formation']['type'] == 'interentreprise') {
echo 'à définir';
} else {
if($dates[0]['debut'] == $dates[0]['fin']) {
echo 'le ' . date('d/m/Y', strtotime($dates[0]['debut']));
} else {
echo 'du ' . date('d/m/Y', strtotime($dates[0]['debut'])) . ' au ' . date('d/m/Y', strtotime($dates[0]['fin']));
}
}
?>
</strong>
</li>
<li>
Lieu :
<strong>
<?php
if(empty($stage['Commande']['event_group_id']) && $stage['Formation']['type'] == 'interentreprise') {
echo 'à définir';
} else {
echo $dates['EventPlace']['adresse'] . ' ' . $dates['EventPlace']['code_postal'] . ' ' . $dates['EventPlace']['ville'];
}
?>
</strong>
</li>
</ul>
<h3>4. Éléments pédagogiques</h3>
<ul>
<li><?php echo strip_tags($stage['Formation']['moyens']); ?></li>
</ul>
<h3>5. Conditions tarifaires & facturation</h3>
<ul>
<li>Coût de la session de formation : <strong><?php echo number_format($stage['Commande']['montant'],2,',',' '); ?> € HT *</strong></li>
<?php
if(isset($remise) && !empty($remise)) {
echo '<li>';
echo 'Remise : <strong>'. number_format($remise['Invoice']['montant'],2,',',' ') .' €</strong>';
echo '</li>';
echo '<li>';
echo 'Montant après remise : <strong>'. number_format(($stage['Commande']['montant']+$remise['Invoice']['montant']),2,',',' ') .' €</strong>';
echo '</li>';
}
?>
<li>Facturation : <strong><?php echo $stage['Commande']['info_paiement']; ?></strong></li>
<li>Prise en charge OPCA : <strong>................................. € HT</strong></li>
<li>Prise en charge Client : <strong>................................. € HT</strong></li>
<li>Autre : .....................................................................................................................................</li>
</ul>
<?php } ?>
<table cellpadding="0" cellspacing="0" border="0" width="100%" id="conventionSignatures">
<tr>
<td width="50%" height="100" class="first" valign="top">
<p><strong>Pour SCIO Conseil & Formation</strong></p>
<p><small>À ................................. le .................................</small></p>
<p><small>Signature :</small></p>
<?php echo $this->Html->image('/home/scio/app/webroot/img/manager/signature-joel-nicolas.jpg', array('alt' => 'Joël Nicolas pour : SCIO Conseil & Formation')); ?>
</td>
<td width="50%" valign="top">
<p><strong>Pour le client</strong></p>
<p><small>À ................................. le .................................</small></p>
<p><small>Signature & cachet :</small></p>
</td>
</tr>
</table>
<br />
<p><small style="font-size: .8125em; line-height: 1.2em; color: #888;">* Les conditions proposées dans la présente convention sont valables 3 mois à compter de la date de signature apposée par SCIO Conseil & Formation</small></p>
</div>
</div>