Elektronické PDF faktúry – ako nato


  • Zdieľať na Google+

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.

Komentáre

  • toms
    Odpovedať
    Autor
    toms

    A my to riesime mega zlozito cez vpisovanie dalsich udajov uz do pripravenej PDF sablony. Pekne 🙂

  • lasthit
    Odpovedať
    Autor
    lasthit

    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 🙂

  • Rišo Lohyňa
    Odpovedať
    Autor
    Rišo Lohyňa

    tak toto riesenie som hladal uz velmi davno .. fajn tip 😉 vdaka

    • Michal Truban
      Odpovedať
      Autor
      Michal Truban

      rado sa stalo

  • kz
    Odpovedať
    Autor
    kz

    „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?

    • Matus Kosa
      Odpovedať
      Autor
      Matus Kosa

      Ano, koli htmldoc, robi problemy pri generovani pdf z utf8 htmlka

    • srigi
      Odpovedať
      Autor
      srigi

      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.

  • Igor
    Odpovedať
    Autor
    Igor

    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

    • Michal Truban
      Odpovedať
      Autor
      Michal Truban

      staci to posielat iba ako prilohu v mailoch. po vytlaceni to je normal. danovy doklad.

      • Igor
        Odpovedať
        Autor
        Igor

        Dakujem za info!

      • Sonjoe
        Odpovedať
        Autor
        Sonjoe

        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

        • Michal Truban
          Odpovedať
          Autor
          Michal Truban

          aj u nas su stale s tym problemy. ale vacsina to chape a to je podstatne.

  • 81403
    Odpovedať
    Autor
    81403

    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.

    • Igor
      Odpovedať
      Autor
      Igor

      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.

  • palo
    Odpovedať
    Autor
    palo

    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

    • Matus Kosa
      Odpovedať
      Autor
      Matus Kosa

      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.

    • JuroV
      Odpovedať
      Autor
      JuroV

      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.

  • agiboy
    Odpovedať
    Autor
    agiboy

    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.

  • romi
    Odpovedať
    Autor
    romi

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

    • Michal Truban
      Odpovedať
      Autor
      Michal Truban

      aj takto sa to da. ale prave vdaka takym softom ako superfaktura sa da aj toto zautomatizovat a zefektivnit.

  • lubosdz
    Odpovedať
    Autor
    lubosdz

    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.

    • Marek
      Odpovedať
      Autor
      Marek

      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.

  • boobiq
    Odpovedať
    Autor
    boobiq

    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 ?

    • Vladimír Kriška
      Odpovedať
      Autor
      Vladimír Kriška

      Nazdar!
      HTML: http://tmp.ujovlado.sk/htmldoc/test.html
      PDF: http://tmp.ujovlado.sk/htmldoc/test.pdf

      použil som príkaz copy&paste z článku:
      htmldoc –quiet –webpage –color –charset iso-8859-2 –bodyfont helvetica –embedfonts -t pdf14 –footer … –size a4 –permissions none –permissions print –encryption test.html -f test.pdf

      ubezpeč sa ešte, že máš dokument uložený v iso-8859-2 😉

      • boobiq
        Odpovedať
        Autor
        boobiq

        dakujem za odpoved, toto aj mne vygeneruje spravne, ale toto:

        http://stackoverflow.com/questions/8908018/bad-conversion-from-html-to-pdf-with-htmldoc

        sa uplne rozhadze (je tam aj linka na vysledne pdf)

        • Vladimír Kriška
          Odpovedať
          Autor
          Vladimír Kriška

          No možno máš zlú verziu htmldoc. Mne to stále funguje.

          http://tmp.ujovlado.sk/htmldoc/test2.html
          http://tmp.ujovlado.sk/htmldoc/test2.pdf

          htmldoc –quiet –webpage –color –charset iso-8859-2 –bodyfont helvetica –embedfonts -t pdf14 –footer … –size a4 –permissions none –permissions print –encryption test2.html -f test2.pdf

        • boobiq
          Odpovedať
          Autor
          boobiq

          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

        • boobiq
          Odpovedať
          Autor
          boobiq

          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

        • boobiq
          Odpovedať
          Autor
          boobiq

          s verziou HTMLDOC Version 1.8.27, aby som bol teda konkretny 🙂

  • confused
    Odpovedať
    Autor
    confused

    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?

  • Ferda Mravenec
    Odpovedať
    Autor
    Ferda Mravenec

    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.