FDPF : Otázky a odpovědi

  • 1. Jaká je licence FPDF? Existují nějaká omezení pro použití?

    FPDF je uvolněno pod tolerantní licencí: neexistuje žádné omezení pro používání. Můžete ji volně použít ve vašich aplikacích (komerční i nekomerční) s nebo bez uprav.
  • 2. Když se snažím vytvořit PDF, na obrazovce se zobrazují hodně divné znaky. Proč?

    Tyto "divné" znaky jsou ve skutečnosti skutečný obsahu vašeho PDF. Toto chování je chyba v IE6. Když se načte první HTML stránka a pak PDF ze stejné URL zobrazí se dokument přímo bez spuštění Acrobatu. To se stává často v průběhu vývojové fáze: co nejméně chyb ze skriptu posílejte do HTML stránky, a po opravě dorazí do PDF.
    Chcete-li vyřešit tento problém, stačí ukončit a znovu spustit IE. Můžete také přejít na jinou adresu URL a vrátit se zpět.
    Aby se zabránilo tomuto druhu problémů během vývoje, můžete vytvářet PDF do souboru a otevírat jej pomocí prohlížeče.
  • 3. Snažím se vytvářet PDF a IE zobrazí prázdnou stránku. Co se stalo?

    V první řadě se ujistěte, že jste neposlali nic do prohlížeče po PDF (ani mezeru). Můžete vložit výstupní hlášku bezprostředně po volání metody Output(). Pokud to stále nefunguje, znamená to, že jste obětí "syndromu prázdné stránky". IE používá pro spojení s Acrobatem plug-in obsahující mnoho chyb. Pro spolehlivý způsob aby nedocházelo k těmto problémům existují dvě hlavní techniky:

    - Zakažte používání plug-inu pro Acrobat jako pomocné aplikace. Aby to bylo možné, spuštění Acrobatu, jděte do menu Úpravy, Předvolby, Internet, a zrušte zatržení "Zobrazit PDF v prohlížeči". Potom, až se příště budete nahrát PDF v IE, se zobrazí dialogové okno "Otevřít v" nebo "Uložit na disk". Nepotvrzujte volbu "Vždy se ptát před otevřením souboru tohoto typu" a zvolte Otevřít. Od této chvíle budou automaticky otevřeny PDF soubory v externím okně Acrobatu.
    Nevýhodou této metody je, že potřebujete změnit konfiguraci klienta, který můžete udělat v prostředí intranetu, ale ne na internetu.

    - Použití přesměrovací techniky. Skládá se z vytváření PDF do dočasného souboru na serveru a přesměrování klienta na tento soubor. Například na konci skriptu, můžete požít toto:
    // Zjisteni jmena docastneho souboru v aktualnim adresari
    $file = basename(tempnam('.', 'tmp'));
    rename($file, $file.'.pdf');
    $file .= '.pdf';
    // Ulozeni PDF do souboru
    $pdf->Output($file, 'F');
    // Presmerovani
    header('Location: '.$file);
    Tato metoda střídá dynamické PDF do jednoho a vyhýbá se všem statickým starostem. Ale musíte udělat ještě nějaké čištění s cílem odstranit dočasné soubory. Například:
    function CleanFiles($dir)
    {
        // Smazani docastnych souboru
        $t = time();
        $h = opendir($dir);
        while($file=readdir($h))
        {
            if(substr($file,0,3)=='tmp' && substr($file,-4)=='.pdf')
            {
                $path = $dir.'/'.$file;
                if($t-filemtime($path)>3600)
                    @unlink($path);
            }
        }
        closedir($h);
    }
    Tato funkce smaže všechny soubory tmp*.pdf v zadaném adresáři starší než 1 hodinu. Můžete jo volat kde chcete, například ve skriptu, který generuje PDF.
  • 4. Nemohu docílit zalomení řádku. Vložil jsem do řetězce tištěného pomocí MultiCell() ale nefunguje to.

    Musíte přiložit váš řetězec do dvojitých uvozovek ("), ne do jeduchých (').
  • 5. Snažím se zobrazit proměnné v metodě Header() ale nevytiskne se.

    Musíte použít global klíčové slovo pro přístup ke globálním proměným, například:
    function Header()
    {
        global $title;
    
        $this->SetFont('Arial', 'B', 15);
        $this->Cell(0, 10, $title, 1, 1, 'C');
    }
    
    $title = 'Muj titul';
    Alternativně můžete použít objekt property:
    function Header()
    {
        $this->SetFont('Arial', 'B', 15);
        $this->Cell(0, 10, $this->title, 1, 1, 'C');
    }
    
    $pdf->title = 'Muj titul';
  • 6. Definoval jsem metodu Header() a Footer() v mé třídě PDF ale nic se neobjeví.

    Musíte vytvořit objekt z PDF třídy, ne z FPDF:
    $pdf = new PDF();
  • 7. Znaky s diakritikou jsou nahrazeny nějakéma divnéma znakama jako např. é.

    Nepoužívejte kódování UTF-8. Standardní FPDF používá písma v ISO-8859-1 nebo Windows-1252. Je možné provést konverzi do ISO-8859-1 s utf8_decode():
    $str = utf8_decode($str);
    Ale některé znaky, jako je Euro nebudou přeloženy správně. If the iconv extension is available, the right way to do it is the following:
    $str = iconv('UTF-8', 'windows-1252', $str);
  • 8. Zkouším zobrazit symbol Euro, ale to nefunguje to.

    Standardní fonty mají znak Euro na pozici 128. Pro pohodlí si můžete definovat konstantu:
    define('EURO', chr(128));
  • 9. Při vytváření PDF dokumentu dostanu chybu: Some data has already been output, can't send PDF file

    Nesmíte poslat nic do prohlížeč kromě samotného PDF: žádné HTML, žádná mezera, žádné odřádkování. A common case is having extra blank at the end of an included script file.
    Pokud nelze zjistit, kde je problém z této zprávy může vám pomoci:

    Warning: Cannot modify header information - headers already sent by (output started at script.php:X)

    To znamená, že script.php vytisknul něco na řádku X. Jdi na tento řádek a oprav chybu. V případě, že se zpráva neukazuje nejprve zkontrolujte, zda máte vypnuté varování v PHP, poté přidejte tohle na začátek skriptu:
    ob_end_clean();
    Pokud ji stále nevidíte, vypněte zlib.output_compression ve vašem php.ini a neměla by se projevit.
  • 10. Kreslím rám s velmi přesným rozměrem, ale při tisku jsem upozorněn na některé rozdíly.

    Pro respektování rozměrů, vyberte možnost "Žádné" na stránce nastavení měřítka místo "Zmenšit na Tisknutelné zóna" v dialogovém okně Tisk.
  • 11. Chtěl bych využít plochu celé stránky, ale při tisku jsou vždycky nějaké okraje. Jak se jich mohu zbavit?

    Tiskárny mají fyzické okraje (různé v závislosti na modelu), proto neni možné je odstranit a tisknout na celou plochu papíru.
  • 12. Jak mohu dát pozadí do mého PDF?

    Pro vložení obrázku volejte Image() v metodě Header(), před jakýmkoliv jiným výstupem. Chcete-li nastavit barvu pozadí, použijte Rect().
  • 13. Jak mohu nastavit jiné záhlaví nebo zápatí na první stránce?

    Stačí test stránce číslo:
    function Header()
    {
        if($this->PageNo()==1)
        {
            //First page
            ...
        }
        else
        {
            //Other pages
            ...
        }
    }
  • 14. Chtěl bych použít rozšíření poskytované různými skripty. Jak je lze zkombinovat?

    Použijte dědictví řetězce. Pokud máte dvě třídy, použijte A v a.php:
    require('fpdf.php');
    
    class A extends FPDF
    {
    ...
    }
    a B v b.php:
    require('fpdf.php');
    
    class B extends FPDF
    {
    ...
    }
    pak B rozšiřte o A:
    require('a.php');
    
    class B extends A
    {
    ...
    }
    a vyrobte si vlastní třídu rozšířenou o B
    require('b.php');
    
    class PDF extends B
    {
    ...
    }
    
    $pdf = new PDF();
  • 15. Jak mohu poslat PDF dokument e-mailem?

    Stejně jako jakýkoliv jiný soubor, jednoduchý způsob je použít PHPMailer (http://phpmailer.codeworxtech.com/) a jeho připojení přílohy k emailu:
    $mail = new PHPMailer();
    ...
    $doc = $pdf->Output('', 'S');
    $mail->AddStringAttachment($doc, 'doc.pdf', 'base64', 'application/pdf');
    $mail->Send();
  • 16. Jaký je limit velikosti souboru, které mohu vytvářet s FPDF?

    Neexistuje žádná zvláštní omezení. Existuje ovšem několik omezení:

    - Maximální velikost paměti přidělené pro PHP skripty je obvykle 8 MB. U velmi velkých dokumentů, zejména s obrázky, může být tento limit dosažen (soubor je tvořen paměti). Tento parametr se nastavuje v souboru php.ini.

    - Maximální výchozí doba běhu scriptu je nastavena na 30 sekund. Tento limit lze samozřejmě snadno dosáhnout. Toto se nastavuje v php.ini a může být měněn dynamicky přes set_time_limit().

    - Prohlížeče obvykle mají 5 minut na načtení stránky. Pokud budete posílat data ve formátu PDF přímo do prohlížeče a dosáhnete limitu, budou data ztracena. Proto je doporučeno velké dokumenty vytvářet do souboru a odesílat data do prohlížeče čas od času (voláním flush() vynutíte výstup). Když je dokument hotový můžete odeslat přesměrování nebo vytvořit odkaz.
    Poznámka: i když prohlížeč dosáhnul limit, skript může na serveru stále běžet.
  • 17. Mohu změnit existující PDF dokument s FPDF?

    Je možné importovat stránky z existujícího PDF dokument díky FPDI rozšíření:

    FPDI

    Potom můžete přidat jiný obsah.
  • 18. Chtěl bych vyhledávat z PHP a indexovat PDF soubory. Mohu to s FPDF?

    Ne. Ale existuje GPL utilita v C - pdftotext, která je schopna extrahovat textový obsah z PDF. It is provided with the Xpdf package:

    Xpdf
  • 19. Mohu převést stránky HTML do PDF s FPDF?

    Ne. Ale existuje GPL utility v C - htmldoc, která to umožňuje a má dobré výsledky:

    htmldoc
  • 20. Mohu spojit PDF soubory s FPDF?

    Ne přímo, ale je možné použít FPDI ke splnění tohoto úkolu. Existují také některé řádkové nástroje zdarma:

    mbtPdfAsm
    pdftk