TCPDFフルページテーブル


11

写真に示すように、テーブルをページ(A4)に合うようにさまざまな方法で試しました。多くの ここに画像の説明を入力してください 検索を行いましたが、Webで役立つものを見つけることができませんでした。私は動的テーブルを使用していますが、テーブルの幅以外はすべて問題ありません。これが私のコードです:

$content = '<table><thead><tr><th class="bg-dark text-white" align="center">#</th><th align="center" class="bg-dark text-white">Code</th><th align="left" class="bg-dark text-white">Description</th><th align="center" class="bg-dark text-white">Item Type</th></tr></thead><tbody><tr style="background-color: #f2f2f2;"><td align="center">1</td><td align="center">1001</td><td align="left">Pofak</td><td align="center">Fixed Price</td></tr><tr ><td align="center">2</td><td align="center">1002</td><td align="left">Ice</td><td align="center">Weight</td></tr><tr style="background-color: #f2f2f2;"><td align="center">3</td><td align="center">1003</td><td align="left">Minoo</td><td align="center">Fixed Price</td></tr><tr ><td align="center">4</td><td align="center">1004</td><td align="left">Bastani</td><td align="center">Fixed Price</td></tr><tr style="background-color: #f2f2f2;"><td align="center">5</td><td align="center">1005</td><td align="left">Chocolate</td><td align="center">Weight</td></tr><tr ><td align="center">6</td><td align="center">1006</td><td align="left">Brush</td><td align="center">Fixed Price</td></tr><tr style="background-color: #f2f2f2;"><td align="center">7</td><td align="center">1007</td><td align="left">Apple</td><td align="center">Weight</td></tr><tr ><td align="center">8</td><td align="center">1008</td><td align="left">Water</td><td align="center">Fixed Price</td></tr><tr style="background-color: #f2f2f2;"><td align="center">9</td><td align="center">1009</td><td align="left">Cleaner</td><td align="center">Fixed Price</td></tr><tr ><td align="center">10</td><td align="center">1001</td><td align="left">Pofak</td><td align="center">Fixed Price</td></tr><tr style="background-color: #f2f2f2;"><td align="center">11</td><td align="center">1002</td><td align="left">Ice</td><td align="center">Weight</td></tr><tr ><td align="center">12</td><td align="center">1003</td><td align="left">Minoo</td><td align="center">Fixed Price</td></tr><tr style="background-color: #f2f2f2;"><td align="center">13</td><td align="center">1004</td><td align="left">Bastani</td><td align="center">Fixed Price</td></tr><tr ><td align="center">14</td><td align="center">1005</td><td align="left">Chocolate</td><td align="center">Weight</td></tr><tr style="background-color: #f2f2f2;"><td align="center">15</td><td align="center">1006</td><td align="left">Brush</td><td align="center">Fixed Price</td></tr></tbody></table>';
$newContent = '
    <style type="text/css">
    table{width:100%;}
    table, table td, table th{
        border-collapse: collapse;
        border: solid 1px #ababab;
    }
    .text-dark, table td{
        color: #343a40;
    }
    .text-white{
        color: #ffffff;
    }
    table td,
    table th {
        font-size: 11px;
        padding: 3px;
        line-height: 1.2;
        font-family:arial;
    }

    .bg-dark {
        background-color: #343a40;
    }
    .bg-secondary {
        background-color: #6c757d;
    }
    .bg-white {
        background-color: #ffffff;
    }
    .text-left {
        text-align: left;
    }
    .text-right {
        text-align: right;
    }
    .text-center {
        text-align: center;
    }
    </style>
    ';
    $newContent .= '<page>'.$content.'</page>';

    try {
        $html2pdf = new Html2Pdf('P', 'A4', 'en', true, 'UTF-8', 5);
        $html2pdf->pdf->SetDisplayMode('real');
        $html2pdf->writeHTML($newContent);
        $PDFName = "ItemLists_".date('Y.m.d_H.i.s').".pdf";
        $html2pdf->output($PDFName, 'I');
    } catch (Html2PdfException $x) {
        $html2pdf->clean();

        $formatter = new ExceptionFormatter($x);
        echo $formatter->getHtmlMessage();
    }

どうもありがとう


これは実際にはHtml2PDFライブラリのバグです。潜在的な回避策を検討しています。
EPB

ところで、Html2PDFが独自のHTMLパーサーを使用していることは注目に値します。style="width: 100%"正しく変換された幅をMMに格納します(ただし、width属性はそうではありません!)ただし、Html2PDFは、テーブルのレンダリング中に実際に使用しないようです。
EPB

回答:


4

Html2PDFは、TCPDFのHTMLパーサー/レンダーシステムを使用しません。それはそれ自身を実装し、その実装は列を自動的に拡大してスペースの100%を埋めることはありません。

そのため、Html2PDFでは、テーブルに100%の幅を設定する必要があるだけでなく、各セルにパーセント幅を設定する必要があります。(そしてwidth、Html2PDF の属性の奇妙な動作のため、CSSを使用して幅を設定します。)

TCPDFのネイティブwriteHTMLは、それ以外の仕様がない場合、各列を同じ幅に設定します。(たとえば、4列のテーブルにはすべてのセルが25%で表示されます)ただし、使用しているCSSをサポートしていないため、そのルートに進むにはマークアップを少し調整する必要があります。

Html2PDFのこの基本的な動作を模倣するには、同等の幅をセルに明示的に追加するだけです。たとえば、table td, table thスタイルルールに幅の指定を追加します。

以下は、4列のテーブルに対する次のCSSルールの例です。

table { width: 100%; }
table th, table td { width: 25%; }

もちろん、コンテンツに合わせて幅を指定するのが最適です。

同等の列の例


更新

の潜在的に有用なクラスの作成にいくらかつながるので、TCPDFについてのいくつかの議論は残しておきHtml2pdfます。TCPDFには、文字列の長さを測定するいくつかの便利な方法があります。列内の文字列のサイズを測定する場合は、独自の自動列サイザーを作成できます。

https://github.com/b65sol/random-classesの githubで概念実証クラスを作成しました

まず、クラスを使用してHTMLの構築を仲介します。これにより、幅を設定するための列クラスが追加され、測定対象のコンテンツを抽出するためにHTMLを解析する必要がなくなります。

次に、列幅を選択するための戦略を選択する必要があります。たとえば、以下のデモは列を測定し、最長の単語に基づいて各列の最小幅の割合を見つけます。(ワードブレイクを回避します)次に、最長の単語と最長の完全なセルコンテンツの違いに基づいて、余分なスペースを比例的に配分します。これは概念実証であるため、このプロダクションの準備はできていませんが、あなた(または他の検索者)が有用な出発点となることを期待しています。

以下の重要な部分はこれです: $tablebuilder->determine_column_widths_by_minimum_strategy('100%', 'aaa')

最初のパラメーターは、私たちが使用しているサイズ参照(測定を有効にするためにこれが必要なため、ページの100%)を提供し、2番目のパラメーターは、テキストスタイルとテーブルを考慮して測定に追加するいくつかの事前設定されたパディング文字を提供しますパディングの違い。

これが実行中のデモです:https : //b65sol.com/so/59517311_new.php

クラス自体はここから入手できます:https : //github.com/b65sol/random-classes

そのデモのコードは次のとおりです。

<?php
require 'vendor/autoload.php';
include 'random-classes/html2pdf-full-table-optimizer.php';
use Spipu\Html2Pdf\Html2Pdf;

//First let's build a random table!
$wordlist = ['Chocolate', 'Cake', 'Brownies', 'Cupcakes', 'Coreshock', 'Battery', 'Lead', 'Acid', 'Remilia'];
$wordlist2 = ['Reinforcement Learning', 'Initial Latent Vectors', 'Bag-of-Words', 'Multilayer Perceptron Classifier',
  'Deconvolutional Neural Network', 'Convolutional Neural Network'];
$number_of_columns = rand(3,11);
$number_of_rows = rand(8, 15);
$possible_column_names = ['Unit', 'Description', 'Variable', 'Moon', 'Cheese', 'Lollipop', 'Orange', 'Gir', 'Gaz', 'Zim', 'Dib'];
$possible_column_content_generators = [
  function() {return rand(10,100); },
  function() {return rand(1000, 1999); },
  function() use ($wordlist) {return $wordlist[rand(0, count($wordlist)-1)]; },
  function() use ($wordlist) {return $wordlist[rand(0, count($wordlist)-1)] . ' '. $wordlist[rand(0, count($wordlist)-1)];},
  function() use ($wordlist2) {return $wordlist2[rand(0, count($wordlist2)-1)];},
];

shuffle($possible_column_names);
$list_of_generators = [];
$column_classes = [];
$column_names = [];
for($i = 0; $i < $number_of_columns; $i++) {
  $list_of_generators[$i] = $possible_column_content_generators[rand(0, count($possible_column_content_generators)-1)];
  $column_classes[$i] = ['text-left', 'text-right', 'text-center'][rand(0,2)];
  $column_names[$i] = $possible_column_names[$i];
}
//Got our random stuff, onward to generator!

try {
    $html2pdf = new Html2Pdf('P', 'A4', 'en', true, 'UTF-8', 5);
    $html2pdf->pdf->SetDisplayMode('real');
    $tablebuilder = new Html2PdfTableOptimizer($html2pdf->pdf, '11px', 'helvetica');

    //run table builder... using random data for testing.
    for($i = 0; $i < $number_of_columns; $i++) {
      /*Add a header cell, content is the first parameter, CSS class attribute is second.*/
      $tablebuilder->add_header_cell($column_names[$i], $column_classes[$i] . ' bg-dark text-white');
    }

    for($i = 0; $i < $number_of_rows; $i++) {
      //Start a row.
      $tablebuilder->start_data_row();
      for($col = 0; $col < $number_of_columns; $col++) {
        //Add content and our column classes for td elements
        $tablebuilder->add_data_row_cell($list_of_generators[$col](), $column_classes[$col]);
      }
      //End the row.
      $tablebuilder->end_data_row();
    }
    //Get the table HTML.
    $render = $tablebuilder->render_html();

    $newContent = '
      <style type="text/css">
      table{width:100%;}
      table, table td, table th{
          border-collapse: collapse;
          border: solid 1px #ababab;
      }
      .text-dark, table td{
          color: #343a40;
      }
      .text-white{
          color: #ffffff;
      }
      table td,
      table th {
          font-size: 11px;
          padding: 3px;
          line-height: 1.2;
          font-family:arial;
      }

      .bg-dark {
          background-color: #343a40;
      }
      .bg-secondary {
          background-color: #6c757d;
      }
      .bg-white {
          background-color: #ffffff;
      }
      .row-even {
        background-color: #d1d1d1;
      }
      .text-left {
          text-align: left;
      }
      .text-right {
          text-align: right;
      }
      .text-center {
          text-align: center;
      }

      '.$tablebuilder->determine_column_widths_by_minimum_strategy('100%', 'aaa').'

      </style>
      ';
      $newContent .= '<page>'.$render.'</page>';

      if(!empty($_GET['html'])) {
        echo $newContent;
      } else {
        $html2pdf->writeHTML($newContent);
        $PDFName = "ItemLists_".date('Y.m.d_H.i.s').".pdf";
        $html2pdf->output($PDFName, 'I');
      }
} catch (Html2PdfException $x) {
    $html2pdf->clean();

    $formatter = new ExceptionFormatter($x);
    echo $formatter->getHtmlMessage();
}

更新の終わり


幅を明示的に指定したくない場合はwriteHTMLHtml2PDFライブラリを使用する代わりにTCPDFを使用することもできますが、同じサイズの列を使用するだけです。1つまたは2つだけ指定した場合、実際には列サイズの再計算が行われると思っていましたが、これは誤りでした。さらに、TCPDFには同じ制限がいくつかありHtml2PDFます。1つの列のサイズを指定しても、他の列のサイズが自動的に調整されないためです。

また、ブラウザのように列をコンテンツに合わせてサイズ変更することもありません。これを実際に実行するのはかなり難しいので、TCPDFがそれを試さないのも当然です。潜在的に手間がかからないソリューションは、列にサイズ「プロポーション」のタグを付け、選択された各比例サイズの列の数に応じて、その場で幅を計算することです。(たとえば、数値列は「小さい」ため、説明列は「大きい」ため、2つの小さい列がそれぞれ10%で、1つの説明が80%で分割されます。2つの小さい列が5%で、大きい列が45%です。それぞれ。いくつかの実験が必要になります。)


あなたの時間のおかげで、問題は私が動的テーブルを使用していることですユーザーが選択できる10列、多分5列または8列または多分2列はオプションです私がそれを行う別の方法があります:table th, table td { <?=floor(100 / count($cols))?>%;}しかし、私はより良い解決策を探しています
Mohsen Newtoa

1
Html2PDFあなたはどのように取り組んでいますか?私が読んだコードと例はすべて、これが唯一の方法であることを示唆しています。TCPDFは、CSSの解析能力がやや劣りますが、レイアウトシステムが優れています。ストレートTCPDFのマークアップを提案できます。
EPB

TCPDFを試してみたところ、同じ方法を使用していることに気付きましたが、それでも問題は解決しません。1つのセルを変更すると、他のセルに影響し、テーブルの幅がページに収まりません。 TCPDFとHTML2PDFの違いは、TCPDFが私のようにデフォルトのテーブルサイズを使用していることですtable th, table td { <?=floor(100 / count($cols))?>%;}
Mohsen Newtoa

確かに、それも私が遭遇した問題です。私は思った(ない理想的には少しの努力と合理的に素敵になりながら)それは私がちょうど特定のもののサイズを指定することができ、私は私のテストを設定するときに、残りを自動調整しますが、それはしていません...すべてで。もう少し掘り下げて、列のサイズを自動調整する簡単な方法があるかどうかを確認します。どちらHtml2PDFでもない、またはTCPDF箱から出してそれを行うように見えない場合でも、それはある種の前処理でなければなりません。
EPB

更新が通知されるかどうかはわかりませんが、内容に基づいてテキストベースのテーブルのサイズを動的に変更するクラスを追加しました。determine_column_widths_evenlyいくつかの既知のサイズを指定して、残りのスペースを均等に分散させるという方法もあります。
EPB

0

PDFのサーバー側での作業は、CSSには適していません。HTMLだけを使用してみましたか?

例えば:

<table width="100%">
  <!-- your table code -->
</table>

または、次のことを試すこともできます。

<table style="width: 100%;">
  <!-- your table code -->
</table>

これがブラウザでのこの動作を示すCodePenです。https://codepen.io/tinacious/pen/PowJRbb


私はこれらすべてを試しました<table width="100%"> <table style="width:100%;"> <table class="w100"> <link rel="stylesheet" href="style.css" />が、問題はhtmlで正常に動作することですが、PDFとして保存したい場合は、図のようになります。
Mohsen Newtoa

0

絵: ここに画像の説明を入力してください

このタイプのテーブルの最良の方法は、この方法を使用することだと思います。

table th, table td { width:<?=floor(100 / count($cols))?>%;}

TCPDFでは、彼らは特別なことを何もしていません。テーブルはとにかくページに収まりません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.