Takaisin php-ohjelmoinnin etusivulle


PHP: PDF-tiedostojen generointi PHP-kielellä



Kirjoitin ensimmäisessä palvelinpuolengenerointitutoriaalissani kuinka PHP:llä voi GD-kirjaston avulla generoida Thumbnails-kuvia. Samalla kävin läpi oleellisimpia asioita PHP:n ja XHTML-koodin sekä PHP:n ja Flash/AS3-koodin välisestä molemminsuuntaisesta kommmunikaatiosta. Käyn tässä tutoriaalissani lyhyesti läpi kuinka tehdä PHP-koodi ja AS3-koodi PDF-tiedoston luomiseksi palvelimelle. Lisäksi opastan latausdialogin avaamisen Flash-komponentista.

TARVITTAVAT KIRJASTOT, ESITIEDOT:

Toteuttamani ratkaisu (jota en voi tässä esittää) käyttää PDF:n generoimiseen FPDF-kirjastoa , joka siis tulee asentaa palvelimelle, jotta PDF-generointi onnistuu. Kaikeksi onneksi FPDF:n voi asentaa esim. purkamalla FPDF:n lähdekoodin vaikkapa PDF-generaattorinettisivujesi alihakemistoihin, joten varsinaisia järjestelmänvalvojan oikeuksia ei tuon asentamiseen siis tarvita.

Ensimmäinen tehtävä on siis ladata FPDF yllä olevasta linkistä ja asentaa se nettisivujen palvelimelle. Samalla on syytä silmäillä FPDF:n nettisivuilla olevia tutoriaaleja ja dokumentaatiota.

PHP-koodi:

Toteuttamassani Flash/PHP -ratkaisussa hoidetaan PHP/Flash -kommunikaatio perusperiaatteiltaan samalla tavalla kuin olen thumbnails-kuvien generointia selostavassa tutoriaalissani selostanut.

Alla olevassa tekstikentässä on koko Flashin kanssa kommunikointiin, tietojen tietokannasta hakemiseen, palvelimella sijaitsevien kuvien PDF:ään lisäämiseen ja PDF:n generoimiseen tarvittava php-skripti, joka on toimintansa monimuotoisuuteen nähden yllättävänkin lyhyt, n. 300 riviä koodia.

PHP-koodin oleeliset asiat:

1) Yhteys MySQL-tietokantaan muodostetaan lukemalla include-funktiolla tiedosto alustus.php.

2) FPDF saadaan käyttöön define- ja require-kutsuilla.

3) Flashista lähetetyt muuttujat löytyvät $_POST-taulukosta.

4) Ulkopuolelta PHP-skriptiin lähetettävää syötettä on hieman syytä suodattaa (ja mieluummin vielä enemmänkin kuin tässä).

5) Tietojen haku MySQL-tietokannan taulusta PHP-koodin avulla on erittäin helppoa.

6) Erilaisten kirjainkoodausten vuoksi stringejä joutuu joskus käsittelemään utf8_decode- ja utf8_encode-funktioilla ennen kuin esim. ääkköset toimivat oikein.

7) FPDF-luokan objekti luodaan ja tallennetaan PHP-muuttujaan $pdf.
8) Kaikki PDF:ään tehtävät muutokset tehdään FPDF-luokan jäsenfunktioita kutsumalla, siis tuon $pdf-muuttujan kautta. Esim. kuvan lisääminen PDF:ään
9) Kun PDF:n sisältö on luotu PHP-muuttujaan $pdf, niin PDF:n tallentaminen tiedostoon (siis palvelimelle) onnistuu helposti:
Jos taas PHP-skriptiä käytetään Flash-komponentin sijaan suoraan XHTML-sivulta voidaan luotu PDF-tiedosto, palvelimelle tallentamisen sijaan, "sylkeä" suoraan takaisin selaimelle, jolloin selain osaa käsitellä tilanteen avaamalla pdf-tiedoston (ainakin toivottavasti).

Tämä PDF:n selaimelle onnistuu komennolla:
10) Onnistuneen PDF:n generoinnin jälkeen "echotetaan" vielä pari muuttujaa takaisin Flash-komponentissa käsiteltäviksi.


Tässä alla on koko php-skripti kokonaisuudessaan:
FLASH-TOTEUTUS:

Periaatteessa Flashin kytkeminen tuohon yläpuolla olevaan PHP-skriptiin ja edelleen FileReference-luokan avulla avattavaan download-dialogi-ikkunaan on perin yksinkertaista. Eli luodaan Flashissa yksinkertainen nappi ja kytketään tähän (addEventListener) tapahtumankäsittelijä.

Mutta Flash Player 10:n uudet ominaisuudet, joista kirjoitetaan tässä , mutkistavat muuten niin yksinkertaisen asian.

Itse "ratkaisin" tuon ongelman käyttämällä ylimääräistä "Haluatko ladata tiedoston?" -dialogia. Eli ongelmanahan tuossa on se, että palvelimelle generoitavaa tiedostoa ei voi ladata samaa nappia painamalla (eli ennen kuin se on generoitu). Palvelimella jo valmiiksi olevan tiedoston lataaminen ei tuotta Flash Player 10:ssäkään ongelmia.

Oleellisia asioita alla olevassa AS3-koodissa ovat:

1) Tapahtumankäsittelijä (lataaPdfClicked) liitetään lataaPdfBtn-nimiseen (instance name) nappiin kutsumalla addEventListener-metodia.

2) PHP-skriptin suorittaminen (lataaminen) käynnistetään funktiossa createPdf.

3) Kun PHP-skripti create_pdf.php on suoritettu siirrytään tapahtumankäsittelijään lataaPdfCompleteHandler. Periaatteessa siis olisi järkevää laukaista download-dialogi juuri tästä tapahtumankäsittelijästä, mutta Flash Player 10 kieltää tämän. Joten avaan tässä ylimääräisen "Haluatko ladata tiedoston?" -dialogin.
"Haluatko ladata tiedoston?" -dialogin auettua Flash Playerissä on vielä erikseen toteutettava toiminnallisuus itse download-dialogille erillisestä napista käytettävän FileReference-luokan objektin avulla.

Onneksi ylimääräisen dialogi-ikkunan toiminnallisuuden tekeminen ei AS3:lla vaadi paljoa koodia:
Demonstroin vielä alla olevalla koodilla, että tavallisten JPG-kuvien lataamisen (palvelimelta käyttäjän kotikoneelle) ja tulostamisen toteuttaminen Flash-komponenteissa on tehty AS3-koodissa helpoksi.

Kuvien lataaminen onnistuu kytkemällä latausnappiin addEventListener-metodilla tapahtumankäsittelijä (tässä tapauksessa lataaKuvaClicked-funktio) ja latausdialogin avaaminen onnistuu helposti FileReference-luokan avulla.

Kuvien tulostamiseen taas voi käyttää PrintJob-luokkaa:


Lopuksi voin vakuuttaa, että yllä kuvattu ratkaisu PDF-tiedostojen generoimiseksi palvelimella (ja edelleen ladattavaksi käyttäjän kotikoneelle) toimii myös käytännössä.

Varsinaisen PDF-tiedoston luomisen helppoudesta PHP-skriptin sisällä voi sitten olla montaa mieltä.

Muita ilmaisia ratkaisuja PDF-tiedostojen generoimiseksi ovat R&OS ja Panda .

Ja kaupallinen ratkaisu PDFLib .

Lisäksi on olemassa pelkästään Flashia/AS3:sta käyttävä ratkaisu alivepdf .

Mikään noista yllämainituista ratkaisuista ei kuitenkaan vaikuta ainakaan ensisilmäyksellä aivan aivotnarikkaanratkaisulta, mutta ei kyllä kohtuuttoman työläältäkään...

Toivon, että tästä tutoriaalistani on hyötyä muillekin kuin allekirjoittaneelle muistiarkistona.

Takaisin PHP-ohjelmoinnin etusivulle