TCPDF не отображает все свойства CSS - PullRequest
38 голосов
/ 04 августа 2010

Я пытаюсь создать 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 ]

76 голосов
/ 04 августа 2010

Прежде всего, вы должны заметить, что PDF и HTML и различные форматы вряд ли имеют что-то общее. Если TCPDF позволяет вам предоставлять входные данные с использованием HTML и CSS, это потому, что он реализует простой синтаксический анализатор для этих двух языков и пытается выяснить, как перевести это в PDF. Поэтому логично, что TCPDF поддерживает только небольшое подмножество спецификации HTML и CSS, и даже в поддерживаемых вещах он, вероятно, не так совершенен, как в первоклассных веб-браузерах.

Сказал, что вопрос в том, что поддерживается, а что нет? Документация в основном пропускает проблему и позволяет вам наслаждаться методом проб и ошибок.

Взглянув на исходный код, мы видим, что есть защищенный метод с именем TCPDF::getHtmlDomArray(), который, помимо прочего, анализирует объявления CSS. Я могу видеть такие вещи, как font-family, list-style-type или text-indent, но, насколько я вижу, нет margin или padding, и, определенно, float вообще нет.

Подводя итог: с помощью TCPDF вы можете использовать CSS для некоторого базового форматирования. Если вам нужно конвертировать из HTML в PDF, это не тот инструмент. (Если это так, могу ли я предложить wkhtmltopdf ?)

10 голосов
/ 03 января 2011

TCPDF 5.9.010 (2010-10-27) - Добавлена ​​поддержка CSS-свойств 'border-spacing' и 'padding' для таблиц.

9 голосов
/ 20 ноября 2013

Поддерживаемые теги: a, b, blockquote, br, dd, del, div, dl, dt, em, шрифт, 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 должны быть заключены в двойные кавычки

8 голосов
/ 14 апреля 2011

Недавно я столкнулся с той же проблемой, связанной с работой 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>';
5 голосов
/ 02 сентября 2015

TCPDF 6.2.11 (2015-08-02)

Некоторые вещи не будут работать, если включены в теги <style>, но будут, если они добавлены в style=""атрибут в теге HTML.Например, заполнение таблицы - это не работа:

table {
    padding: 5px;
}

Это делает :

<table style="padding: 5px;">
5 голосов
/ 08 октября 2013

На данный момент я пишу это, TCPDF поддерживает только заполнение для таблиц.

Ссылка на страницу своего форума с этой информацией

4 голосов
/ 06 августа 2010

Начиная с версии 5.7 TCPDF включает поддержку границ CSS. Поля, padding и float пока не поддерживаются. Посетите веб-сайт TCPDF по адресу http://www.tcpdf.org и обратитесь на официальный форум для получения дополнительной информации.

3 голосов
/ 13 октября 2010

Недавно я столкнулся с той же проблемой и нашел обходной путь, хотя он будет полезен только в том случае, если вы сможете изменить 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>

Надеюсь, это поможет.

Джо

1 голос
/ 15 сентября 2016

Привет, я просто хотел поделиться, что нашел это:
// Удалить нижние и верхние поля тега

$ 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 'текст внутри ячейки, используя

1 голос
/ 16 марта 2016

Просто небольшой совет по настройке пользовательского заполнения без дополнительных элементов таблицы.Просто используйте этот способ, он работает (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>
...