Kategórie
Technológie Tipy a triky

Elektronické PDF faktúry – ako nato

Doba čítania: 2 min.

Viacero našich klientov sa pýta, ako funguje náš systém generovania PDF faktúr, ich podpisovanie certifikátom a následne rozposlanie klientom. Tento systém nám ušetrí náklady na distribúciu papierových faktúr. Prichádzajú na to už aj veľké spoločnosti, ktoré postupne tiež prechádzajú na elektronické faktúry.

Pre menšie podniky existuje už niekoľko služieb, ktoré si môžete zaplatiť na mesačnej báze a pomocou nich generovať a spravovať svoje faktúry: SuperFaktura.sk, eFaktury.sk, pre Českú republiku napr. fakturoid.cz.  Keďže je záujem o tento typ služby, dohodli sme sa so Superfaktura.sk na ďalšom zákazníckom bonuse. Naši klienti si môžu vytvárať vlastné faktúry doživotne s 25% zľavou. S tými, ktorí to chcú spraviť na kolene ako my, sa podelíme o naše know-how.

Na generovanie PDF v php existuje veľa knižníc – či už open-source alebo platených. Väčšina z nich, bohužiaľ, funguje veľmi pomaly alebo na vygenerovanie potrebujú veľa RAM. My používame na generovanie PDF linuxovú utilitku HTMLDOC, ktorá generuje PDF z HTML stránok. Je voľne dostupná (napr. na rôznych repozitároch linuxových distribúcií), rýchla a jednoduchá na používanie.

Najskôr musíme skonvertovať content pre faktúru do kódovania ISO-8859-2:
$fakturaISO = iconv("UTF-8", "ISO-8859-2//TRANSLIT", $fakturaUTF);

Potom uložíme html-faktúru na disk:
file_put_contents($pathToHTMLfile, $fakturaISO, LOCK_EX);

Nakoniec dáme HTMLDOC pokyn na vygenerovanie PDF:
system('htmldoc --quiet --webpage --color --charset iso-8859-2 --bodyfont helvetica --embedfonts -t pdf14 --footer ... --size a4 --permissions none --permissions print --encryption '.$pathToHTMLfile.' -f '.$pathToPDFfile.'');

Na podpis PDF máme nakódený špeciálny signbot. Je to daemon v perli, ktorý komunikuje cez xmlrpc a archivuje všetky vygenerované a podpísané PDF. Týmto spôsobom vieme zistiť, čo bolo v minulosti podpísané. K daemonu existuje ešte konzolový klient sign_pdf.pl. Stačí mu podhodiť PDF a on ho dodatočne podpíše (na pozadí to komunikuje s daemonom). Tento klient spúšťa WebAdmin, keď sa podpisuje napr. vygenerovaná faktúra.

Na samotné podpísanie PDF (čo rieši daemon) sa používa PortableSigner, čo je open-source aplikácia v Jave, ktorá je určená na podpis PDF. Ešte pred podpísaním cez PortableSigner sa používa jeden opensource tool Qpdf, ktorý vie upraviť rôzne parametre PDF, napr. zapnúť šifrovanie, povoliť tlač a podobne. Každé vložené PDF sa preženie cez Qpdf a následne cez PortableSigner.

To je všetko. Už len dodám, že HTMLDOC má mnoho argumentov, ktorými sa dajú vlastnosti PDF meniť. Všetky nájdete v manuálových stránkach a v dokumentácii.

Autor: Michal Truban

Mišo je prirodzeným dôkazom toho, že poctivý biznis sa dá robiť aj v teniskách a bez zbytočných oficialít. Je zakladateľ WebSupportu, startupu Nicereply, InHiro či inteligentnej stoličky Neseda.

31 odpovedí na “Elektronické PDF faktúry – ako nato”

Pekny clanok, akurat mi tu nieje jasne to, ze v jednom odstavci sa riesi, ze na podpis je pouzity signbot z perlu a v dalsom je napisane, ze to riesi PortableSigner z Javy.
+ nedokaze priamo Qpdf generovat z html? Tym padom je mozne vypustit HTMLDOC.
btw thx 4 know-how 🙂

„musíme skonvertovať content pre faktúru do kódovania ISO-8859-2“ vzdy, ked vidim nieco taketo, nozik sa mi otvori. je na to nejaky dobry dovod?

htmldoc este ani dnes nerozumie kodovaniu UTF-8 (a to je tento standard stary dobrych 19 rokov). Ja by som vsak uz dnes na prevod HTML=>PDF odporucil wkhtmltopdf. htmldoc je totiz mega jednoduchy, nepozna ani CSS stylovanie cez HTML atributy. Naopak wkhtmltopdf je zalozeny na jadre webkit, cize mozete vyuzivat vsetky moderne CSS3 a HTML5 moznosti. Tiez sa uz dnes nachadza vo vacsine linuxovych distribucii. Uzivatelia MAC OS bohuzial musia kompilovat (homebrew, macports), ale pozor – nakolko v MAC OS nie je libwebkit, na beznych macbookoch to kompiluje velmi, velmi dlho.

Ahoj Michal, chcem sa spytat – my generujeme FA cez fakturacny program, normalne aj s naskenovanou peciatkou a mojim podpisom kedze firma je moja. Toto sa nasledne tlaci a posiela klientom. Chcem sa spytat keby som takuto FA poslal cez e-mail s tym ze si ju klient len vytlaci moze si ju dat do uctovnictva alebo tam musi byt certifikat alebo staci len naskenovana peciatka + podpis?

dakujem, igor

Skoda ze moji klienti to nevedia pochopit (aj velke spolocnosti) a vzdy si vyzaduju fakturu aj postou 🙁 Ked sa dokonca sem tam odvolam aj na Websupport ze takto funguju niekolko rokov a je to riadny doklad, tak nepochodim, stale musim chodit na postu jak taky kkt 😀 😀 😀 😀 21. storocie

Mna by tiez zaujimalo nieco viac o tom podpise. Treba si vybavovat nejaky specialny certifikat, ako pri SSL? Co vsetko musi taka faktura splnat, aby bola platna na Slovensku?

Inak ja som skusal UFPDF a zda sa, ze funguje celkom schopne. Ale konvertovat HTML do PDF je asi vyrazne jednoduchsie.

Ako pisal Michal, staci ked je vo vygenerovanom PDFku naskenovany podpis (priapdne peciatka, ale ta nie je zo zakona povinna – opravte ma ak sa mylim)
Specialny certifikat teda nepotrebujes.

nevidim do toho, ale naco je dobry digitalny podpis pdfka, ak vytlacena kopia je platna aj bez specialnej ochrany?
a este by ma zaujimal rozdiel vo vykone htmldoc vs generovat pdf v php. to mate denne tych faktur fakt tak moc?
diky za prip. reakcie

Zalezi od konkretneho layoutu danej faktury, ale stavalo sa nam, ze vygenerovanie 1 pdf trvalo aj viac ako 200s. Tak isto maju niektore kniznce obmedzeny pocet pouzitelnych html tagov, tym padom je aj problem fakturu nejako rozumne nadesignovat.

Nejde o to kolko mame novych faktur, ale o to kolko si faktur denne klienti stahuju. V podstate nezalezi ani na pocte, ale skor na tom aby generovanie konkretne jednej faktury netrvalo dlho, pretoze tento cas musi klient cakat.

PDFka sa raz denne premazavaju a vzdy, ked je potrebne niektoru fakturu stiahnut, vygeneruje sa to on the fly.

Len pre informaciu, denne sa vygeneruje viac ako 400 pdfiek.

Vies, totiz taku fakturu bez toho podpisu ti mozem poslat aj ja a ty nikdy nezistis, ze som to bol ja a zaplatis. Takto mas podpis Websupport-u v pocitaci a mozes porovnat, ci je to skutocne on.

Co sa tyka samotnych faktur- netreba dokonca ani podpis na nich mat (ma sa na mysli rucny podpis)- ja casto vytlacim fakturu a je platna.

Ja podpis s pečiatkou na faktúru vo svojich „made in home“ podmienkach generujem normálne z účtovného programu Kros Alfa… samozrejme pre Websupport by to nebolo ale pre malé firmy why not.

ja som teda este mensia firma…pisem fa v NeoOffice, z toho vytvorim pdf to pouzijem ako zalohu alebo pripadne posielam…

TCPDF dokaze urobit vsetko popisane, tzn. bez externych zavislosti na dalsich utilitach: importuje binarnu template z akehokolvek PDF suboru (novsie TCPDF uz obsahuje built-in parser, starsie verzie TCPDF to vedia urobit cez rozsirienie FPDI od Jana Slabona). TCPDF vie podpisat PDF dokument X.509 certifikatom a podporuje vacsinu kodovani, vratane stredoeuropskych ako aj UTF-8. Tiez vie vygenerovat PDF z HTML suboru. Jedinou nevyhodou je vyssia spotreba pamate (cca 12-13 MB kvoli vsetkych utf-8 knizniciam) a z toho vyplyva nizsi vykon. Avsak strata v praxi znamena, ze za sekundu vygeneruje napr. 3 dokumenty, pricom linuxova utilita vygeneruje 10 dokumentov – v podstate irelevantny faktor pre bezne pouzitie.

Takisto musim povedat ze php kniznica tcpdf na konvert html do pdf je velmi schopna. Nema ziadny problem co sa tyka kodovania nastastie. Pouzivame to na generovanie on-the-fly pdf sheetov pre akcie fondy a podobne vratane svg grafov a jak sa clovek trochu nauci naco si davat pozor je extremne jednoduche s nou pracovat. Dokonca s nou generujem 200 stranove pdf dokumenty, co uz sice trva trochu dlhsie, no koli nedostatku moznosti nemam na vyber. Ak si clovek dokaze nadizajnovat sheet s obmedzenym pouzitim css stylov tak nema problem.

zdravim, size uz presiel nejaky cas, ale napisem aj sem, mozno sa niekto ozve 🙂 skusam ten htmldoc a nejako sa mi nedari podla man vcelku zakladny layout schopne skonvertovat.. mam len obycajnu tabulku s par riadkami a 2 stlpcami, v kazdom nejaky lorem ipsum, ziadne styly, ani rowspan/colspan a podobne, pouzijem „htmldoc –quiet –webpage –color –charset iso-8859-2 -t pdf14 –size a4 test.html -f test.pdf“ a to PDF ma vsetky texty rozne cez seba poprehadzane, vacsinou vobec neberie, len obcas.. proste cele to je zle 🙂 netusi niekto, kde moze byt problem ?

dakujem .. skusil som to na inom stroji a tam to vyzera teda okej .. dokonca, co je zaujimave, tak to moje zle PDFko vyzera v Chrome okej, v Safari uplne zle a v PDF prehliadaci tam vacsina textu nie je zobrazena 🙂
a funguje ti aj styly ? konkretne napriklad padding, pretoze ci pridam style=“padding: 10px“ alebo do pre ten tag, tak to neberie .. preto som chcel 1.9 verziu, lebo tam by vraj uz CSS malo mat lepsiu podporu

no, tagy mi to zrusilo 🙂
malo tam byt, ze style=“padding: 10px“ alebo do style tagu v hlavicke html suboru pre odstavec, teda „p“ element

Mna by skor zaujimalo ako to „zosynchronizovat“ s uctovnikom, normalne mi faktury tvori on – poslem mu poziadavku na FA a on cez uct. program vystavi fakturu.

Dajme tomu, ze by som teraz chcel spustit web sluzbu / startup, kde by sa faktury generovali takto automaticky ako by sa zriesilo ich cislovanie?

Uctovnictvo je mimo mna, tak neviem ci cisla faktur musia nasledovat po sebe alebo nie. (IMHO ano) Jedine co ma napada je, ze by sa FA automaticky posielala uctovnikovi a on by si cislo potom prisposobil podla poslednej generovanej FA, ale to by bolo pri velkom odbere tiez blbost.

Ako to riesite vy?

Elektronická faktúra šetrí náklady na obálky, poštovné a papier, ale iba odosielateľovi. Prijímateľ si často musí faktúru vytlačiť. A to mu náklady zvyšuje. Preto som rád, keď má odberateľ možnosť vybrať si, aký typ faktúry uprednostní a nie je do elektronickej tlačený za každú cenu, ako to robí napr. telekom pri nových objednávkach. Nemá každá babka internet, počítač a laserovku pri gauči.

Pridaj komentár

Vaša e-mailová adresa nebude zverejnená. Vyžadované polia sú označené *