Izbornik Zatvoriti

Kreiranje PDF dokumenta u PHP sa tfpdf, fpdf i fpdi

Potrebno vam je da na sajtu generišete PDF dokument koji je predefinisani obrazac a posetilac sajta samo treba da ga popuni? Evo kako sam ja to uradio. Verovatno će i vama biti korisno.

Postupak se svodi na otvaranje PDF dokumenta, učitavanje strane iz njega koja sadrži već pripremljen obrazac i zatim upisivanje dodatnog sadržaja u tu stranu, na mestima koja su predviđena za popunjavanje.

Za kreiranje PDF dokumenata može se upotrebiti odlična biblioteka FPDF . Biblioteka sadrži PHP klasu koja programeru omogućava kreiranje PDF dokumenata na visokom nivou, odnosno, da se ne mora baviti strukturom i formatom PDF dokumenta, već sve obavlja pozivanjem medota ove klase – smešta sadržaje na stranu dokumenta tamo gde želi i kako želi. Biblioteka je otvorenog koda.

Jedini nedostatak ovde biblioteke je što ne podržava kodnu stranu UTF-8 a time ni kreiranje dokumenata na našem jeziku, ćirilicom i latinicom. Zbog toga je napravljena verzija bibilioteke TFPDF a koja podržava UTF-8. Meni je trebalo da kreiram dokumente na našem jeziku, pa sam upotrebio sam ovu drugu biblioteku. Samo je preuzmite i raspakujte arhivu u direktorijum tfpdf.

Nisam hteo da programski crtam ceo dokument već sam unapred pripremio obrazac u grafičkom programu i snimo ga u PDF datoteku.  Upotrebio sam biblioteku FPDI , koja je napravljena kao proširenje za FPDF i omogućava učitavanje postojećih PDF dokumenata da bi se dalje mogli menjati. Ona je takođe otvorenog koda. Preuzmite je i raspakujte iz arhive u direktorijum fpdi.

FPDI klasa je napravljena da radi sa FPDF klasom, a ja sam upotrebio TFPDF, tako da sam morao da napravim sitnu izmenu u kodu datoteke fpdi/fpdi_bridge.php. Na liniji 24 originalno stoji:

    class fpdi_bridge extends FPDF

a ja sam to promenio u

    class fpdi_bridge extends tFPDF

podesivši tako da klasa radi sa TFPDF bibliotekom.

Manje-više to je sve što je bilo potrebno da se uradi da se dobije okruženje za rad. Sada je još samo trebalo napisati kod koji učitava PFD dokument i upisuje u njega dodatne podatke. Daću ovde kratak primer.

Za početak potreban je PDF dokument, spremio sam primer obrasca uplatnice pod imenom uplatnica.pdf.

Zatim sam napisao kod koji popunjava ovaj obrazac pod imenom uplatnica.php:

<?php

// učitaj obe biblioteke
require_once ('tfpdf/tfpdf.php');
require_once ('fpdi/fpdi.php');

// instaniciraj objekat i otvori novu praznu stranu
$pdf = new FPDI();
$pdf->AddPage();

// učitaj obrazac kao šablon strane
$pagecount = $pdf->setSourceFile("uplatnica.pdf");
$tpl = $pdf->importPage(1);

// primeni šablon na praznu stranu
$mPageInfo = $pdf->useTemplate($tpl);

// podesi referentne koordinate. SVe ostale koordinate će 
// biti relativne uodnosu na ove tako da će lako biti podesiti
// prikaz tačno na obrazac
$mRootX = 8;
$mRootY = 10;

// podesi vrstu slova (DejaVu je deo biblioteke, ali 
// se može koristiti i bilo koja druga vrsta slova)
$pdf->AddFont('DejaVu','','DejaVuSansCondensed.ttf',true); 
$pdf->SetFont('DejaVu','',10); 

// podesi visinu jednog reda. Tako e kasnije biti lakše 
// upisivati tekst koji ide u više redova
$mLineHeight = 5;

// podesi koordinate prve referentne tačke
$mX1 = $mRootX; $mY1 = $mRootY; 

// namesti kursor na koordinate i upišemo podatak
$pdf->SetXY($mX1,$mY1); 
$pdf->Cell(0, 0, "Pera Perić", 0, 0, 'L'); 

$pdf->SetXY($mX1,$mY1+($mLineHeight*1)); 
$pdf->Cell(0, 0, "Perina ulica broj 4, Perićgrad", 0, 0, 'L'); 

$mY2 = $mRootY + 20; 

$pdf->SetXY($mX1,$mY2); 
$pdf->Cell(0, 0, "Pera plaća", 0, 0, 'L'); 

$pdf->SetXY($mX1,$mY2+($mLineHeight*1)); 
$pdf->Cell(0, 0, "sve što treba da se plati", 0, 0, 'L'); 

$mY3 = $mRootY + 40; 

$pdf->SetXY($mX1,$mY3); 
$pdf->Cell(0, 0, "Primalac uplate", 0, 0, 'L'); 

$pdf->SetXY($mX1,$mY3+($mLineHeight*1)); 
$pdf->Cell(0, 0, "Primalačka bb, Primigrad", 0, 0, 'L'); 

$mX4 = $mRootX + 100; 
$mY4 = $mRootY + 4.5; 

$pdf->SetXY($mX4,$mY4); 
$pdf->Cell(11, 0, "221", 0, 0, 'C'); 

$pdf->SetX($mX4+16); 
$pdf->Cell(11, 0, "RSD", 0, 0, 'C'); 

$pdf->SetX($mX4+39); 
$pdf->Cell(0, 0, "00.000,00", 0, 0, 'L'); 

$mX5 = $mRootX + 120; 
$mY5 = $mRootY + 16.7; 

$pdf->SetXY($mX5,$mY5); 
$pdf->Cell(0, 0, "000-0000000000-00", 0, 0, 'L'); 

$mX6 = $mRootX + 100; 
$mY6 = $mRootY + 28.7; 

$pdf->SetXY($mX6,$mY6); 
$pdf->Cell(11, 0, "99", 0, 0, 'C'); 

$pdf->SetX($mX6+16); 
$pdf->Cell(0, 0, "00000000", 0, 0, 'L'); 

// pošalji pripremljeni dokument veb čitaču da ga prikaže
$pdf->Output(); 

?>

Preuzmite primer (php i pdf): uplatnica.zip (2401 downloads ) . Biblioteke preuzmite posebno sa njihovih sajtova i stavite u predviđene poddirektorijume.

4 Comments

  1. Mihailo

    Mozete mi reci koje verzije dependency-ja (biblioteka) ste koristili?

    Posto su u medjuvremenu azurirane pa im vise nisu kompatibilne neke metode…

    • Peđa

      Kada sam voo radio aktuelan je bio FPDI 1.6.1.

      Primetio sam na jednom sajtu da mi to više ne radi, ali je neka nekompatibilnost sa novijom verzijom PHP u pitanju. Nikako nisam imao vremena da pogledam kako to da rešim.

  2. Milan

    Hvala za ovaj kod. Da se dobije output iste velicine kao input pdf fajl:

    $tpl = $pdf->importPage(1);

    $templateSize = $pdf->getTemplateSize($tpl);
    $orientation = $templateSize > $templateSize ? ‘L’ : ‘P’;
    $pdf->AddPage($orientation, [$templateSize,
    $templateSize]);

    $mPageInfo = $pdf->useTemplate($tpl);

  3. Boban Mikičić

    Odlično rešenje. Ja sam još uradio upit da li je tfpdf da koristti tfpdf
    if (class_exists(‘tFPDF’, false)) {
    class fpdi_bridge extends tFPDF
    {
    // empty body
    }

    } elseif (!class_exists(‘TCPDF’, false)) {
    /**
    * Class fpdi_bridge
    */
    class fpdi_bridge extends FPDF
    {
    // empty body
    }

    } else {

    /**
    * Class fpdi_bridge
    */
    class fpdi_bridge extends TCPDF

Ostavite odgovor

Vaša adresa e-pošte neće biti objavljena. Neophodna polja su označena *

Popunite izraz tako da bude tačan: *

This site uses Akismet to reduce spam. Learn how your comment data is processed.