web-dev-qa-db-fra.com

TCPDF ne rend pas toutes les propriétés CSS

J'essaie de faire un PDF écrit CSS et HTML mais mon CSS n'apparaît pas dans mon PDF. La seule chose à considérer est la taille de police et la couleur de police.

Je vous donne le code (désolé, c'est un peu long ...)

$config = sfTCPDFPluginConfigHandler::loadConfig('my_config');

    $doc_title    = "Fiche Logement";

    $html = <<<EOF
<style>
        .informations {
            padding: 10px;
            margin: 10px;
            border: 1px dotted black;}
        .informations table {
            margin-top: 10px;}
        #modif {
            margin: 20px;
            text-align: left;
            float: right;}
        #modif th {
            padding-left: 10px;}
        #modif td {
            padding-left: 10px;}
        #adresse {
            width: 307px;
            float: left;}
        #reservataire {
            width: 307px;
            float: right;}
        #intergen {
            width: 307px;
            float: right;}
        #infos {
            width: 290px;
            float: left;}
        #handicap {
            padding-bottom: 12px;
            width: 324px;
            float: right;}
        #charges {
            margin-bottom: 20px;
            width: 307px;
            float: left;}
        #loyer {
            width: 307px;
            float: right;}
        #commentaires {
            clear: both;}
        h2 {
            font-variant: small-caps;
            text-align: center;
            font-size: 19px;
            font-weight: bold;
            padding: 0px 0px 2px 5px;
            margin: 15px 0px 20px 0px;
            color: #000000;
            border-top: 1px dotted black;
            border-bottom: 1px dotted black;}

        h3 {
            width: 250px;
            font-variant: small-caps;
            font-size: 15px;
            font-weight: bold;
            padding: 0px 0px 0px 5px;
            margin: 0px;
            color: #225D6D;
            border-top: 1px dotted black;
            border-bottom: 1px dotted black;}
</style>


            <div id='intergen' class='informations'>
                <h3>Intergénérationnel</h3>
                <table>
                    <tr>
                        <th>Intergénérationnel :</th> <td><?php echo \$logement->getIntergen() ?></td>
                    </tr>
                </table>
            </div>

            <div id='infos' class='informations'>
                <h3>Informations logement</h3>
                <table>
                    <tr>
                        <th>Bâtiment :</th> <td><?php echo \$logement->Parclogement->getBatiment() ?></td>
                    </tr>
                    <tr>
                        <th>Taille :</th> <td><?php echo \$logement->getTaille() ?></td>
                    </tr>
                    <tr>
                        <th>Type :</th> <td><?php echo \$logement->getTypelog() ?></td>
                    </tr>
                    <tr>
                        <th>Surface habitable :</th> <td><?php if(\$logement->getSurfacehab() == 0){ echo 'Non Spécifié';} else {echo \$logement->getSurfacehab(). " m²";} ?></td>
                    </tr>
                    <tr>
                        <th>Chauffage :</th> <td><?php echo \$logement->getChauffage() ?></td>
                    </tr>
                    <tr>
                        <th>Ascenseur :</th> <td><?php echo \$logement->getAscenseur() ?></td>
                    </tr>
                </table>
            </div>

            <div id='handicap' class='informations'>
                <h3>Infrastructures handicapés</h3>
                <table>
                    <tr>
                        <th>Immeuble accessible :</th> <td><?php echo \$logement->getAccessibl() ?></td>
                    </tr>
                    <tr>
                        <th>Ascenceur accessible :</th> <td><?php echo \$logement->getAscenseuracc() ?></td>
                    </tr>
                    <tr>
                        <th>Logement adaptable :</th> <td><?php echo \$logement->getAdaptable() ?></td>
                    </tr>
                    <tr>
                        <th>Logement adapté :</th> <td><?php echo \$logement->getAdapte() ?></td>
                    </tr>
                </table>
            </div>

EOF;

    //create new PDF document (document units are set by default to millimeters)
    $pdf = new sfTCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true);

    // set document information
    $pdf->SetCreator(PDF_CREATOR);
    $pdf->SetAuthor(PDF_AUTHOR);
    $pdf->SetTitle($doc_title);

    //set default header data
    $pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE, PDF_HEADER_STRING);

    //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 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);

    // Fixe la taille de la page
    $pdf->SetDisplayMode(90);

    //initialize document
    $pdf->SetFont('helvetica', '', 10);
    $pdf->AddPage();

    // output some HTML code


    $pdf->writeHTML($html , true, false, true, false, '');

    //reset pointer to the last page
    $pdf->lastPage();  

    // Close and output PDF document
    $pdf->Output('fichelogement.pdf', 'I');

    // Stop symfony process
    throw new sfStopException();
38
Elorfin

En premier lieu, vous devez noter que PDF et HTML et différents formats qui n'ont presque rien en commun. Si TCPDF vous permet de fournir des données d'entrée en HTML et CSS, c'est parce qu'il implémente un analyseur simple pour ces deux langues et essaie de comprendre comment traduire cela en PDF. Il est donc logique que TCPDF ne prenne en charge qu'un petit sous-ensemble des spécifications HTML et CSS et, même dans les éléments pris en charge, ce n'est probablement pas aussi parfait que dans les navigateurs Web de première classe .

Cela dit, la question est: qu'est-ce qui est pris en charge et qu'est-ce qui ne l'est pas? La documentation ignore essentiellement le problème et vous permet d'apprécier la méthode d'essai et d'erreur.

En jetant un œil au code source, nous pouvons voir qu'il existe une méthode protégée appelée TCPDF::getHtmlDomArray() qui, entre autres, analyse les déclarations CSS. Je peux voir des trucs comme font-family, list-style-type ou text-indent mais il n'y a pas de margin ou padding pour autant que je puisse voir et, définitivement, il n'y a pas de float du tout.

Pour résumer: avec TCPDF, vous pouvez utiliser CSS pour certains formats de base . Si vous devez convertir du HTML au PDF, ce n'est pas le bon outil. (Si c'est le cas, puis-je suggérer wkhtmltopdf ?)

76
Álvaro González

TCPDF 5.9.010 (2010-10-27) - La prise en charge des propriétés CSS "border-spacing" et "padding" pour les tableaux a été ajoutée.

10
KotaKomputer

Les balises prises en charge sont: a, b, blockquote, br, dd, del, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, img, li, ol, p, pre, small, span, strong, sub, sup, table, tcpdf, td, th, thead, tr, tt, u, ul

Tous les attributs HTML doivent être mis entre guillemets

9
Rajkumar

J'ai récemment rencontré le même problème avec le travail TCPDF avec mon CSS. Jetez un œil au code ci-dessous. Cela a fonctionné pour moi après avoir changé le CSS standard en un format PHP comprendrait

Exemple de code ci-dessous

$table = '<table width="100%" cellspacing="0" cellpadding="55%">
          <tr valign="bottom">
                <td class="header1" rowspan="2" align="center" valign="middle"
                      width="6%">Category</td>
                <td class="header1" rowspan="2" align="center" valign="middle"
                      width="26%">Project Description</td>
          </tr></table>';
8
dschnizzy

Au moment où j'écris ceci, TCPDF ne prend en charge que le remplissage des tables.

Lien vers leur page de forum avec ces informations

5

TCPDF 6.2.11 (2015-08-02)

Certaines choses ne fonctionneront pas lorsqu'elles sont incluses dans <style> tags, mais ils seront ajoutés dans un style="" attribut dans la balise HTML. Par exemple. remplissage de la table - cela ne fonctionne pas fonctionne:

table {
    padding: 5px;
}

Ceci fait:

<table style="padding: 5px;">
5
William Turrell

Depuis la version 5.7, TCPDF prend en charge les bordures CSS. Les marges, le remplissage et le flottant ne sont pas encore pris en charge. Consultez le site Web de TCPDF à http://www.tcpdf.org et consultez le forum officiel pour plus d'informations.

4
user412934

J'ai récemment rencontré le même problème et trouvé une solution de contournement, mais elle ne sera utile que si vous pouvez modifier le code html en conséquence.

J'ai utilisé des tableaux pour réaliser ma disposition rembourrée, donc pour créer l'équivalent d'un div avec un rembourrage interne, j'ai fait un tableau avec 3 colonnes/3 lignes et j'ai mis le contenu dans la ligne/colonne centrale. Les première et dernière colonnes/lignes sont utilisées pour le remplissage.

par exemple.

<table>
<tr>
    <td width="10">&nbsp;</td>
    <td>&nbsp;</td>
    <td width="10">&nbsp;</td>
</tr>
<tr>
    <td>&nbsp;</td>
    <td>content goes here</td>
    <td>&nbsp;</td>
</tr>
<tr>
    <td width="10">&nbsp;</td>
    <td>&nbsp;</td>
    <td width="10">&nbsp;</td>
</tr>
</table>

J'espère que ça t'as aidé.

Joe

3
Joe

Juste une petite astuce pour définir un rembourrage personnalisé sans éléments de table supplémentaires. Utilisez simplement cette façon, cela fonctionne (TCPDF 6.2.11)

<table border="0" style="padding-left: 10px; padding-bottom: 15px;">
<tr>
<td style="border: 1px solid grey;"> One two three </td>
<td style="border: 1px solid grey;"> Four five six </td>
</tr>
</table>
1
Alexander Fedorov

Salut, je voulais juste partager que j'ai trouvé ceci:
//Supprimer les marges inférieure et supérieure de la balise

$ tagvs = array ('p' => array (0 => array ('h' => 0, 'n' => 0), 1 => array ('h' => 0, 'n' => 0 ))); $ pdf-> setHtmlVSpace ($ tagvs);

ici: https://tcpdf.org/examples/example_061/

et l'utiliser pour supprimer les propriétés des balises 'p' (en bas et en haut) puis positionner le texte 'p' à l'intérieur d'une cellule en utilisant

1
Domingo