2012-06-27 5 views
4

Я использую TCPDF для вывода таблицы html, этот в моем примере не единственный, который мне нужно будет изменить, поэтому мне нужны некоторые правила для отображения моих страниц. До сих пор TCPDF казался мне мощной библиотекой, поэтому я был бы признателен, если бы не попробовать другую.TCPDF split html table на нескольких страницах

Моя проблема в том, что мне нужно добавить заголовок таблицы на каждую новую страницу, в которой будет отображаться таблица, но у меня есть и другая информация для записи в этот PDF-файл, который не должен иметь заголовок таблицы, поэтому я не могу использовать переписывание метода заголовка в tcpdf.

<table border="0" cellspacing="0" cellpadding="0" align="center" width="100%" ><tr><td><table border="0" cellspacing="0" cellpadding="3" align="left" width="100%" ><tr><td class="TableHeader" width="5%" style="padding: 5px; border-top: 1px solid #000000; border-left: 1px solid #000000; border-bottom: 1px solid #E4E9EC;" >Nr.</td><td class="TableHeader" width="40%" style=" padding: 5px; border-top: 1px solid #000000; border-bottom: 1px solid #E4E9EC;" >Denumire</td><td class="TableHeader" width="20%" align="left" style=" padding: 5px; border-top: 1px solid #000000; border-bottom: 1px solid #E4E9EC;" >Cod</td><td class="TableHeader" width="10%" align="center" style=" padding: 5px; border-top: 1px solid #000000; border-bottom: 1px solid #E4E9EC;" >Cant.</td><td class="TableHeaderLast" align="right" width="13%" style=" padding: 5px; border-top: 1px solid #000000; border-bottom: 1px solid #E4E9EC;" >Pret unitar<br />fara TVA (RON)</td><td class="TableHeaderLast" align="right" width="13%" style=" padding: 5px; border-bottom: 1px solid #E4E9EC; border-top: 1px solid #000000; border-right: 1px solid #000000;" >Pret total<br />fara TVA (RON)</td></tr></table></td></tr></table><table border="0" cellspacing="0" cellpadding="0" align="center" width="100%" id="Container"><tr><td><table border="0" cellspacing="0" cellpadding="3" align="left" width="100%" ><tr><td class="TableHeader" width="5%" style="padding: 5px; border-left: 1px solid #000000;" >&nbsp;</td><td class="TableHeader" width="40%" style=" padding: 5px;" >&nbsp;</td><td class="TableHeader" width="20%" style=" padding: 5px;" >&nbsp;</td><td class="TableHeader" width="10%" style=" padding: 5px;" >&nbsp;</td><td class="TableHeaderLast" align="right" width="13%" style=" padding: 5px;" >&nbsp;</td><td class="TableHeaderLast" align="right" width="13%" style=" padding: 5px; border-right: 1px solid #000000;" >&nbsp;</td></tr><tr style="border-bottom: 1px solid #ccc"><td class="TableRow" style="padding: 5px; border-bottom: 1px solid #E4E9EC; border-left: 1px solid #000000; ">1</td><td class="TableRow" style="padding: 5px; border-bottom: 1px solid #E4E9EC;"><b>sectiune1</b></td><td class="TableRow" colspan="5" style="padding: 5px; border-bottom: 1px solid #E4E9EC; border-right: 1px solid #000000;">&nbsp;</td></tr><tr style="border-bottom: 1px solid #ccc"><td class="TableRow" style="padding: 5px; border-left: 1px solid #000000;border-bottom: 1px solid #E4E9EC; ">1.1</td><td class="TableRow" style="padding: 5px;border-bottom: 1px solid #E4E9EC; ">UNI-Cazan mixt AIREX 25 2S BICOMB MODUL </td><td class="TableRow" align="left" style="padding: 5px;border-bottom: 1px solid #E4E9EC; ">94456&nbsp;</td><td class="TableRow" align="center" style="padding: 5px;border-bottom: 1px solid #E4E9EC;">99999</td><td class="TableRow" align="right" style="padding: 5px;border-bottom: 1px solid #E4E9EC; ">24.623,00</td><td class="TableRow" align="right" style="padding: 5px; border-right: 1px solid #000000;border-bottom: 1px solid #E4E9EC;">2.462.275.377,00</td></tr><tr style="border-bottom: 1px solid #ccc"><td class="TableRow" style="padding: 5px; border-left: 1px solid #000000;border-bottom: 1px solid #E4E9EC; ">1.2</td><td class="TableRow" style="padding: 5px;border-bottom: 1px solid #E4E9EC; ">UNI-Cazan mixt AIREX 25 2S BICOMB MODUL </td><td class="TableRow" align="left" style="padding: 5px;border-bottom: 1px solid #E4E9EC; ">94456&nbsp;</td><td class="TableRow" align="center" style="padding: 5px;border-bottom: 1px solid #E4E9EC;">99999</td><td class="TableRow" align="right" style="padding: 5px;border-bottom: 1px solid #E4E9EC; ">24.623,00</td><td class="TableRow" align="right" style="padding: 5px; border-right: 1px solid #000000;border-bottom: 1px solid #E4E9EC;">2.462.275.377,00</td></tr><tr style="border-bottom: 1px solid #ccc"><td class="TableRow" style="padding: 5px; border-bottom: 1px solid #000; border-left: 1px solid #000000; ">&nbsp;</td><td class="TableRow" width="40%" style="padding: 5px; border-bottom: 1px solid #000; "><b> TOTAL sectiune1:</b></td><td class="TableRow" style="padding: 5px; border-bottom: 1px solid #000; "> &nbsp;</td><td class="TableRow" style="padding: 5px; border-bottom: 1px solid #000; "> &nbsp;</td><td class="TableRowLast" colspan="2" align="right" style="padding: 5px; border-bottom: 1px solid #000; border-right: 1px solid #000000; "><b>4.924.550.754,00</b></td></tr><tr style="border-bottom: 1px solid #ccc"><td class="TableRow" style="padding: 5px; border-top: 1px solid #000; border-bottom: 1px solid #000; ">&nbsp;</td><td class="TableRow" style="padding: 5px; border-top: 1px solid #000; border-bottom: 1px solid #000;">&nbsp;</td><td class="TableRow" colspan="5" style="padding: 5px; border-top: 1px solid #000; border-bottom: 1px solid #000; ">&nbsp;</td></tr><tr style="border-bottom: 1px solid #ccc"><td class="TableRow" style="padding: 5px; border-top: 1px solid #000; border-bottom: 1px solid #E4E9EC; border-left: 1px solid #000000; ">2</td><td class="TableRow" style="padding: 5px; border-bottom: 1px solid #E4E9EC; border-top: 1px solid #000;"><b>sectiune2</b></td><td class="TableRow" colspan="5" style="padding: 5px; border-bottom: 1px solid #E4E9EC; border-right: 1px solid #000000; border-top: 1px solid #000;">&nbsp;</td></tr><tr style="border-bottom: 1px solid #ccc"><td class="TableRow" style="padding: 5px; border-left: 1px solid #000000;border-bottom: 1px solid #E4E9EC; ">2.1</td><td class="TableRow" style="padding: 5px;border-bottom: 1px solid #E4E9EC; ">ICI-Cazan condensatie MONOLITE 75-JB</td><td class="TableRow" align="left" style="padding: 5px;border-bottom: 1px solid #E4E9EC; ">81020076&nbsp;</td><td class="TableRow" align="center" style="padding: 5px;border-bottom: 1px solid #E4E9EC;">99999</td><td class="TableRow" align="right" style="padding: 5px;border-bottom: 1px solid #E4E9EC; ">34.719,00</td><td class="TableRow" align="right" style="padding: 5px; border-right: 1px solid #000000;border-bottom: 1px solid #E4E9EC;">3.471.865.281,00</td></tr><tr style="border-bottom: 1px solid #ccc"><td class="TableRow" style="padding: 5px; border-bottom: 1px solid #000; border-left: 1px solid #000000; ">&nbsp;</td><td class="TableRow" width="40%" style="padding: 5px; border-bottom: 1px solid #000; "><b> TOTAL sectiune2:</b></td><td class="TableRow" style="padding: 5px; border-bottom: 1px solid #000; "> &nbsp;</td><td class="TableRow" style="padding: 5px; border-bottom: 1px solid #000; "> &nbsp;</td><td class="TableRowLast" colspan="2" align="right" style="padding: 5px; border-bottom: 1px solid #000; border-right: 1px solid #000000; "><b>3.471.865.281,00</b></td></tr><tr style="border-bottom: 1px solid #ccc"><td class="TableRow" style="padding: 5px; border-top: 1px solid #000; border-bottom: 1px solid #000; ">&nbsp;</td><td class="TableRow" style="padding: 5px; border-top: 1px solid #000; border-bottom: 1px solid #000;">&nbsp;</td><td class="TableRow" colspan="5" style="padding: 5px; border-top: 1px solid #000; border-bottom: 1px solid #000; ">&nbsp;</td></tr><tr><td class="TableTotal" style=" padding: 5px; border-left: 1px solid #000000;"></td><td colspan="3" class="TableTotal" style=" padding: 5px; " ><b>Total sectiune1:</b></td><td align="right" class="TableTotal" style=" padding: 5px; " ><b>&nbsp;</b></td><td class="TableTotal" align="right" style=" padding: 5px; border-right: 1px solid #000000;" ><b>4.924.550.754,00 </b></td></tr><tr><td class="TableTotal" style=" padding: 5px; border-left: 1px solid #000000;"></td><td colspan="3" class="TableTotal" style=" padding: 5px; " ><b>Total sectiune2:</b></td><td align="right" class="TableTotal" style=" padding: 5px; " ><b>&nbsp;</b></td><td class="TableTotal" align="right" style=" padding: 5px; border-right: 1px solid #000000;" ><b>3.471.865.281,00 </b></td></tr><tr><td class="TableTotal" style=" padding: 5px; border-left: 1px solid #000000;border-top: 1px solid #E4E9EC; "></td><td colspan="4" class="TableTotal" style=" padding: 5px;border-top: 1px solid #E4E9EC; " ><b>Total oferta (RON):</b></td><td colspan="2" align="right" class="TableTotal" style=" padding: 5px; border-right: 1px solid #000000;border-top: 1px solid #E4E9EC; " ><b>8.396.416.035,00 </b></td></tr><tr><td class="TableTotal" style=" padding: 5px; border-left: 1px solid #000000;border-bottom: 1px solid #000000;"></td><td colspan="4" class="TableTotal" style=" padding: 5px;border-bottom: 1px solid #000000;" ><b>Total oferta (RON cu TVA inclus):</b></td><td colspan="2" align="right" class="TableTotal" style=" padding: 5px; border-right: 1px solid #000000;border-bottom: 1px solid #000000;" ><b>10.411.555.883,40 </b></td></tr></table></td></tr></table> 

Я думал следующее решение: если какой-то образом я мог бы разделить этот HTML к строкам и записи построчно строки в формат PDF, так что я могу откатить, когда я пишу по сноске, а затем я добавить новую страницу, но есть большая проблема, я получаю всевозможные предупреждения, потому что теги таблицы html не закрыты. Вот мой код:

$pdf->setAutoPageBreak(false); 
$pdf->startTransaction(); 
$html = new simple_html_dom(); 
$html->load($data); 
$single = $html->find('#Container', 0); 
if($single){ 

$rows = $single->getElementsByTagName('tr'); 
$rows = $rows[0]->getElementsByTagName('tr'); 

if($rows) 
    for($i=1;$i<(count($rows)-1);$i++){ 
    $pdf->writeHTMLCell($w=0, $h=0, $x='', $y='', '<table>', $border=0, $ln=1, $fill=0, $reseth=true, $align='', $autopadding=false); 
    $pdf->writeHTMLCell($w=0, $h=0, $x='', $y='', $rows[$i]->outertext, $border=0, $ln=1, $fill=0, $reseth=true, $align='', $autopadding=false); 
    $pdf->writeHTMLCell($w=0, $h=0, $x='', $y='', '</table>', $border=0, $ln=1, $fill=0, $reseth=true, $align='', $autopadding=false); 

    if ($pdf->getY() > $pdf->getPageHeight() - 30) { 
     $pdf->rollbackTransaction(true); 
     $pdf->AddPage(); 
     $pdf->writeHTMLCell($w=0, $h=0, $x='', $y='', '<table>', $border=0, $ln=1, $fill=0, $reseth=true, $align='', $autopadding=false); 
     $pdf->writeHTMLCell($w=0, $h=0, $x='', $y='', $rows[$i]->outertext, $border=0, $ln=1, $fill=0, $reseth=true, $align='', $autopadding=false); 
     $pdf->writeHTMLCell($w=0, $h=0, $x='', $y='', '</table>', $border=0, $ln=1, $fill=0, $reseth=true, $align='', $autopadding=false); 
     } 
    } 
    } 


    $pdf->commitTransaction(); 
    $pdf->setAutoPageBreak(true, 30); 

Я взял быстрый взгляд на это 2 статьи, может быть, кто-то может найти это удобно: Some paging with multicell и Another paging with multicell. Я нашел этот 2 достойным примера в качестве логики решения, но методы, используемые с tcpdf, казались мне немного странными.

ответ

4

Я думаю, что ваше решение является хорошим. Только другой метод, о котором я могу думать, - использовать многоканальные фиксированные ширины, которые могут быть довольно больными, но дает вам статические ширины столбцов.

я заметил несколько проблем, однако:

  1. трансзакции оборачивает весь документ, откат должен сбросить документ ни к чему.
  2. Ваши предупреждения, скорее всего, вызваны тем фактом, что вы передаете частичный html-код, который не способен визуализироватьHTMLCell. (Вы проезжаете только < стол > или </стол > который, когда один, не может быть изображен)
  3. Ваши столбцы не выстроились бы в линию, если бы вы завернули каждую строку в теги таблицы. Лучше всего обернуть строки на этой странице в блоке таблицы.

Попробуйте эти изменения и дайте мне знать, как она идет

$pdf->setAutoPageBreak(false); 
//$pdf->startTransaction(); // Moved 
$html = new simple_html_dom(); 
$html->load($data); 
$single = $html->find('#Container', 0); 
if($single){ 

    $rows = $single->getElementsByTagName('tr'); 
    $rows = $rows[0]->getElementsByTagName('tr'); 

    if($rows) { 
     $pdf->startTransaction(); // Start transaction only because we may need it 
     // Header for html, this starts the html and can optionally insert the header row as the first row on every new page. 
     $html_header = '<tr><td>Name</td><td>Age</td></tr>'; 
     $html_buffer = '<table>'.$html_header; 
     for($i=1;$i<(count($rows)-1);$i++){ 
      $pdf->writeHTMLCell($w=0, $h=0, $x='', $y='', $html_buffer.$rows[$i]->outertext.'</table>', $border=0, $ln=1, $fill=0, $reseth=true, $align='', $autopadding=false); 

      if ($pdf->getY() < ($pdf->getPageHeight() - 30)) { // Note the less-than operator 
       // We might be able to add some more text, so undo that 
       $pdf->rollbackTransaction(true); 
       // And store the html 
       $html_buffer .= $rows[$i]->outertext; 
      }else{ 
       // We exceeded our limit 
       $pdf->rollbackTransaction(true); 
       // Write last known good table 
       $pdf->writeHTMLCell($w=0, $h=0, $x='', $y='', $html_buffer.'</table>', $border=0, $ln=1, $fill=0, $reseth=true, $align='', $autopadding=false); 
       // Add a new page 
       $pdf->AddPage(); 
       // End this transaction 
       $pdf->commitTransaction(); 
       // Start a new transaction 
       $pdf->startTransaction(); 
       // Reset html buffer 
       $html_buffer = '<table>'.$html_header; 
       // Add line we couldn't fit on last page to html buffer 
       $html_buffer .= $rows[$i]->outertext; 
      } 
     } 
     // There is still information in our buffer and it fits on a single page 
     $pdf->writeHTMLCell($w=0, $h=0, $x='', $y='', $html_buffer.'</table>', $border=0, $ln=1, $fill=0, $reseth=true, $align='', $autopadding=false); 
     // Final commit 
     $pdf->commitTransaction(); 
    } 
} 
$pdf->setAutoPageBreak(true, 30); 

Это оборачивает все на странице в блоке таблицы, так что столбцы будут выстраиваться на этой странице. (Однако они все равно могут отличаться от страницы к странице). Кроме того, я дал вам возможность добавить свой собственный заголовок на каждую новую страницу, как вы хотели. Просто измените $ html_header на свой собственный код строки заголовка.

Вы правы, когда говорили, что TCPDF может сбивать с толку, но он также чрезвычайно эффективен, и как только вы его повесите, вы можете сделать несколько очень хороших документов.

+0

Я сделал следующие изменения: заменил «

» на $ table_tag, потому что мне нужны были какие-то стили, в противном случае это работало как шарм 10x man :) – decebal

+0

Я воспользовался некоторыми другими проблемами, поэтому мне нужно было добавить это, если (! strpos ($ rows [$ i-1] -> externaltext, $ rows [$ i] -> externaltext)) $ html_buffer. = $ rows [$ i] -> externaltext; – decebal

2

Перейдите в TCPDF и выберите Example 48, вы увидите пример с элементом <thead>.

+1

Должен был прочитать элемент «thead».Я также обнаружил, что HTML должен быть проверен, чтобы он работал. –

Смежные вопросы