Autor Zpráva
blahapet
Profil
Ahoj všem,
generuji dynamicky z databáze PDF dokument pomocí knihovny FPDF - konkrétně nápojový lístek restaurace. Jde mi o to, jak nastavit to, když jeden kompletní blok s nadpisem (např. hned na první straně - Červené víno / Red wine / Rotwein) a jeho čtyřmi položkami vín nebyl takto rozhozený do dvou stran, ale začínal celý až na druhé straně PDF dokumentu, jestli chápete. Soubor je zde. Dále nadpis Nealkoholické nápoje, aby začínal také až s jeho položkami na další straně. A dále a dále...

Kdyby to byl statický dokument, kde se nepřidávají další položky, jistě bych to snadno ošetřil, ale tady si absolutně nevím rady. Napadá mě použít funkci AcceptPageBreak(), ale vůbec netuším jak. Poradíte někdo, prosím?

Děkuju moc.


Jinak ještě zasílám pro ukázku podstatnou část skriptu, co PDF generuje:

$pdf = new FPDF();
$pdf -> Open();
$pdf -> AddPage();

$pdf -> AddFont('Arial', '', 'c0189d6a5be3d20ef041c942b4686f96_arial.php');
$pdf -> AddFont('Arial Bold', '', '2b41bab71cd556cde80a762bd1b11f9f_arialbd.php');
$pdf -> AddFont('Arial Italic', '', '7fb185394cf50c56f76e3371b7df3a6f_ariali.php');
$pdf -> AddFont('Arial Bold Italic', '', 'c3562b10c7442a8e1096ce0789c33a35_arialbi.php');

$pdf -> SetAutoPageBreak(true, 10);

$pdf -> SetMargins(10, 10, 10);

$pdf -> SetTextColor(0, 0, 0);
$pdf -> SetFillColor(235);

$pdf -> SetTitle("Restaurace Pirát, nápojový lístek");
$pdf -> SetDisplayMode(real, single);

$path_to_image = "./img/logo2-pdf.jpg";


$pdf -> Image($path_to_image, 70, 5, 70, 44, "JPG");

$pdf -> SetFont('Arial','',10);


$pdf -> Cell(190, 45, "", 0, 1, "C", 0, 0);
$pdf -> Cell(190, 8, "Husova 127, 506 01 Jičín    |    tel.: 724 784 848    |    www.restaurace-pirat.cz", B, 1, "C", 0, 0);

$pdf -> SetFont('Arial Bold','',16);
$pdf -> Cell(190, 20, "N Á P O J O V Ý   L Í S T E K", 0, 1, "C", 0, 0);



$result = mysql_query("select id, nazev from napojovy_listek_typy order by id asc");

        while($r = mysql_fetch_array($result)){
                $pdf -> SetTextColor(0, 0, 0);
                $pdf -> SetFont('Arial Bold','',14);
                $pdf -> Cell(190, 10, iconv($in_charset, $out_charset, $r["nazev"]), 0, 1, "L", 0, 0);
                $pdf -> SetFont('Arial','',12);

                    $result2 = mysql_query("select * from napojovy_listek where typ_id = ".$r["id"]." order by id asc");
                    
                      while($r2 = mysql_fetch_array($result2)){
                  
                              
                              if(empty($r2["cz_item1"]) and empty($r2["cz_item2"]) and !empty($r2["cz_item3"])){
                                  $pdf -> SetTextColor(0, 0, 0);
                                  $pdf -> SetFont('Arial','',12);                          
                                  $pdf -> Cell(190, 7, iconv($in_charset, $out_charset, $r2["cz_item3"]), 0, 1, "C", 0, 0);
                                  
                              }else{                                  
                                  $pdf -> SetTextColor(0, 0, 0);
                                    $pdf -> SetFont('Arial','',12);
                                                              
                                  $pdf -> Cell(150, 7, iconv($in_charset, $out_charset, $r2["cz_item1"]), 0, 0, "L", 1, 0);
                                  
                                   
                                   
                                  $pdf -> SetFont('Arial','',12);
                                  $pdf -> Cell(20, 7, $r2["mnozstvi"], 0, 0, "C", 1, 0);
                                  $pdf -> Cell(20, 7, $r2["cena"].",-", 0, 1, "R", 1, 0);
                                  
                                  if(!empty($r2["cz_item2"])){
                                      $pdf -> SetFont('Arial Italic','',10);
                                      $pdf -> SetTextColor(0, 0, 0);
                                      $pdf -> Cell(190, 5, iconv($in_charset, $out_charset, $r2["cz_item2"]), 0, 1, "L", 1, 0);
                                  }
                                  
                              
                                  $pdf -> Cell(190, 3, "", 0, 1, "C", 0, 0);    
                              }    
                                  
                                  
                      }
                      
            $pdf -> Cell(190, 10, "", 0, 1, "C", 0, 0);
            
       }
Keeehi
Profil
Zkusil bych fpdf page break issue
Samozřejmě to bude potřeba upravit ale idea je taková, že vypneš automatické stránkování, budeš zjišťovat kde v dokumentu jsi a pokud už se tam další blok buněk nevejde, přidáš další stránku.
blahapet
Profil
Moc díky za nasměrování.
blahapet
Profil
Tak jsem to konečně vyřešil... Asi by ten kód šel udělat lépe, ale jsem amatér, nicméně to funguje. Nejdřív jsem si musel udělat funkci, která mi spočítá výšky jednotlivých bloků. Jde v podstatě o duplikát kódu, který jsem psal před tím. Funkce s dvěma cykly while, která naplní pole $vysky_bloku:

$block = array();
$vysky_bloku = array();



$sql = "select id, nazev from napojovy_listek_typy order by id asc"; 

$result = mysql_query($sql);

function BreakPage(){
            global $block, $sql;
        
        $a = 0;    
        $res = mysql_query($sql);    
        while($_r = mysql_fetch_array($res)){
        
                $h = 0;
                $h += 10;
                $a++;

                    $_result2 = mysql_query("select * from napojovy_listek where typ_id = ".$_r["id"]." order by id asc");
                    
                      while($_r2 = mysql_fetch_array($_result2)){                   
                              
                              if(empty($_r2["cz_item1"]) and empty($_r2["cz_item2"]) and !empty($_r2["cz_item3"])){
                                  $h += 7;
                              }else{                                  
                                  $h += 7;
                                  
                                  if(!empty($_r2["cz_item2"])){
                                      $h += 5;
                                  }                                  
                              
                                  $h += 3;    
                              }                   
                      }

            $block[$a] += $h;

    }
    
    return $block;

}


$a = 0;
$vysky_bloku = BreakPage();


Pak už následuje kód, který jsem psal jako první výše, jež vypisuje jednotlivá data z databáze. Těsně před koncem cyklu while() jsem ještě přidal tento kód:

                        $page_height = 280; // výška dokumentu A4 v mm
            $space_left = $page_height - round($pdf -> GetY()); // zbylé místo na stránce
            $pdf -> Cell(190, 10, "", 0, 1, "C", 0, 0);
    
               if(
               round($pdf -> GetY()) >= $page_height - 250  and // pokud se nacházím v pozici před koncem dokumentu
               $vysky_bloku[$a + 1] > $space_left and // a další blok je vyšší než zbylé místo na stránce
               $a < mysql_num_rows($result) //a v databázi je k dispozici další blok
               ){
                $pdf -> AddPage(); // teprve potom přidám další stránku
            }


A hle, funguje to, výsledek je zde

Ještě jednou díky za nasměrování.
Kcko
Profil
blahapet:
Možná jen proč si komplikuješ na tak jednoduché PDFko život s FDP knihovnou a skládáš to ručně, když by to za tebe vyřešila MDPF knihovna, které bys dodal jen HTML ...

mpdf.github.io
blahapet
Profil
Kcko:

Dík za info.
Vím, že MDPF existuje... Ale s FPDF jsem začal pracovat už někdy před 15ti lety (pak dobu ne) a teď jsem se zas k tomu vrátil a zkrátka někdy si člověk potřebuje ulevit od věčné rutiny spojené s tvorbou stránek a řešit a objevit něco nového, aby mě to zase posunulo někam dál... ;-)

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0