TCPDF不呈现所有CSS属性

时间:2010-08-04 09:10:31

标签: css tcpdf

我尝试制作PDF编写CSS和HTML,但我的CSS没有出现在我的PDF中。唯一考虑的是字体大小和字体颜色。

我给你代码(抱歉,这有点长......)

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

10 个答案:

答案 0 :(得分:76)

首先,您应该注意PDF和HTML以及几乎没有任何共同点的不同格式。如果TCPDF允许您使用HTML和CSS提供输入数据,那是因为它为这两种语言实现了一个简单的解析器,并试图弄清楚如何将其转换为PDF。因此,TCPDF仅支持HTML和CSS规范的一小部分是合乎逻辑的,即使在支持的内容中,它也可能不如一流的Web浏览器那么完美。

说,问题是:支持什么,什么不支持?文档基本上跳过了这个问题,让你享受试错法。

看一下源代码,我们可以看到有一个名为TCPDF::getHtmlDomArray()的受保护方法,其中包括解析CSS声明。我可以看到font-familylist-style-typetext-indent之类的内容,但据我所见,我没有marginpadding,而且最终没有{float 1}}。

总结一下:使用TCPDF,您可以将CSS用于某些基本格式。如果您需要从HTML转换为PDF,那么这是错误的工具。 (如果是这种情况,我可以建议wkhtmltopdf吗?)

答案 1 :(得分:10)

TCPDF 5.9.010(2010-10-27) - 添加了对表格的CSS属性'border-spacing'和'padding'的支持。

答案 2 :(得分:8)

我最近遇到了TCPDF与我的CSS一起工作的问题。看看下面的代码。在我将标准CSS更改为PHP理解的格式后,它对我有用

下面的代码示例

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

答案 3 :(得分:8)

支持的标签是: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

  

所有HTML属性必须用双引号括起来

答案 4 :(得分:5)

在我写这篇文章时,TCPDF仅支持表的填充。

Link to their forum page with that information

答案 5 :(得分:5)

TCPDF 6.2.11(2015-08-02)

有些内容在包含在<style>代码中时无法使用,但是如果添加到HTML代码中的style=""属性中,它们就会被添加。例如。表填充 - 此工作:

table {
    padding: 5px;
}

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

答案 6 :(得分:4)

从版本5.7开始,TCPDF包括对CSS边框的支持。 边距,填充和浮动尚不支持。 查看TCPDF网站http://www.tcpdf.org并咨询官方论坛以获取更多信息。

答案 7 :(得分:3)

我最近遇到了同样的问题,并找到了一个解决方法,但只有在你可以改变html代码以适应时才会有用。

我使用表来实现我的填充布局,所以要创建一个带有内部填充的div的等价物,我创建了一个包含3列/ 3行的表,并将内容放在中心行/列中。第一列和最后一列/行用于填充。

例如

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

希望有所帮助。

答案 8 :(得分:1)

只是一个小技巧,用于设置自定义填充而无需额外的表格元素。 只需使用这种方式,它可以工作(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>

答案 9 :(得分:1)

您好,我想分享一下,我发现了这个:
// 删除标签底部和顶部边距

  

$ tagvs = array('p'=&gt; array(                               0 =&gt;数组('h'=&gt; 0,'n'=&gt; 0),                               1 =&gt;数组('h'=&gt; 0,'n'=&gt; 0)                              )               );   $ PDF-&GT; setHtmlVSpace($ tagvs);

在这里:https://tcpdf.org/examples/example_061/

并使用它删除'p'标签属性(底部和顶部),然后使用

将'p'文本放在单元格内