TCPDF 不呈现所有 CSS 属性

Posted

技术标签:

【中文标题】TCPDF 不呈现所有 CSS 属性【英文标题】:TCPDF not render all CSS properties 【发布时间】:2011-03-25 03:54:52 【问题描述】:

我尝试制作一个包含 CSS 和 html 的 PDF,但我的 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();

【问题讨论】:

我知道这是一个非常古老的问题。但是仍然相关,因为我不得不满足于同样的问题。一种可能的解决方案是使用 line-height 和 text-indent 代替尝试使用填充/边距。 【参考方案1】:

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

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

查看源代码,我们可以看到有一个名为 TCPDF::getHtmlDomArray() 的受保护方法,除其他外,它解析 CSS 声明。我可以看到font-familylist-style-typetext-indent 之类的东西,但据我所知,没有marginpadding,而且毫无疑问,根本没有float

总结一下:使用 TCPDF,您可以使用 CSS 进行一些基本格式设置。如果您需要从 HTML 转换为 PDF,那是错误的工具。 (如果是这样,我可以建议wkhtmltopdf吗?)

【讨论】:

+1 对于这个答案,我们一直在使用 TCPDF 中可用的“writeHTMLCell”函数,并且 CSS 边距属性似乎被完全忽略了,但是当附加 HTML 单元格时,有参数可以传递指定绝对坐标或相对坐标。 仅供参考,这个答案已经过时了。我不确切知道支持什么,不支持什么,但我知道在&lt;table&gt; 标签上你可以设置填充。由于某种原因,它在&lt;td&gt; 上不起作用,因此您将不得不用表格进行大量包装。【参考方案2】:

支持的标签有: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 属性必须用双引号括起来

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

我最近在使用我的 CSS 时遇到了同样的问题。看看下面的代码。在我将标准 CSS 更改为 PHP 可以理解的格式后,它对我有用

下面的代码示例

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

【讨论】:

或者您可以使用单引号而不是转义双引号。 有趣的是你应该提到这一点。我一直在一个项目(5.9.104(2011-08-01))中使用旧版本的 TCPDF。这可能只与这个版本和更早的版本有关,但是当写入支持 HTML 的 TCPDF 单元时,HTML 属性引号 必须 是双引号。否则,该属性将被忽略。【参考方案5】:

TCPD 6.2.11 (2015-08-02)

当包含在&lt;style&gt; 标记中时,有些东西将不起作用,但是如果将它们添加到 HTML 标记中的style="" 属性中,它们就会起作用。例如。表格填充 - 这不起作用

table 
    padding: 5px;

确实

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

【讨论】:

这应该是答案【参考方案6】:

在我写这篇文章的那一刻,TCPDF 只支持表格填充。

Link to their forum page with that information

【讨论】:

【参考方案7】:

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

【讨论】:

【参考方案8】:

我最近遇到了同样的问题,并找到了一种解决方法,尽管它只有在您可以更改 html 代码以适应时才有用。

我使用表格来实现我的填充布局,因此为了创建一个相当于带有内部填充的 div,我制作了一个 3 列/3 行的表格,并将内容放在中心行/列中。第一和最后一列/行用于填充。

例如。

<table>
<tr>
    <td >&nbsp;</td>
    <td>&nbsp;</td>
    <td >&nbsp;</td>
</tr>
<tr>
    <td>&nbsp;</td>
    <td>content goes here</td>
    <td>&nbsp;</td>
</tr>
<tr>
    <td >&nbsp;</td>
    <td>&nbsp;</td>
    <td >&nbsp;</td>
</tr>
</table>

希望对您有所帮助。

【讨论】:

对于顶部\底部填充,我添加了  【参考方案9】:

我发现了这个:

// Remove tag bottom and top margins

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

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

使用它来删除“p”标签属性(底部和顶部),然后将“p”文本放置在单元格内。

【讨论】:

【参考方案10】:

在没有额外表格元素的情况下设置自定义填充只是一个小技巧。 用这种方式就行了(TCPD 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>

【讨论】:

请记住,如果您使用填充 CSS,则不能在您的 &lt;table&gt; 标记中也包含 cellpadding="0" cellspacing="0",否则它们会覆盖 CSS。

以上是关于TCPDF 不呈现所有 CSS 属性的主要内容,如果未能解决你的问题,请参考以下文章

CSS transform-style属性实现3D效果

完全移除 CSS 属性

“aspNetDisabled”类在哪里定义,为啥 ASP.NET 会为它呈现干扰性的重复 CSS“类”属性?

css 图像呈现CSS属性向浏览器提供了关于它应该用于缩放图像的算法的提示(因此使它们成为l

css3透明度与过度属性

WebForm控件