web-dev-qa-db-ja.com

TCPDF:HTMLの表と改ページ

次の図に示すように、大きなHTMLテーブルを作成していますが、改ページに問題があります。
enter image description here
問題を自動的に解決する方法はありますか?またはそれを行う方法は何ですか?

25
Koney

これを<tr>タグに追加してみてください:nobr="true"

したがって、簡単な例は次のとおりです。

<table>
    <tr nobr="true">
        <td>Test</td>
        <td>Test 2</td>
    </tr>
</table>

nobr="true"は、テーブルの行がバラバラになるのを防ぎます。これを<td>および<th>タグに配置することもできます。

68
FastTrack

私はそれがかなり古い質問であることを知っていますが、今日同じ問題がありました、私のテーブルはページ間で分割され、FastTrackの答えからメソッドについて少し詳しく調べたところ、nobr="true"属性も<table> 鬼ごっこ。つまり、私にとってこのようなコードはこの問題を解決しました:

<table nobr="true">
    <tr>
        <td>Test</td>
        <td>Test 2</td>
    </tr>
</table>

警告-このコードは、テーブルが1ページより小さい場合にのみ意味があります。

9

ヘッダーが重複するという同じ問題がありました。私はyevgenyソリューションを試しましたが、それは私のPDFジェネレーターコードにいくつかのエディションを必要としました(私はFPDFで書かれたPDF出力がたくさんあり、TCPDFに移行するプロセスを最小限にしたかったです)このよりシンプルなソリューションを使用しました

class MYPDF extenfs TCPDF {
    //your initialization code
    function header(){
        //your code here

        //we change only the top margin and this executes for every header in every page, even the frst one
        $this->SetTopMargin($this->GetY());
    }
}
7

ロニー、ありがとうございました。HTMLを生成して、ページ2,3のヘッダーと重複するように記述します。

class your_PDF extends TCPDF
{
   var $top_margin = 20;

   function Header() {
       // set top margin to style pages 2, 3..
       //title goes here
       $this->top_margin = $this->GetY() + 5; // padding for second page
    }
}

あなたのコードで

// set top margin to style pages 2, 3..
$pdf->SetMargins(15, $pdf->top_margin, 15); 
2
yevgeny

興味のある人のために、次のようにしてください。それは魅力のように機能します:

$pdf->SetMargins(0, 0, 0);
$pdf->SetHeaderMargin(0);
$pdf->SetFooterMargin(0);
1
roney

奇妙なことに、ここで言及した解決策は私にとってはうまくいきませんでした。まあ、それは並べ替えを行いましたが、タグ内のコンテンツは(必要に応じて)繰り返されますが、行スパンされた場合、セルの上下にレイアウトの問題が発生します。私が実験したように、それはさらに悪化しました。

私の解決策は、エレガントではありませんが、AutoPageBreakをfalseに設定し、行インクリメンターカウンターを各行ごとにインクリメントして、特定の値を超えたかどうかをチェックすることでした。もしそうなら、私はテーブルを閉じ、addHTML()と呼ばれるwriteHTML()を使用し、それから続行し、新しいテーブル、ヘッダー、そしてすべてとして再構築しました。

私が言ったように、エレガントではないが、うまくいった。これが誰かを助けることを願っています...それはかなり明白な解決策ですが、実行は常にそれほど明白ではありません。また、特定の状況に適したより良い方法があるかもしれませんが、うまくいかない場合は試してみてください。 :)

1
David

いくつかのCSSが解決しました:

// Include the main TCPDF library (search for installation path).
require_once('tcpdf/tcpdf.php');

// create new PDF document
$pdf = new TCPDF('R', PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);

// set document information
$pdf->SetCreator(PDF_CREATOR);
$pdf->SetAuthor('Author');
$pdf->SetTitle('TCPDF HTML Table');
$pdf->SetSubject('TCPDF Tutorial');
$pdf->SetKeywords('TCPDF, PDF, html,table, example, test, guide');

// set default header data
$pdf->SetHeaderData('', '', ' HTML table', '');

// 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);
// set margins
$pdf->SetMargins(15, 15, 15);
$pdf->SetHeaderMargin(15);
$pdf->SetFooterMargin(15);

// set auto page breaks
$pdf->SetAutoPageBreak(TRUE, 15);

// set image scale factor
//$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
// ---------------------------------------------------------
// set font
$pdf->SetFont('times', '', 10);

// add a page
$pdf->AddPage();

$start = 1;
$end = 254;
$step = 1;

$arr = range($start, $end, $step);


$table_header .= sprintf("<tr><th>%s</th><th>%s</th><th>%s</th><th>%s</th></tr>", 'IP', 'Computer', 'User', 'Fone');

foreach ($arr as $ar) {
    $row[] = $ar;
}
foreach ($row as $r):
    if (($r % 40) === 0):
        $table_header;
    endif;
    $table .= sprintf("<tr>\n<td>%s</td>\n<td>%s</td>\n<td>%s</td>\n<td>%s</td>\n</tr>\n", $r, $r, $r, $r);
endforeach;

$now = date("d/m/Y");
$caption = "<caption>IP addresses <em>$now</em></caption>\n";
$n = "\n";

$tbl = <<<EOD
<style>
table{
    font-family: serif;
    font-size: 11pt;
}
table tr {

}
table tr td {
    padding:3px;
    border:#000000 solid 1px;
}
em {
    font-size: 4pt;
}
tr { white-space:nowrap; }
</style>

        <h1>{$caption}</h1>
        {$table_begin}
        {$table_header}
        {$table}
</table>
EOD;

$pdf->writeHTML($tbl, true, false, false, false, '');


// reset pointer to the last page
//$pdf->lastPage();
// ---------------------------------------------------------
//Close and output PDF document
$pdf->Output('html_table.pdf', 'I');

//============================================================+
// END OF FILE
//============================================================+
0
msmafra