2010-08-04 43 views
34

Intento hacer un PDF escribiendo CSS y HTML pero mi CSS no aparece en mi PDF. Lo único que se considera es el tamaño de fuente y el color de fuente.TCPDF no representa todas las propiedades de CSS

les dejo el código (lo siento, es un poco largo ...)

$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(); 
+0

Sé que esto es una muy antigua pregunta. Sin embargo, sigue siendo relevante, ya que acabo de contentarme con el mismo problema. Una posible solución en lugar de tratar de usar relleno/margen, es usar altura de línea y sangría de texto en su lugar. – Doug

Respuesta

71

En primer lugar, debe tener en cuenta que los PDF y HTML y formatos diferentes que apenas tienen nada en común. Si TCPDF le permite proporcionar datos de entrada usando HTML y CSS es porque implementa un analizador simple para estos dos idiomas e intenta descubrir cómo traducirlo a PDF. Por lo tanto, es lógico que TCPDF solo admita un pequeño subconjunto de la especificación de HTML y CSS, e incluso en material compatible, probablemente no sea tan perfecto como en los navegadores web de primera clase.

Dijo que, la pregunta es: ¿qué es compatible y qué no? La documentación básicamente omite el problema y le permite disfrutar del método de prueba y error.

Si echamos un vistazo al código fuente, podemos ver que hay un método protegido llamado TCPDF::getHtmlDomArray() que, entre otras cosas, analiza las declaraciones de CSS. Puedo ver cosas como font-family, list-style-type o text-indent pero no hay margin o padding por lo que puedo ver y, definitivamente, no hay float en absoluto.

En resumen: con TCPDF, puede usar CSS para algunos formato básico. Si necesita convertir de HTML a PDF, es la herramienta incorrecta. (Si ese es el caso, ¿puedo sugerir wkhtmltopdf?)

+1

+1 para esta respuesta, hemos estado utilizando la función "writeHTMLCell" disponible en TCPDF, y los atributos de margen de CSS parecen ser ignorados por completo, sin embargo, cuando se agrega la celda HTML, hay parámetros que se pueden pasar que especifican absoluta o coordenadas relativas. –

+0

FYI, esta respuesta está desactualizada. No sé exactamente qué es compatible y qué no, pero sé que en las etiquetas '

' puede establecer el relleno. No funciona en ' – Atara

10

TCPDF 5.9.010 (2010-10-27) - se añadieron soporte para las propiedades CSS 'border-spacing' y 'padding' para las tablas.

8

Recientemente me encontré con el mismo problema al tener el TCPDF trabajar con mi CSS. Eche un vistazo al código a continuación. Funcionó para mí después de cambiar el CSS estándar para un formato PHP entendería

ejemplo de código

$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>'; 
+2

O podría haber usado comillas simples en lugar de escapar de las comillas dobles. – FastTrack

+8

Es curioso que lo menciones. He estado usando una versión anterior de TCPDF en un proyecto (5.9.104 (2011-08-01)). Esto tal vez solo sea relevante para esta versión y para las anteriores, pero las citas de HTML ** ** deben ser comillas dobles cuando se escriben en una celda TCPDF que admite HTML.De lo contrario, el atributo simplemente se ignora. –

8

etiquetas soportados son: a, b, blockquote, br, dd, del, div, dl, dt, em, fuente, h1, h2, h3, h4, h5, h6, hr, i , img, li, ol, p, pre, pequeño, palmo,, submarino, sup, mesa, TCPDF, TD, TH, THEAD, TR, tt, u, ul

Todos los atributos HTML fuerte debe estar encerrado entre comillas dobles

4

TCPDF 6.2.11 (08/02/2015)

Algunas cosas no funcionarán cuando se incluyen dentro de las etiquetas <style>, sin embargo, si se agregan en un atributo style="" en la etiqueta HTML. P.ej. relleno de mesa - este no lo hace trabajo:

table { 
    padding: 5px; 
} 

este hace:

<table style="padding: 5px;"> 
1

Sólo un pequeño consejo para fijar el relleno personalizada sin elementos de tabla adicionales. sólo tiene que utilizar de esta manera, funciona (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> 
+0

Tenga en cuenta que si usa CSS de relleno, tampoco puede incluir 'cellpadding =" 0 "cellspacing =" 0 "' en su etiqueta '

' por algún motivo, por lo que tendrá que realizar muchos ajustes con tablas. – Gavin

4

Desde la versión 5.7 TCPDF incluye soporte para bordes CSS. Los márgenes, el relleno y el flotante aún no son compatibles. Consulte el sitio web de TCPDF en http://www.tcpdf.org y consulte el foro oficial para obtener más información.

3

Recientemente me encontré con el mismo problema y encontré una solución, aunque solo será útil si puede cambiar el código html para que se adapte.

Usé tablas para lograr mi diseño acolchado, así que para crear el equivalente de un div con relleno interno hice una tabla con 3 columnas/3 filas y coloqué el contenido en la fila/columna central. La primera y la última columna/filas se usan para el relleno.

por ejemplo.

<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> 

Espero que ayude.

Joe

+0

para relleno superior \ inferior, agregué

 
', o que anularán el CSS. – Gavin

1

Hola yo sólo quería compartir que he encontrado esto:
// inferior Retire la etiqueta y márgenes superiores

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

aquí: https://tcpdf.org/examples/example_061/

y utilizarlo para eliminar 'p' etiquetas propiedades (inferior y superior) y luego colocar el texto 'p' dentro de una celda usando

Cuestiones relacionadas