Изборник Затворити

Креирање ПДФ документа у ПХП са tfpdf, fpdf и fpdi

Скраћена веза: https://pedja.supurovic.net/veza/8667

Потребно вам је да на сајту генеришете ПДФ документ који је предефинисани образац а посетилац сајта само треба да га попуни? Ево како сам ја то урадио. Вероватно ће и вама бити корисно.

Поступак се своди на отварање ПДФ документа, учитавање стране из њега која садржи већ припремљен образац и затим уписивање додатног садржаја у ту страну, на местима која су предвиђена за попуњавање.

За креирање ПДФ докумената може се употребити одлична библиотека FPDF . Библиотека садржи ПХП класу која програмеру омогућава креирање ПДФ докумената на високом нивоу, односно, да се не мора бавити структуром и форматом ПДФ документа, већ све обавља позивањем медота ове класе – смешта садржаје на страну документа тамо где жели и како жели. Библиотека је отвореног кода.

Једини недостатак овде библиотеке је што не подржава кодну страну УТФ-8 а тиме ни креирање докумената на нашем језику, ћирилицом и латиницом. Због тога је направљена верзија бибилиотеке TFPDF а која подржава УТФ-8. Мени је требало да креирам документе на нашем језику, па сам употребио сам ову другу библиотеку. Само је преузмите и распакујте архиву у директоријум tfpdf.

Нисам хтео да програмски цртам цео документ већ сам унапред припремио образац у графичком програму и снимо га у ПДФ датотеку.  Употрeбио сам библиотеку FPDI , која је направљена као проширење за FPDF и омогућава учитавање постојећих ПДФ докумената да би се даље могли мењати. Она је такође отвореног кода. Преузмите је и распакујте из архиве у директоријум fpdi.

FPDI класа је направљена да ради са FPDF класом, а ја сам употребио TFPDF, тако да сам морао да направим ситну измену у коду датотеке fpdi/fpdi_bridge.php. На линији 24 оригинално стоји:

    class fpdi_bridge extends FPDF

а ја сам то променио у

    class fpdi_bridge extends tFPDF

подесивши тако да класа ради са TFPDF библиотеком.

Мање-више то је све што је било потребно да се уради да се добије окружење за рад. Сада је још само требало написати код који учитава ПФД документ и уписује у њега додатне податке. Даћу овде кратак пример.

За пoчетак потрeбан је ПДФ документ, спремио сам пример обрасца уплатнице под именом uplatnica.pdf.

Затим сам написао код који попуњава овај образац под именом uplatnica.php:

<?php

// учитај обе библиотеке
require_once ('tfpdf/tfpdf.php');
require_once ('fpdi/fpdi.php');

// инстаницирај објекат и отвори нову празну страну
$pdf = new FPDI();
$pdf->AddPage();

// учитај образац као шаблон стране
$pagecount = $pdf->setSourceFile("uplatnica.pdf");
$tpl = $pdf->importPage(1);

// примени шаблон на празну страну
$mPageInfo = $pdf->useTemplate($tpl);

// подеси референтне координате. СВе остале координате ће 
// бити релативне уодносу на ове тако да ће лако бити подесити
// приказ тачно на образац
$mRootX = 8;
$mRootY = 10;

// подеси врсту слова (DejaVu је део библиотеке, али 
// се може користити и било која друга врста слова)
$pdf->AddFont('DejaVu','','DejaVuSansCondensed.ttf',true); 
$pdf->SetFont('DejaVu','',10); 

// подеси висину једног реда. Тако е касније бити лакше 
// уписивати текст који иде у више редова
$mLineHeight = 5;

// подеси координате прве референтне тачке
$mX1 = $mRootX; $mY1 = $mRootY; 

// намести курсор на координате и упишемо податак
$pdf->SetXY($mX1,$mY1); 
$pdf->Cell(0, 0, "Пера Перић", 0, 0, 'L'); 

$pdf->SetXY($mX1,$mY1+($mLineHeight*1)); 
$pdf->Cell(0, 0, "Перина улица број 4, Перићград", 0, 0, 'L'); 

$mY2 = $mRootY + 20; 

$pdf->SetXY($mX1,$mY2); 
$pdf->Cell(0, 0, "Пера плаћа", 0, 0, 'L'); 

$pdf->SetXY($mX1,$mY2+($mLineHeight*1)); 
$pdf->Cell(0, 0, "све што треба да се плати", 0, 0, 'L'); 

$mY3 = $mRootY + 40; 

$pdf->SetXY($mX1,$mY3); 
$pdf->Cell(0, 0, "Прималац уплате", 0, 0, 'L'); 

$pdf->SetXY($mX1,$mY3+($mLineHeight*1)); 
$pdf->Cell(0, 0, "Прималачка бб, Примиград", 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, "РСД", 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'); 

// пошаљи припремљени документ веб читачу да га прикаже
$pdf->Output(); 

?>

Преузмите пример (пхп и пдф): uplatnica.zip (1549 downloads ) . Библиотеке преузмите посебно са њихових сајтова и ставите у предвиђене поддиректоријуме.

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…

    • Пеђа

      Када сам воо радио актуелан је био FPDI 1.6.1.

      Приметио сам на једном сајту да ми то више не ради, али је нека некомпатибилност са новијом верзијом PHP у питању. Никако нисам имао времена да погледам како то да решим.

  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

Оставите одговор

Ваша адреса е-поште неће бити објављена. Неопходна поља су означена *

Попуните израз тако да буде тачан: *

Ово веб место користи Акисмет како би смањило непожељне. Сазнајте како се ваши коментари обрађују.