18

PDFの印刷に使用されるコードは次のとおりです。

class MYPDF extends TCPDF {

    // Load table data from file
    public function LoadData($file) {
        // Read file lines
        $lines = file($file);
        $data = array();
        foreach($lines as $line) {
            $data[] = explode(';', chop($line));
        }
        return $data;
    }

    // Colored table
    public function ColoredTable($header,$data) {
        // Colors, line width and bold font
        $this->SetFillColor(233, 136, 64);
        $this->SetTextColor(255);
        $this->SetDrawColor(128, 0, 0);
        $this->SetLineWidth(0.3);
        $this->SetFont('', 'B');
        // Header
        $w = array(10, 40, 20, 20, 20, 20, 20);
        $num_headers = count($header);
        for($i = 0; $i < $num_headers; ++$i) {
            $this->Cell($w[$i], 7, $header[$i], 1, 0, 'C', 1);
        }
        $this->Ln();
        // Color and font restoration
        $this->SetFillColor(224, 235, 255);
        $this->SetTextColor(0);
        $this->SetFont('');
        // Data
        $fill = 0;
        foreach($data as $row) {
            $this->Cell($w[0], 6, $row[0], 'LR', 0, 'C', $fill);
            $this->Cell($w[1], 6, $row[1], 'LR', 0, 'L', $fill);
            $this->Cell($w[2], 6, $row[2], 'LR', 0, 'C', $fill);
            $this->Cell($w[3], 6, $row[3], 'LR', 0, 'C', $fill);
            $this->Cell($w[4], 6, $row[4], 'LR', 0, 'C', $fill);
            $this->Cell($w[5], 6, $row[5], 'LR', 0, 'C', $fill);
            $this->Cell($w[6], 6, $row[6], 'LR', 0, 'C', $fill);
            $this->Ln();
            $fill=!$fill;
        }
        $this->Cell(array_sum($w), 0, '', 'T');
    }
}

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

// set document information
$pdf->SetCreator(PDF_CREATOR);
$pdf->SetAuthor('Nicola Asuni');
$pdf->SetTitle('TCPDF Example 011');
$pdf->SetSubject('TCPDF Tutorial');
$pdf->SetKeywords('TCPDF, PDF, example, test, guide');

// set default header data
$pdf->SetHeaderData(PDF_GYANKUTIR_LOGO, PDF_HEADER_LOGO_WIDTH, 'GyanKutir', 
'Jhunjhunu International Wisdom City
Near Khemi Shakti Temple
Jhunjhunu (Rajasthan)-333001');

// 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(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 image scale factor
$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);

//set some language-dependent strings
$pdf->setLanguageArray($l);

// ---------------------------------------------------------

// set font
$pdf->SetFont('helvetica', '', 6);

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

//Column titles
$header = array('Rank', 'Student', 'Time Used', 'Correct Answers', 'Wrong Answers','Questions Skipped','Final Score');


$final_data = $smarty->fetch($file_to_show);

$file = fopen("text.txt","w+");

    file_put_contents($file,"");
    fwrite($file,$final_data);
    fclose($file);

ob_start();
        ob_flush();
//Data loading
$data = $pdf->LoadData('text.txt');

// print colored table
$pdf->ColoredTable($header, $data);

// ---------------------------------------------------------
 ob_flush();
//Close and output PDF document
$pdf->Output('example_011.pdf', 'I');

//============================================================+
// END OF FILE                                                
//============================================================+

各ページのテーブル列に見出しを追加したいと思います。スクリーンショットはこの質問に添付されています。最初のスクリーンショットでは見出しが表示されていますが、2番目のスクリーンショットでは表示されていません。これらの列見出しを後続のページに表示するにはどうすればよいですか?この問題を解決するために私を助けてください。事前に感謝します。この画像はPDF形式の表の最初のページです。これは、適切な見出しが付いた表の最初のページですこれは、最初のページの時点で見出しが表示されるテーブルの2番目のページです。

4

5 に答える 5

52

もう1つの方法は、htmlでTHEADタグを使用することです。

<table>
<thead>
    <tr><th>Heading</th></tr>
</thead>
<tbody>
    <tr><td>Many rows...</td></tr>
    <tr><td>of data</td></tr>
</tbody>
</table>

TCPDFはすべてのページで見出しを繰り返しているようです。

于 2013-08-27T13:14:40.623 に答える
13

2つの方法が思い浮かびます。

方法1:各ページにヘッダーセルを自動的に追加する独自のカスタムヘッダー関数(TCPDFの例3など)を作成します。このシナリオでは、ヘッダーセル配置コードをHeaderクラスのメソッドに移動し、ページ上の固定位置にヘッダーを描画します。新しいページが追加されるとメソッドが自動的に呼び出されるためHeader、ページが作成されるとすぐにテーブルヘッダーが追加されます。これは確かに方法2よりも高速で集中力がありませんが、少し注意が必要です。

方法2:TCPDFトランザクションを使用して、行がページを分割しようとしていることを検出してから、ロールバックします。その後、あなたはAddPage自分自身になります。ヘッダーを再度描画します。表示を続けます。これを行うには、行を作成する前のページ数を取得し、それを後のページ数と比較します。提供されているように、この方法でそれを行う方法の例:

    //Separated Header Drawing into it's own function for reuse.
    public function DrawHeader($header, $w) {
        // Colors, line width and bold font
        // Header
        $this->SetFillColor(233, 136, 64);
        $this->SetTextColor(255);
        $this->SetDrawColor(128, 0, 0);
        $this->SetLineWidth(0.3);
        $this->SetFont('', 'B');        
        $num_headers = count($header);
        for($i = 0; $i < $num_headers; ++$i) {
            $this->Cell($w[$i], 7, $header[$i], 1, 0, 'C', 1);
        }
        $this->Ln();
        // Color and font restoration
        $this->SetFillColor(224, 235, 255);
        $this->SetTextColor(0);
        $this->SetFont('');
    }

    // Colored table
    public function ColoredTable($header,$data) {
        $w = array(10, 40, 20, 20, 20, 20, 20);
        $this->DrawHeader($header, $w);

        // Data
        $fill = 0;
        foreach($data as $row) {
            //Get current number of pages.
            $num_pages = $this->getNumPages();
            $this->startTransaction();
            $this->Cell($w[0], 6, $row[0], 'LR', 0, 'C', $fill);
            $this->Cell($w[1], 6, $row[1], 'LR', 0, 'L', $fill);
            $this->Cell($w[2], 6, $row[2], 'LR', 0, 'C', $fill);
            $this->Cell($w[3], 6, $row[3], 'LR', 0, 'C', $fill);
            $this->Cell($w[4], 6, $row[4], 'LR', 0, 'C', $fill);
            $this->Cell($w[5], 6, $row[5], 'LR', 0, 'C', $fill);
            $this->Cell($w[6], 6, $row[6], 'LR', 0, 'C', $fill);
            $this->Ln();
            //If old number of pages is less than the new number of pages,
            //we hit an automatic page break, and need to rollback.
            if($num_pages < $this->getNumPages())
            {
                //Undo adding the row.
                $this->rollbackTransaction(true);
                //Adds a bottom line onto the current page. 
                //Note: May cause page break itself.
                $this->Cell(array_sum($w), 0, '', 'T');
                //Add a new page.
                $this->AddPage();
                //Draw the header.
                $this->DrawHeader($header, $w);
                //Re-do the row.
                $this->Cell($w[0], 6, $row[0], 'LR', 0, 'C', $fill);
                $this->Cell($w[1], 6, $row[1], 'LR', 0, 'L', $fill);
                $this->Cell($w[2], 6, $row[2], 'LR', 0, 'C', $fill);
                $this->Cell($w[3], 6, $row[3], 'LR', 0, 'C', $fill);
                $this->Cell($w[4], 6, $row[4], 'LR', 0, 'C', $fill);
                $this->Cell($w[5], 6, $row[5], 'LR', 0, 'C', $fill);
                $this->Cell($w[6], 6, $row[6], 'LR', 0, 'C', $fill);
                $this->Ln();
            }
            else
            {
                //Otherwise we are fine with this row, discard undo history.
                $this->commitTransaction();
            }
            $fill=!$fill;
        }
        $this->Cell(array_sum($w), 0, '', 'T');
    }
于 2013-04-21T09:50:17.687 に答える
2

これは少し遅いかもしれませんが、各ページにヘッダーを付ける簡単な方法を思いつきました。カウントを取得し$data、関数を使用してarray_slice1ページ分のデータ行を入力します。テーブルを出力してから、次のページにループバックします。フォントサイズ9で1ページあたり54行を使用します。

//Data loading
$data = $pdf->LoadData('text.txt');
$datacount = count($data);
$i = 0;
while ($i < $datacount) {
    $dataout = array_slice($data, $i, 54, false);
    $pdf->AddPage();
    // print colored table      
    $pdf->ColoredTable($header, $dataout);
    $i = $i + 54;
}

于 2019-11-09T19:38:24.190 に答える
2

コメントを追加することは許可されていませんが、Spectoのソリューションにいくつかの情報を追加したいと思います。彼の解決策は確かにこれを達成するための最良/最も簡単な方法だと思いますが、page_breakの後、ヘッダーの下の最初の行が部分的に削除されるか、他の方法でセルの配置/幅などが壊れている可能性があります。私の調査結果の時点では、これは行の中央にあるテーブルの「破損」が原因です。この動作を防ぐnobr="true"には、行に追加します。

<table>
<thead>
    <tr><th>Heading</th></tr>
</thead>
<tbody>
    <tr nobr="true"><td>Many rows...</td></tr>
    <tr nobr="true"><td>of data</td></tr>
</tbody>
</table>
于 2020-06-22T17:13:04.733 に答える
0

EPBのメソッド2は私にとってはうまくいきましたが、少し変更して$ pdf-> startTransaction();を使用しました。$ this-> startTransaction();の代わりに 私のスクリプトはすでにそのようにフォーマットされていたので。

どうもありがとう!

于 2013-05-09T16:36:03.243 に答える