Jak na download PDF souboru v PHP?

MyEgo.cz

home foto blogy mywindows.cz kontakt

Jak na download PDF souboru v PHP?

PHP 10.10.06

Když jsem včera řešil generování PDF z HTML a následný download tohoto souboru, setkal jsem se s řadou problémů. Není to v praxi až tak triviální věc, jak to vypadá. Některé zasílané header() hlavičky nefungují v MSIE, některé v Opeře, a jiné zase ve Firefoxu. Dospěl jsem nakonec k řešení, které funguje, dle testů, pod MSIE 6.0, Firefoxem 1.5 i Operou 9, a nabídne uživateli stažení vytvořeného PDF souboru.

Takto vypadá skutečně funkční download vyvořeného PDF v PHP:

function download_file($pdfdata, filename){
 if (ereg('Opera(/| )([0-9].[0-9]{1,2})', $_SERVER['HTTP_USER_AGENT']))
  $UserBrowser = "Opera";
 elseif (ereg('MSIE ([0-9].[0-9]{1,2})', $_SERVER['HTTP_USER_AGENT']))
  $UserBrowser = "IE";
 else
  $UserBrowser = '';
 $mime_type = ($UserBrowser == 'IE' || $UserBrowser == 'Opera') ? 
  'application/octetstream' : 'application/octet-stream';
 header('Content-Type: ' . $mime_type);
 header('Content-Disposition: attachment; filename="'.$filename.'"');
 header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
 header('Accept-Ranges: bytes');
 header("Cache-control: private");
 header('Pragma: private');				
 header("Content-Length: ".strlen($pdfdata));
 echo $pdfdata;
}

Otestovat si jej můžete přímo pod tímto článkem kliknutím na [export do PDF].


Komentáře

  1. 1 HeWeR 10.10.06, 02:10:25
    FB

    Pěkná přístupná i použitelná věcička. Jen tak přemýšlím, kolik lidí tento export využije… prakticky mě ani nenapadá moc důvodů, proč exportovat do pdf.

    Snad jen když si chci článek off-line archivovat.

  2. 2 dgx 10.10.06, 04:10:30
    FB

    Ten test browserů bych udělal benevolentnější - takto nebude fungovat v další Opeře (v10). Respektive možná ano, díky chybějícímu escapování tečky.

  3. 3 Khata 10.10.06, 06:10:33
    FB

    moc moc diky!

  4. 4 karel 10.10.06, 08:10:51
    FB

    Podobný problém jsem nedávno řešil a vyřešil jsem ho stejně (tedy posíláním application/octetstream nebo application/octet-stream podle prohlížeče).

    Co se mi ale nepodařilo vyřešit bylo, jak přimět IE, aby PDF přímo otevřel (tedy nenabízel ho ke stažení). V Firefoxu a Opeře to je bez problému, stačí poslat application/pdf a vyplivnout obsah, ale v IE to z neznámého důvodu nefunguje. Ví někdo jak na to?

  5. 5 Radek Hulán 10.10.06, 09:10:12
    FB

    [1] archivace článku, jeho offline čtení (divil by ses, kolik lidí to potřebuje), přenos článku do PDA pro jeho pozdější čtení, atd.

  6. 6 brozkeff 10.10.06, 09:10:51
    FB

    Vygenerované PDF má v sobě nějak podivně embeddované fonty, pokud vůbec nějak - při vypnutí volby "Používat lokální písma" se fonty v dokumentu celkem zprasí...

  7. 7 I.C. 10.10.06, 10:10:14
    FB

    Možná jsem správně nepochopil význam tohoto článku, ale správně je jen application/octec-stream a nic jinýho. Pokud aplikace ignoruje tenhle MIME type, tak je to její chyba. Přiřazení MIME je snad jednou jasně definovaný v RFC a hotovo, nebo ne? Každopádně pdf by se měl posílat jen jako application/pdf a je jen na aplikaci (a hlavně na jejím nastavení, který múže mít každý uživatel jak sám chce), jak s tímhle typem dat naloží.
    Jen pro zajímavost ... teď jsem si tohleto zkusil v IE 7 RC1, FF 1.5 i 2.0 a Opeře 9, vše v posledních updatech. Výsledek se dal očekávat, všechny to zkousnou ať už je tam cokoliv a vysvětlení je jednoduchý - všechny prohlížeče nekoukají na typ souboru, pokud mají v hlavičce uvedený, že ho mají nabídnout k uložení. Maximálně na ten typ mrknou, že by uživateli po stažení mohli nabídnout jeho otevření, ale to už spíš řeší podle koncovky souboru.
    Něco jinýho by to bylo, pokud by místo Content-Disposition: attachment bylo inline ... pak by musel prohlížeč koukat po způsobu, jak ty data zobrazit. Ale v tomhle případě by se stejně měl jako MIME použít application/pdf.

  8. 8 Ati 10.10.06, 10:10:20
    FB

    Dík , výborný počin, teď mohu všechny vaše pro mně důležité články bez problemu ukládat.

  9. 9 MildaEvilda 10.10.06, 10:10:29
    FB

    Zrovna tenhle článek se hodí vyexportovat do PDF. :-)

  10. 10 Drake 10.10.06, 11:10:05
    FB

    Njn, osobně by mě fakt zajímalo, kde MIME nadělá víc užitku než škody, protože teď mě nic nenapadá. Vůbec celý koncept posílat metadata souboru mimo samotný soubor je imho zcestný, MS systémům odjakživa stačila jenom přípona jména souboru.

  11. 11 Láďa 10.10.06, 11:10:57
    FB

    application/pdf by mělo fungovat ve všech browserech ne?

  12. 12 Tomik 10.10.06, 03:10:10
    FB

    [1] Já jej někdy (pokud jej dotyčný blog/web podporuje) používám pro tisk, protože všechny weby nemají vytvořený tiskový styl, nebo mi daný tisk. styl nevyhovuje, PDF většinou obsahuje důležité infomace v rozumné formě...

  13. 13 Kelis 22.11.06, 11:11:06
    FB

    Ahoj, neřešil jste někdo generování pdf přes třídu fpdf na webu který běží na SSL? Podle fpdf.org by to měla řešit úprava headers, ale nějak mi to nešlape a nebo jsem ještě nepřišel na správnou kombinaci úprav :)) Díky