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                                                
//============================================================+

我想将标题添加到每一页的表格列中。这个问题附有截图。在第一个屏幕截图中,标题正在显示,但在第二个屏幕截图中没有显示。如何在后续页面上显示这些列标题?请帮我解决这个问题。在此先感谢。这张图片是 pdf 表格的第一页。这是带有正确标题的表格的第一页这是表格的第二页,其中标题应与第一页一样显示。

4

5 回答 5

52

另一种方法是在 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

我想到了两种方法。

方法 1:创建您自己的自定义标题函数(如在 TCPDF 示例 3 中),自动将标题单元格添加到每个页面。在这种情况下,您会将标题单元格放置代码移动到Header类中的方法中,并将标题绘制到页面上的固定位置。由于在Header添加新页面时会自动调用该方法,因此您的表头将在页面创建后立即添加。这肯定比方法 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

我不允许添加评论,但我想为 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 回答
2

这可能有点晚了,但我想出了一个简单的方法来在每一页上都有标题。获取$data并使用该array_slice函数来填充一页的数据行。输出表格,然后循环回到下一页。我每页使用 54 行,字体大小为 9。

//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 回答
0

EPB 的方法 2 对我有用,但我对其进行了一些修改,只使用了 $pdf->startTransaction(); 而不是 $this->startTransaction(); 因为我的脚本已经以这种方式格式化了。

非常感谢!

于 2013-05-09T16:36:03.243 回答