Pdf-i genereerimine html-ist. Teine viis PDF-i loomiseks. Dokumentide printimiseks on uus, keskkonnasõbralik viis

Nüüd saate lisada aruandele pealkirja. FPDF-objekt kasutab mõistet "praegune asukoht", kuhu sisestatakse järgmine tekstiosa või muu element. Kuna soovite, et aruande pealkiri asuks lehe keskel, peate liigutama praeguse asukoha alla sellesse punkti, mis asub lehe ülaosast 160 mm kaugusel (väärtus salvestatakse lahtrisse $ reportNameYPos konfiguratsioonimuutuja). Selleks kasutage meetodit FPDF Ln(), mis lisab reavahetuse määratud kaugusele:

$pdf->Ln($reportNameYPos);

Kui te reavahetuse kõrgust ei määra, kasutatakse viimase kuvatud lahtri kõrgust.

Nüüd lisame aruande pealkirja. Teksti lisamiseks FPDF-i abil on mitu erinevat viisi. Meie puhul kasutame meetodit Cell(), mis muuhulgas muudab teksti tsentreerimise lihtsaks.

Cell() võtab järgmised argumendid (kõik valikulised):

  • Lahtri kõrgus ja laius. Vaikimisi on laius venitatud parema veeriseni ja kõrguseks on seatud 0.
  • Väljastatav tekstistring. Vaikimisi "".
  • Määrab, kas kuvada lahtri ümber ääris. See võib olla kas arv (0 = raam puudub, 1 = raami joonistamine) või string ühe või mitme parameetriga järgmisest loendist: "L" (vasakul), "T" (ülemine), "R" ( paremal) ja "B" (all). Vaikeväärtus: 0.
  • Kuhu praegune asukoht pärast lahtri kuvamist paigutada. Väärtus võib olla 0 (lahtrist paremal), 1 (järgmise rea algus) või 2 (allpool). Vaikeväärtus: 0.
  • Teksti joondamine. Võimalikud väärtused on "L" (joonda vasakule), "C" (joonda keskele) või "R" (joonda paremale). Vaikeväärtus: "L" .
  • Kas lahtri taust peaks olema värviga täidetud? tõene = täitke värviga, false = jäta taust läbipaistvaks. Vaikeväärtus: false.
  • Lingi URL. Kui see on määratud, muutub tekstiga lahter töötavaks lingiks teise ressursi juurde.

Nüüd, kasutades meetodit Cell(), sisestage aruande pealkiri ja joondage see keskele:

$pdf->

Lehe jaluse ja tutvustava teksti loomine

Niisiis, tiitelleht on valmis. Nüüd peame looma lehe, millel on jalus, päis ja sissejuhatav tekst, millele järgneb tabel ja graafik.

Loome lehe jaluse. Lisame uue lehe, seejärel kuvame päise teksti, mis sisaldab aruande pealkirja, on joondatud lehe keskele ja kasutab Arial fondi suurust 17. Teksti värvi määramiseks kasutame konfiguratsioonimuutujat $headerColour:

$pdf->Lisa leht(); $pdf->SetTextColor($headerColour, $headerColour, $headerColour); $pdf->SetFont("Arial", "", 17); $pdf->Cell(0, 15, $aruandeNimi, 0, 0, "C");

Liigume nüüd teksti juurde. Esmalt kuvame pealkirja tavalise värviga ja Arial fondisuurusega 20. Kuna me ei pea teksti tsentreerima, saame kasutada lihtsat Write() meetodit, edastades selle väljundisse rea kõrguse ja teksti (saate ka valikuliselt edastage lingi moodustamiseks URL):

$pdf->SetTextColor($tekstivärv, $tekstivärv, $tekstivärv); $pdf->SetFont("Arial", "", 20); $pdf->Write(19, "2009 oli hea aasta");

Nüüd saate kuvada tutvustusteksti Arial fondisuuruses 12. Esimesest lõigust on vahed 16 mm ja lõikude vahel 12 mm. Määrake iga rea ​​kõrguseks 6 mm:

$pdf->Ln(16); $pdf->SetFont("Arial", "", 12); $pdf->Write(6, "Hoolimata majanduslangusest oli WidgetCo-l aasta tugev. Eelkõige ületas HyperWidgeti müük ootusi. Neljas kvartal oli üldiselt kõige paremini toimiv; see oli tõenäoliselt tingitud meie suurenenud reklaamikuludest III kvartalis "); $pdf->Ln(12); $pdf->Write(6, "2010. aastal eeldatakse müügi kasvu suurenemist, kui laieneme teistesse riikidesse.");

Meetod Write() liigutab teksti automaatselt järgmisele reale, kui see jõuab lehe paremasse serva.

Andmete lisamine

Nüüd tuleb teksti alla lisada andmetega tabel. Esmalt määrame tabeli äärise värvi. SetDrawColor() meetod määrab ääriste ja muude joonte jaoks kasutatava värvi, nii et saame seda kasutada tabeli lahtrite ääriste värvi määramiseks. Seejärel langetame praegust asukohta 15 mm võrra allapoole, et luua teksti ja tabeli vahele tühik:

$pdf->SetDrawColor($tableBorderColour, $tableBorderColour, $tableBorderColour); $pdf->Ln(15);

Tabeli päiserea loomine

Tabelis on rida, mis sisaldab lahtrites veerupäiseid "TOOTE", "Q1", "Q2", "Q3" ja "Q4". Lahter "TOOTE" kasutab teistest pealkirjadest erinevat teksti ja taustavärvi.

Oleme teksti värvi määramiseks juba kasutanud meetodit SetTextColor(). Taustavärvi määramiseks tuleb kasutada meetodit SetFillColor(), millel on samad argumendid nagu SetTextColor().

Tabelilahtrite loomiseks kasutage meetodit Cell(), mis määrab lahtri laiuse ja kõrguse, sisu ja joonduse. Samuti 1 läbimine 4. argumendina piiri määramiseks ja tõene 7. argumendina tausta täitmiseks määratud värviga.

Allpool on kood päiserea loomiseks. Esmalt määratakse paks font. Seejärel luuakse sobiva teksti ja taustaga lahter "PRODUCT". Seejärel määrab see ülejäänud 4 päiselahtri värvi ja liigub läbi massiivi $columnLabels elementide, et väljastada lahtrid, mille tekst on keskel joondatud:

// Loo tabeli päise rida $pdf->SetFont("Arial", "B", 15); // Lahter "PRODUCT" $pdf->SetTextColor($tableHeaderTopProductTextColour, $tableHeaderTopProductTextColour, $tableHeaderTopProductText Color); $pdf->SetFillColor($tableHeaderTopProductFillColour, $tableHeaderTopProductFillColour, $tableHeaderTopProductFillColour); $pdf->Cell(46, 12, " TOODE", 1, 0, "L", tõsi); // Ülejäänud päiselahtrid $pdf->SetTextColor($tableHeaderTopTextColour, $tableHeaderTopTextColour, $tableHeaderTopTextColour); $pdf->SetFillColor($tableHeaderTopFillColour, $tableHeaderTopFillColour, $tableHeaderTopFillColour); jaoks ($i=0; $i Cell(36, 12, $veergSildid[$i], 1, 0, "C", tõsi); ) $pdf->Ln(12);

Tühik lahtri "PRODUCT" sisu alguses aitab tabeli lahtrisse taandada vasakpoolsest äärisest. Sama nippi hakatakse kasutama ka kõige vasakpoolsemas veerus oleva tootenimede puhul (kahjuks pole veel võimalik FPDF-i abil lahtri taanet kontrollida).

Andmetega ridade loomine

Ülejäänud tabel koosneb 4 reast müügiandmetega (üks rida toote kohta) 4 kvartali kohta. Esiteks määratleme paar muutujat:

// Loo andmetega read $fill = false; $rida = 0;

Muutujaid kasutatakse:

    $fill: täitke lahtri taust värviga või mitte. Me muudame seda väärtust pärast iga rea ​​väljastamist, et saavutada tabelis sebra triibu efekt.

    $rida: praeguse rea number. See võimaldab teil tabelis liikudes kuvada igale reale vastava numbri.

Nüüd saame läbida $data massiivi elemente, kasutades ridade väljundiks foreach. Iga rea ​​jaoks loome vasakpoolse lahtri, mis sisaldab toote nime ja nelja lahtrit andmetega. Määrake iga lahtri jaoks sobivad teksti- ja taustavärvid.

Andmerakkude kuvamiseks kasutame neljaelemendilise andmemassiivi itereerimiseks for-silmust ja tuhandete eraldatud vormingus andmete kuvamiseks kutsume välja PHP funktsiooni number_format().

Pärast rea printimist suurendage muutujat $row, lülitage muutuja $täitmine sisse ja kasutage Ln(), et liikuda järgmise rea algusesse.

Siin on kogu tsükli kood:

Foreach ($andmed kui $dataRow) ( // Looge vasak lahter reapäisega $pdf->SetFont("Arial", "B", 15); $pdf->SetTextColor($tableHeaderLeftTextColour, $tableHeaderLeftTextColour, $tableHeaderColourLeftText ); $pdf->SetFillColor($tableHeaderLeftFillColour, $tableHeaderLeftFillColour, $pdf->Cell(46, 12, " " . $rowLabels[$row], 1, 0, "L", $fill); Looge lahtrid andmetega $pdf->SetTextColor($textColour, $textColor, $textColor($tableRowFillColour, $tableRowFillColour, $tableRowFillColour), $pdf->SetFont("Arial", "", 15). ); for ($i=0; $i Cell(36, 12, ("$" . number_format($dataRow[$i])), 1, 0, "C", $fill); ) $rida++; $täitke = !$täitke; $pdf->Ln(12); )

Graafiku koostamine

Meie aruande viimane element on tulpdiagramm, mis kuvab nelja toote kokkuvõtte kogu aasta kohta.

Veeru mõõtkava ja laiuse arvutamine

Esiteks peate arvutama X- ja Y-telgede skaala. X-skaala jaoks jagatakse toodete arv lihtsalt graafiku soovitud laiusega (vasakule ja paremale on vaja teha väike polsterdus). parem välimus):

/*** Diagrammi koostamine ***/ // Arvutage skaala piki X-telge $xScale = count($rowLabels) / ($chartWidth - 40);

Y-telje skaala arvutamiseks peate leidma iga toote koguväärtuse ja seejärel määrama nende hulgast maksimaalse väärtuse. Seejärel saab maksimumi jagada soovitud graafiku kõrgusega, et saada Y-skaala väärtus:

// Arvutage skaala piki Y-telge $maxTotal = 0; foreach ($andmed kui $dataRow) ( $totalMüük = 0; foreach ($dataRow kui $andmelahter) $totalMüük += $andmelahter; $maxTotal = ($totalMüük > $maxTotal) ? $kokkuMüük: $maxTotal; ) $yScale = $maxTotal / $chartHeight;

Nüüd, teades skaalat piki X-telge, saate arvutada graafiku iga veeru laiuse (mm). See on X-telje skaala pöördväärtus, mida on veergude vahelise kauguse korraldamiseks vähendatud poolteist korda:

// Veergude laiuse arvutamine $barWidth = (1 / $xScale) / 1,5;

Teljejoonte ja siltide lisamine neile

Nüüd saate lisada X- ja Y-telje ridu, andmesilte ja teljesilte. Andmesiltide jaoks kasutame Arial fonti suurusega 10.

FDPF-is joone tõmbamiseks kasutage meetodit Line(), mis võtab neli argumenti: rea alguse X- ja Y-koordinaadid ning rea lõpu X- ja Y-koordinaadid.

X-telje jaoks tõmmake horisontaaljoon piki graafiku alaosa, jättes vasakpoolse Y-telje siltide jaoks 30 mm. Seejärel väljastame iga toote nime massiivi $rowLabels tekstilahtrina vastavas punktis:

// Telgede lisamine: $pdf->SetFont("Arial", "", 10); // X-telg $pdf->Line($chartXPos + 30, $chartYPos, $chartXPos + $chartWidth, $chartYPos); jaoks ($i=0; $i< count($rowLabels); $i++) { $pdf->SetXY($chartXPos + 40 + $i / $xScale, $chartYPos); $pdf->Cell($barWidth, 10, $rowLabels[$i], 0, 0, "C"); )

SetXY() meetod võimaldab teil määrata praeguse asukoha lehel soovitud asukohta.

Y-telje jaoks tõmmake graafikust vasakule vertikaalne joon, jättes Y-telje andmesiltide jaoks vabaks 30 mm Tee teljejoon 8 mm võrra suurem kui graafiku soovitud kõrgus, et jääks ruumi telje kuvamiseks silt. Seejärel liigume nullist maksimaalse andmeväärtuseni $maxTotal, mis määratleti varem. Sammu suurus määratakse muutujas $chartYStep (20 000). Igas etapis kuvame paremale joondatud rea praeguse väärtuse ja lühikese sildi:

// Y-telg $pdf->Line($chartXPos + 30, $chartYPos, $chartXPos + 30, $chartYPos - $chartHeight - 8); jaoks ($i=0; $i<= $maxTotal; $i += $chartYStep) { $pdf->SetXY($chartXPos + 7, $chartYPos - 5 - $i / $yScale); $pdf->Cell(20, 10, "$" . number_format($i), 0, 0, "R"); $pdf->Line($chartXPos + 28, $chartYPos - $i / $yScale, $chartXPos + 30, $chartYPos - $i / $yScale); )

Nüüd saate lisada telje silte. Kasutame Arial paksus kirjas suurust 12. X-telje sildi asetame andmesiltide alla ja Y-telje sildi Y-telje ülaossa:

// Teljesildide lisamine $pdf->SetFont("Arial", "B", 12); $pdf->SetXY($chartWidth / 2 + 20, $chartYPos + 8); $pdf->Cell(30, 10, $chartXLabel, 0, 0, "C"); $pdf->SetXY($chartXPos + 7, $chartYPos - $chartHeight - 12); $pdf->Cell(20, 10, $chartYLabel, 0, 0, "R");

Graafiku veergude kuvamine

Viimane etapp on ajakava ise koostamine. Veergude väljastamiseks kasutage meetodit FPDF Rect(), mis väljastab ristküliku. Meetod kasutab järgmisi argumente:

  • Ristküliku ülemise vasaku nurga X ja Y koordinaadid.
  • Ristküliku laius ja kõrgus.
  • Ristküliku stiil. Võib sisaldada väärtusi "D" või "" (joonista joon), "F" (täitke praeguse taustavärviga) või "DF" / "FD" (joon ja täitmine).

Nüüd kuvame veerud. Seadistame muutuja $xPos, mis jälgib hetkeasendit X-s. Määrake see 40 mm-ks, võttes arvesse Y-telje siltide kaugust ja esimese veeru taanet. Nüüd loome $bar muutuja, mis sisaldab praegust veeru numbrit. Seda kasutatakse veeru värvi määramiseks:

// Veergude loomine $xPos = $chartXPos + 40; $bar = 0;

Nüüd liigume läbi $data massiivi, arvutame iga rea ​​koguväärtuse ja prindime X-teljelt selle väärtuseni veeru, mida skaleerib $yScale. Iga veeru värvi muudetakse $bar loenduri abil, mis on massiivi $chartColours indeks. Pärast praeguse veeru kuvamist liigutage X-positsioon järgmise veeru algusesse, suurendage $-riba loendurit ja jätkake tsüklit:

Foreach ($data kui $dataRow) ( // Arvutage toote andmerea koguväärtus $totalSales = 0; foreach ($dataRow kui $dataCell) $totalSales += $dataCell; // Looge veerg $colourIndex = $bar % count ($chartColors->SetFillColor($chartColours[$colourIndex], $chartColours[$colourIndex] $pdf->Rect($xPos, $chartYPos);); $totalSales / $ yScale), $barWidth, $totalSales / $yScale, "DF"; $xPos += (1 / $xScale);

Kood kasutab PHP modulo (%) operaatorit veeru värvi kordamiseks, kui veergude arv ületab massiivi $chartColours elementide arvu.

PDF-dokumendi saatmine brauserisse

PDF-dokument on valmis! Jääb üle vaid see brauserisse saata, et kasutaja saaks seda vaadata või alla laadida.

Selleks kasutatakse meetodit FPDF Output(). Selleks on vaja kahte argumenti: PDF-faili kavandatud nimi ja sihtkoha lipp. See lipp võib võtta järgmisi väärtusi:

    I: Kui brauser seda funktsiooni toetab, edastage ekraanile PDF, vastasel juhul laadige alla.

    D: Laadige alla PDF.

    F: salvestage fail serveri kausta.

    S: tagastab PDF-i andmed stringina.

Meie näites kasutage võimalusel PDF-i ekraanile väljastamiseks valikut I:

/*** Väljund PDF ***/ $pdf->Väljund("aruanne.pdf", "I"); ?>

Output() saadab automaatselt HTTP-päise "Content-type: application/pdf", mis annab brauserile märku PDF-dokumendi ootamisest.

Nüüd olete valmis skripti testima. Avage brauser ja minge URL-ile, kus skript asub, näiteks www.example.com/report.php. Peaksite oma brauseriaknas nägema PDF-faili. Või ilmub dialoogiboks, mis palub teil PDF-dokument kõvakettale salvestada. Seejärel saate PDF-faili avada PDF-vaaturis (nt Acrobat Reader või Eelvaade).

PDF-dokumendi loomiseks vajate ainult PHP-d ja FPDF-i.

Järeldus

Selles õpetuses õppisite, kuidas kasutada PHP-d koos FPDF-i teegiga PDF-vormingus aruande loomiseks. Demonstreeriti FPDF teegi meetodeid teksti, tabelite ja graafikute genereerimiseks.

FPDF-i teek saab aga teha palju enamat, näiteks luua lehtedele päiseid ja jaluseid, kasutada lehe automaatset navigeerimist jne. Vaadake raamatukogu dokumentatsiooni FPDF veebisaidil.

Esmakordselt veebisaidil PDF-dokumentide loomise ülesandega silmitsi seistes alustab iga programmeerija (loodetavasti) oma teekonda valmislahenduste otsimisega, nimelt raamatukogu, mis talle need võimalused pakuvad. Mul oli vaja PHP-s raamatukogu, et mitte tulevikus keeruline olla, kuna sait töötas PHP-s. Samuti sooviksin, et see oleks tasuta ja võimaldaks teil seda vabalt ärilistel eesmärkidel kasutada. Leidsin teavet 3 valiku kohta:

PDFLib tasuta versioonis ei toeta utf-8, mis on halb. FPDF-iga on peaaegu sama lugu, nii et ma loobusin neist valikutest kohe ega hakanud nendega vaeva nägema. Internetis on TCPDF-i kohta palju teavet. See teek sisaldub ka paljudes populaarsetes CMS-ides.

Seal on versioonid PHP4 ja PHP5 jaoks. Mul on vaja A.

Pakime arhiivi lahti. Tcpdf-i kataloogis näeme järgmist failide ja kataloogide loendit:

Cache config doc - dokumentatsioon (saab välja visata, et oleks lihtsam) näited - saab välja visata ka fontide pildid 2dbarcodes.php barcodes.php htmlcolors.php tcpdf.php unicode_data.php tcpdf.crt tcpdf.fdf CHANGELOG.TXT LICENSE. TXT README.TXT

TCPDF sisaldab dokumendis dokumendi loomisel kasutatud fonte. Need fondid asuvad fontide kataloogis. Iga font vastab kolmele failile:

Fondi_nimi.php fondi_nimi.z fondi_nimi.ctg.z

Kirillitsa fonte seal pole, mis meile muidugi ei sobi. Kui kavatsete dokumendis kasutada kirillitsat, saate kustutada kõik peale helvetica.php, kuna seda kasutab vaikimisi raamatukogu, ja kausta utilis, kus asub kõik vajalik kirillitsa fontide ettevalmistamiseks.

Oletame, et vajame tavalist Arial fonti. Võtke Arial font (fondi stiil - tavaline) Windowsi süsteemikaustast (näiteks) - fail arial.ttf - ja kopeerige see kausta fonts/utils.

Selles kaustas on utiliit ttf2ufm, kuhu peame söötma faili arial.ttf:

Php -q makefont.php arial.ttf arial.ufm

Kui teie kohalikul masinal pole PHP-i interpretaatorit, saate serveris käivitada järgmise faili:

Kui "söödasite" mitut faili ja soovite genereerida kõik kaustas olevad fondid (mille jaoks *.ufm failid loodi) korraga, käivitage makeallttffonts.php.

Pärast selle utiliidi käivitamist ilmub utiliidide kausta kolm faili: arial.php, arial.z, arial.ctg.z, mille peame teisaldama fontide kausta. Me ei vaja enam faile arial.ttf ja arial.ufm, nii et saame need turvaliselt kustutada.

Selle tulemusena valmistasime ette Arial fondi, mis lisatakse loodud PDF-failile. Kuid peate arvestama, et loodud PDF-dokumendi suurus suureneb ligikaudu arial.z fondifaili suuruse võrra. Arvestada tuleb ka sellega, et kui soovime kirjet kuvada kaldkirjas, tuleb selleks luua eraldi ariali font või paksus kirjas arialb.

On aeg luua meie dokument.

// loo uus PDF-dokument $pdf = new TCPDF("P", "mm", "A4", true, "UTF-8", false);
// dokumendi info määramine $pdf->SetAuthor("Sinu nimi"); $pdf->SetTitle("Meie dokumendi pealkiri");
// päise vaikeandmete määramine $pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE, PDF_HEADER_STRING);
// määrake päise ja jaluse fondid $pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, "", PDF_FONT_SIZE_MAIN)); $pdf->setFooterFont(Massiiv(PDF_FONT_NAME_DATA, "", PDF_FONT_SIZE_DATA));
// määrake vaikimisi monospaced font $pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
//veeriste määramine $pdf->Veriste määramine(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT); $pdf->SetHeaderMargin(PDF_MARGIN_HEADER); $pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
//automaatsete leheküljevahede määramine $pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
// fondi määramine $pdf->SetFont("times", "BI", 16);
// lehe lisamine $pdf->AddPage();
// rea printimine kasutades Cell() $pdf->Cell(0, 12, "Näide 1", 1, 1, "C");
//PDF-dokumendi sulgemine ja väljastamine $pdf->Output("example_1.pdf", "I"); ?>

See on väga lihtne näide. Näidete kaust sisaldab palju keerukamaid näiteid, mis illustreerivad peaaegu kõiki teegi võimalusi.

Panen ka mõned kasulikud lingid:

    TCPDF-i dokumentatsioon Joomla osana http://www.tecnick.com/public/code/cp_dpage.php?aiocp_dp=tcpdf_docs

    Artikkel, mis mind omal ajal palju aitas ja mille materjale selle artikli kirjutamisel kasutasin

Kus võib sellest kasu olla? Kui teil on vaja genereerida veebirakenduses printimisvalmis faile, kasutades olemasolevat suvalist jäika malli: sertifikaadid, märgid, passid jne.

Miks PDF? PDF-vorming võimaldab luua dokumente, millel on mitmeid vaieldamatuid eeliseid: avatus, platvormideülene, laialt levinud ja, mis kõige tähtsam, andmeedastuse täpsus ja muutumatus kogu loomise, vaatamise ja printimise ahelas.

Mis on sool? SVG-failide kasutamine mallidena koos võimalusega asendada nõutud väljad ja seejärel teisendada PDF-vormingusse.

Mis kasu sellest on? Võimalus luua ja kiiresti redigeerida väga keerulisi malle tuttavates vektorredaktorites, nagu Adobe Illustrator, Corel Draw või Inkscape. Lihtne programmeerida ja kasutada ainult tasuta tarkvara. Teine oluline eelis on võimalus kleebitud tekstide jaoks läbipaistvalt kasutada UTF-8.

Mida selleks vaja on? Selle meetodi kasutamiseks vajate spetsiaalset serverit, millel on võimalus installida oma rakendusi (Inkscape ja GhostScript) ja täita süsteemikäske. Sel juhul töötab kõik nii Windowsi platvormil kui ka Linuxis.

Arvan, et lühike KKK on käsitlenud selle meetodi põhiprobleeme, nii et alustame kohe selle olemuse analüüsimist.

Nagu teate, on SVG vektorgraafika vorming tegelikult XML-fail, nii et juba loodud faili saab hõlpsasti redigeerida kõige lihtsamate programmeerimisvahendite abil. Kui kasutate SVG-faili jäiga mallina, on protsess oluliselt lihtsustatud, kuna me ei pea muutma dokumendi struktuuri, vaid peame asendama ainult vajalikud tekstiväärtused või base64 kodeeritud bitmaps.

Algse malli saate luua mis tahes vektorredaktoris, mis toetab svg-sse eksportimist: Adobe Illustrator, Corel Draw või Inkscape ise. Viimase kasutamine on soovitav, vähemalt viimases, viimistlusetapis, kuna lõppkokkuvõttes peab just tema tegema meile vajaliku ümberkujundamise.

Kui kasutate mallis rastrit, saate kasutada kahte meetodit: salvestage raster eraldi välisesse faili või manustatuna SVG-faili endasse. Kui peate esimesel juhul mallis rasterpilti muutma, saate faili muuta ka enne genereerimist. Faili manustatud pildi salvestamisel peaksite pildiobjekti URL-i atribuuti kirjutama järgmise rea:

kus (IMAGE) on väli mallimootori jaoks, et sisestada base64 kodeeritud kujutis.

Näiteks joonistame lihtsa märgi malli, ma arvan, et annate mulle andeks, et ma olen kõver, ma pole kunstnik, kuid reaalseks kasutamiseks võite tellida oma disainerilt vektorpaigutuse.


Ma ei kasutanud muudetava suurusega bitmapi, jättes selle kodutöö hooleks ja piirdusin lihtsalt muudetava suurusega tekstiväljadega.

Arvan, et olete juba märganud, et mallimootori sildid sisestatakse kohtadesse, kus eeldatav tekst peaks olema kirjutatud (selles näites kasutasime ). Just XML-iga ühilduvate siltide kasutamine võimaldab neid vektorredaktoris endasse kirjutada ilma täiendavat redigeerimist kasutamata.

Meil on mall ja saame vajalikud andmed probleemideta sisestada, kuid kuidas me tegelikult teisendame? Selleks kasutame Inkscape'i käsurea liidest:

#teisenda PDF-iks
inkscape -A

Kasutades võtit " -A“Saame kohe PDF-faili, kuid kahjuks on otse loodud PDF väga suur. Selle probleemi lahendamiseks võite võtta lahenduse. Nimelt kasuta SVG eksporti mitte otse PDF-i, vaid ahelat pidi SVG->PS->PDF. Kasutades lõpliku PDF-faili genereerimiseks Ghost Scripti komplekti ps2pdf-i utiliiti, saame lõpliku faili suurust kümneid kordi vähendada.
#teisenda PostScript-failiks
inkscape -P
#teisenda PostScript-fail PDF-iks
ps2pdf

Ainus negatiivne külg on see, et sel juhul kaotame kõik läbipaistvusefektid, kuna PostScripti vorming seda ei toeta.

Loodud dokumentide täielikuks teisaldamiseks saate lisada valiku " -T» Teisenda kogu tekst kõverateks. Nii saame lahti probleemidest, mis on seotud fontide olemasoluga klientmasinas, aga ka probleemidest kodeeringustega.

Nüüd on meil kõik, mida vajame: SVG-mall ja teisenduskäsud. Kirjutame PHP-skripti, mis väljastaks mallist genereeritud pdf-faili.

/* ****************************************************************************************
* Skript pdf-pääsufaili genereerimiseks järjestikuse teisendamise abil
* mall svg-failiks, mille järel Inkscape teisendab selle PostScript-failiks,
* ja viimane teisendatakse ps2pdf utiliidi abil pdf-iks.
*
* Autor: Shebastyuk V.V. a.k.a. JStingo
* **************************************************************************************** */

/* skripti parameetrid */

//Tee ajutiste failidega kausta
//(kui pole määratud, salvestatakse failid süsteemi ajutisse kausta)
$tmp_dir = "" ; //loob ajutiste svg-, ps- ja pdf-failide teed
$tmp_svg_file = tempnam ($tmp_dir, "" );
$tmp_ps_file = tempnam($tmp_kataloog, "");
$tmp_pdf_fail = tempnam($tmp_kataloog, ""); /* Mallimootor FastTemplate */
include( "include/cls_fast_template.php");
$tpl = new FastTemplate("mallid");try( /* Blokeeri malli jaoks saadud andmetega */
/* ........................... */
$kasutaja_nimi = "JStingo" ;
$registri_kuupäev = "28/09/2007" ;
/* ........................... */
/* moodustavad tulemuseks oleva faili nime kujul Kasutajanimi.pdf */
$pdf_faili_nimi = $kasutaja_nimi . ".pdf" ; /* malli töötlemine ja saadud faili hankimine */$tpl -> define (massiiv("svg" => "template.svg" ));
$tpl -> assign (massiiv("USER_NAME" => $kasutaja_nimi,
"R_DATE" => $registri_kuupäev
));
$tpl -> parse ("SVG" , "svg" ); //salvestage saadud svg-fail
$tpl -> FastWrite ("SVG" , $tmp_svg_file ); //teisendab svg-faili inkscape abil ps-failiks
//Võtmed
// -T - teksti teisendamiseks kõverateks (tavalise fondi toe jaoks)
// -P – näitab vajadust teisendada PostScript-failiks
system( "inkscape -T $tmp_svg_file -P $tmp_ps_file", $edu );if($edu != 0 )
viska uus erand ( "Viga ps-faili loomisel.");//teisendab ps-faili pdf-vormingus utiliidi ps2pdf abil

//Võtmed
// -dUseFlateCompression=true – määrab tihenduse kasutamise
// -dPDFSETTINGS=/printer – määrab printimise optimeerimise

system( "ps2pdf -dUseFlateCompression=true -dPDFSETTINGS=/printer $tmp_ps_file $tmp_pdf_file", $edu ); //kui teisendamine ebaõnnestub, tee erand
if($edu != 0)
viska uus erand ( "PDF-faili loomisel tekkis viga.");// päis, mis ütleb, et saadame pdf-faili
päis ( "Sisu tüüp: rakendus/pdf");// Nimetatakse nagu $pdf_faili_nimi
päis ( "Sisu paigutus: manus; failinimi="". $pdf_faili_nimi . """ ); // teisaldage loodud fail
loefail($tmp_pdf_fail); //kustuta ajutised failid
@unlink($tmp_svg);
@unlink($tmp_ps_file);
@unlink($tmp_pdf_file);catch(Erand $e)(
/* Kui kuskil ilmneb viga, anname sellest teada */
$tpl -> define (array("error" => "error.tpl" ));
$tpl -> määra ("VIGA" , $e -> getMessage () $tpl -> parse ( "VIGA" , "viga");
$tpl -> FastPrint("VIGA");
}
?>

Arvan, et skripti mõnes muus programmeerimiskeeles ümber kirjutamine ei ole kellelegi liiga keeruline.

Pdf-dokumentide genereerimine on veebiarenduses igapäevane ülesanne. Selliste dokumentide loend sisaldab arveid, arveid, poliitikaid ja muud. Selle probleemi lahendamiseks on palju valmis teeke, sealhulgas php jaoks. Näiteks mpdf, tcpdf ja paljud teised. Faili saab koostada nende teekide API abil, kuid see on üsna pikk ülesanne. Ja ülesande täitmiseks pole kunagi liiga palju aega, eks? Seetõttu luuakse enamasti pdf-fail html-esitlusest, mis on üsna mugav. Kuid kahjuks pole kõik nii lihtne. Sellel lähenemisviisil on palju lõkse, mis võivad kedagi vihastada.

Näiteks:

  • Stiile ei saa eraldi kaasata, seetõttu tuleb need lisada HTML-dokumendisse eraldi plokina või iga elemendi sees. Selles pole midagi halba, lihtsalt väike ebamugavus.
  • Kahjuks ei pruugi mõned stiilid sellistes teekides ootuspäraselt töötada või ei pruugi üldse töötada. See on peamine puudus.
  • Eelmisest lõigust järeldub, et nõuetele kõige paremini vastava dokumendi loomine on väga töömahukas ja mõnikord lihtsalt võimatu.
  • Ja Bitrixi arendamise puhul on veel üks probleem. Kõik teavad, et platvormi toimimiseks on vaja php.ini parameetri mbstring.func_overload väärtuseks seada 2. Ja kirillitsa tähestikku sisaldava pdf-faili loomiseks on vaja väärtust 0. Tavaliselt on see probleem lahendatud veebiserveri seadistamisega, kuid see on siiski ebameeldiv.

Taas kord sellise ülesande ees seistes mõtlen üha enam, et pdf-failide genereerimisega peaks tegelema eraldi mikroteenus, eriti kui projekt on mahukas, aga see on hoopis teine ​​lugu.

On aeg liikuda edasi selle artikli põhiosa juurde. Lisaks ülaltoodud võimalustele on ka alternatiiv - PhantomJS.

PhantomJS on WebKiti mootori konstruktsioon ilma graafilise liideseta, mis võimaldab laadida veebilehte konsoolirežiimis, käivitada JavaScripti ja töötada täielikult DOM-i, Canvase ja SVG-ga.

Loomulikult võimaldab see lisaks ülaltoodud funktsioonidele luua PDF-faile.

Kuidas? Lihtsamalt öeldes laadib see alla vajaliku veebilehe ja annab teile võimaluse salvestada tulemus pdf-failina.

PhantomJS-i installiprotsessi on dokumentatsioonis piisavalt üksikasjalikult kirjeldatud, nii et ma sellel teemal pikemalt ei peatu.

PhantomJS-i töös on oluliseks punktiks js-fail (edaspidi config.js), mis oma sisu järgi määrab, mida me täpselt teha tahame. Ametlikul veebisaidil on selliste failide kohta palju valmis näiteid, mille abil lahendatakse mitmesuguseid ülesandeid, näiteks üksuse testimine. Näited hõlmavad veebilehe salvestamist pdf-vormingus. See on täpselt see, mida me vajame.

Paar väikest muudatust võimaldavad meil seda näidet oma eesmärkidel kasutada.

var page = nõuda("veebileht"). loo(), süsteem = nõuda("süsteem"), aadress, väljund, suurus; //kui argumente on vähe või liiga palju, kuvatakse teade kasutamise abiga if (süsteem . args . pikkus< 3 || system . args . length >5) (console.log( "Kasutus: config.js URL-i failinimi"); konsool. log( " paberi (pdf-väljundi) näited: "5 tolli * 7,5 tolli", "10 cm * 20 cm", "A4", "kiri""); konsool. log( " pilt (png/jpg väljund) näited: "1920px" terve leht, akna laius 1920px"); konsool. log( "800px*600px" aken, kärbitud suurusele 800x600"); fantoom. väljumine(1); ) muidu ( // argumentide töötlemine aadress = süsteem. args[1]; väljund = süsteem . args[2]; lehel. vaateava suurus = (laius: 800, kõrgus: 800); if (süsteem . args . pikkus > 3 && süsteem . args [ 2 ]. substr (- 4 ) === ".pdf" ) ( suurus = süsteem . args [ 3 ]. split ("*" ); leht . paberSuurus = (suurus . pikkus === 2 ) ? ( laius : suurus [ 0 ], kõrgus : suurus [ 1 ], veeris : "0px" ) : ( formaat : süsteem . args [ 3 ], orientatsioon : "portree" , veeris : " 1cm" ) else ( konsool . logi ( " Vigane tee pdf-i!" ); fantoom . exit ( 1 ); ) if ( süsteem . args . pikkus > 4 ) ( lk . zoomFactor = süsteem . args [ 4 ) ]; // lehe avamine ja tulemuse salvestamine lehel. avatud (aadress , funktsioon (olek) ( if (staatus !== "edu" ) ( konsool . logi ("Aadressi ei saa laadida!" ); fantoom . exit (1 ); ) else ( aken . setTimeout (funktsioon () ) ( lk . render ( väljund ); fantoom . välju ( ); , 200 ) ); )

$ phantomjs path/to/config.js "url" path/to/pdf/file "A4"

Vaatame argumente järjekorras:

  1. Config.js-i tee.
  2. Selle veebilehe aadress, mis tuleb teisendada pfd-failiks.
  3. Selle pdf-faili tee, kuhu tulemus salvestatakse.
  4. PDF-faili formaat.

Saame vajaliku pdf-faili.

Tulles tagasi php juurde, siis seda lahendust on üsna lihtne oma koodi integreerida.

Lihtsamal juhul näeb see välja järgmine:

$käsk = sprintf( "phantomjs %s %s %s %s", $fullPathToConfigJS, $url, $fullPathToSave, $format ); exec($ käsk);

Niisiis, lubage mul teha kokkuvõte. Minu arvates on sellel lahendusel järgmised eelised:

  • Tee sellisele dokumendile kujundus palju lihtsam. See on väga oluline, sest... mitte ainult ei lihtsusta arendust, vaid ei muuda ka järgnevaid dokumendimuudatusi õudusunenäoks.
  • Kaotab vajaduse mbstring.func_overload jamamisega. Kuid see on kahtlemata peamiselt Bitrixi jaoks tüüpiline probleem.

Muidugi on ka puudusi:

  • Mitte 100% kõigi CSS-stiilide tugi. Kuid võrreldes artikli alguses loetletud raamatukogudega on kõik väga hea.
  • See lahendus võib algaja arendaja eemale peletada.
03.12.2015