Gå til innhold

Generere PDF-faktura/giro med PHP?


Anbefalte innlegg

Noen som har peiling på hvordan jeg kan få laget en faktura i PDF-format ved hjelp av PHP?

 

Selve opprettelsen av et PDF-dokumentet er nok ikke det vanskligste, men få det til å se ut som en helt vanlig papirgiro, med gule felter og slikt? Noen som har vært borti noe slikt?

 

Finnes det tilfeldigvis ferdige-kodesnutter for slikt? :whistle:

Lenke til kommentar
Videoannonse
Annonse

Få tak i ferdige giroblanketter. Prøv hos posten el.

Generer et PDF dokument med et rutenett. La det f.eks være 20-50 punkter mellom linjene. Skriv dette ut på en giroblankett (Husk å slå av alt av skalering og midtstilling i acrobat reader). Nå kan du sånn ca. måle deg frem til hvor du vil skrive ut ting.

Lenke til kommentar

ex0n: Som sagt, selve opprettelsen av dokumentet er nok ikke det største problemet - men å "designe" det - og bestemme hvor variabler skal inn.

 

stiber: Er det slik at jeg kan bruke et forhåndslaget dokument - og bare sette inn variabler på de riktige stedene? Hvordan blir i så fall dette gjort, må jeg spesifisere antall piksler fra topp og bunn slik du nevner?

 

Høres egentlig ut som en litt tungvindt jobb dette :(

Lenke til kommentar

Det er en tungvindt jobb, og det var slik jeg gjorde det første gang.

pdf_show_xy($pdf, $adresse, 112, 214);
osv...

Hvis du ikke har blanke giroblanketter, så har du sikkert mange regninger liggende som du kan skrive over :)

 

Du kan evt. bruke linjal og måle grovt, og regne ut avstandene. PDFlib bruker 72dpi, noe som tilsvarer ca. 28 piksler pr. cm.

 

Nå bruker jeg et SVG dokument laget i Adobe InDesign som en mal, og fyller inn info med en "template engine". Så konverteres SVG dokumentet til PDF etterpå. Det kan være mye arbeid hvis man bare skal lage giroer, men kjekt hvis man jobber mye med PDF generering, ettersom man slipper å hardkode utseenede til dokumentene.

Lenke til kommentar
Gjest Slettet-rXRozPkg

Dette virket spennede, så jeg slang sammen en "mockup" av en giro i Photoshop, og eksperimenterte litt.

 

Resultatet:

<?php

try {
   $pdf = pdf_new();
   $fil = "C:\\Inetpub\\wwwroot\\pdf\\test.pdf";
   pdf_open_file($pdf, $fil);

   pdf_set_info($pdf, "Author", "Giro-Generator 1.0");
   pdf_set_info($pdf, "Title", "Faktura");
   pdf_set_info($pdf, "Creator", "Giro-Generator 1.0");

   pdf_begin_page($pdf, 595, 842);

   //pdf_set_parameter($pdf, "FontOutline", "Courier=C:\WINDOWS\Fonts\COUR.TTF");
   pdf_set_parameter($pdf, "FontOutline", "Arial=C:\WINDOWS\Fonts\ARIAL.TTF");
   
   //$giro = pdf_open_image_file($pdf, "png", "C:\\Inetpub\\wwwroot\\pdf\\logo.png", "", 2);
   //pdf_place_image($pdf, $giro, 30, 750, 0.5);
   //pdf_close_image($pdf, $giro);

   //$courier = pdf_findfont($pdf, "Courier", "winansi", 1);
   $arial = pdf_findfont($pdf, "Arial", "winansi", 1);

   pdf_setfont($pdf, $arial, 24);
   pdf_show_xy($pdf, "Superduperlogo", 30, 800);

   pdf_setfont($pdf, $arial, 18);
   pdf_show_xy($pdf, "Faktura", 400, 750);

   pdf_setfont($pdf, $arial, 10);

   pdf_show_xy($pdf, "Kundenummer", 400, 730);
   pdf_show_xy($pdf, "Fakturanummer", 400, 718);
   pdf_show_xy($pdf, "Fakturadato", 400, 706);
   pdf_show_xy($pdf, "Forfallsdato", 400, 694);

   pdf_show_xy($pdf, "12345", 480, 730);
   pdf_show_xy($pdf, "123", 480, 718);
   pdf_show_xy($pdf, date("d.m.Y"), 480, 706);
   pdf_show_xy($pdf, date("d.m.Y", (time() + (10 * 24 * 60 * 60))), 480, 694);

   pdf_show_xy($pdf, "Varenr.", 30, 650);
   pdf_show_xy($pdf, "Beskrivelse", 80, 650);
   pdf_show_xy($pdf, "Antall", 300, 650);
   pdf_show_xy($pdf, "Pris", 350, 650);
   pdf_show_xy($pdf, "Rabatt", 400, 650);
   pdf_show_xy($pdf, "MVA", 450, 650);
   pdf_show_xy($pdf, "Netto", 520, 650);
   
   pdf_show_xy($pdf, "13", 30, 638);
   pdf_show_xy($pdf, "Tre ganger tretten", 80, 638);
   pdf_show_xy($pdf, "3", 300, 638);
   pdf_show_xy($pdf, "10000,00", 350, 638);
   pdf_show_xy($pdf, "0,00", 400, 638);
   pdf_show_xy($pdf, "7500,00", 450, 638);
   pdf_show_xy($pdf, "37500,00", 520, 638);

   pdf_show_xy($pdf, "1", 30, 626);
   pdf_show_xy($pdf, "Dette er varenummer 1", 80, 626);
   pdf_show_xy($pdf, "2", 300, 626);
   pdf_show_xy($pdf, "100,00", 350, 626);
   pdf_show_xy($pdf, "0,00", 400, 626);
   pdf_show_xy($pdf, "50,00", 450, 626);
   pdf_show_xy($pdf, "250,00", 520, 626);
   
   pdf_show_xy($pdf, "Nettosalg:", 450, 602);
   pdf_show_xy($pdf, "MVA:", 450, 590);
   pdf_show_xy($pdf, "Total:", 450, 578);

   pdf_show_xy($pdf, "30500,00", 520, 602);
   pdf_show_xy($pdf, "7550,00", 520, 590);
   pdf_show_xy($pdf, "37750,00", 520, 578);

   $giro = pdf_open_image_file($pdf, "png", "C:\\Inetpub\\wwwroot\\pdf\\giro.png", "", 1);
   pdf_place_image($pdf, $giro, 0, 0, 0.75);
   pdf_close_image($pdf, $giro);

//pdf_setfont($pdf, $courier, 12);
   pdf_setfont($pdf, $arial, 11);
   
   // Beløp
   pdf_show_xy($pdf, "37750 00", 263, 305);

   // Kontonummer
   pdf_show_xy($pdf, "1234.56.78910", 40, 310);

   // Blankettnummer
   pdf_show_xy($pdf, "1234567890", 485, 305);

   // Betalingsfrist
   pdf_show_xy($pdf, date("d.m.Y", (time() + (10 * 24 * 60 * 60))), 470, 270);

   // Betalingsinfo
   pdf_show_xy($pdf, "Kundenummer: 12345", 40, 260);
   pdf_show_xy($pdf, "Fakturanummer: 123", 40, 248);

   // Kunde
   pdf_show_xy($pdf, "Ola Nordmann", 45, 170);
   pdf_show_xy($pdf, "Storgata 1a", 45, 158);
   pdf_show_xy($pdf, "3190 Horten", 45, 146);

   // Firma
   pdf_show_xy($pdf, "Lumted's superbutikk", 325, 170);
   pdf_show_xy($pdf, "Lillegata 1b", 325, 158);
   pdf_show_xy($pdf, "3190 Horten", 325, 146);

   // KID
   pdf_show_xy($pdf, "00123456789", 60, 65);

   // Beløp
   pdf_show_xy($pdf, "37750", 250, 65);
   pdf_show_xy($pdf, "00", 300, 65);
   
   // Kontrollsiffer
   $mod = 37750 % 10;
   pdf_show_xy($pdf, "< $mod >", 320, 65);

   // Kontonummer
   pdf_show_xy($pdf, "1234 56 78910", 370, 65);
   
   // Blankettnummer
   pdf_show_xy($pdf, "<1234567890>", 480, 65);

   // H
   pdf_show_xy($pdf, "H", 5, 65);


   pdf_end_page($pdf);
   pdf_close($pdf);

   echo "PDF Generert.";

} catch (Exception $e){
   echo "Feil oppstod:<br>";
   nl2br(print_r($e));
}

?>

Dette er kjørt på en Win2k3 server med PHP5.

 

Originalbilde

Resultatet av koden (PDF)

 

 

Med et bedre (og mer nøyaktig) bilde av en giro burde det ikke være noe stort problem å fylle ut hele saken, samt enventuell tekst over.

 

Edit: fyllte ut de fleste feltene på "mockup"-giroen. PDFen er oppdatert.

Endret av Slettet-rXRozPkg
Lenke til kommentar

lumted: Fantastisk bra!!! :dribble:

Har ikke fått prøvd det enda selv, men skal se på det snart.

 

Men forstår det slik at de gule feltene og det er laget av et bilde... Det øker jo filstørrelsen ganske drastisk. Jeg har allerede PDF-giroer som er mer eller mindre tomme - er det mulig å bruke den i stedet? (se vedlegg - finnes vel software for å redigere PDF-filer slik at de feltene som er utfylt kan tømmes?).

 

Det som hadde vært perfekt var om jeg fikk lagt inn logo og overskrift "FAKTURA" øverst på arket, og varelinjer på øverste delen av fakturaen.

 

Nå skal jo tross alt dette brukes i kommersiell virksomhet, så det ville vært urimelig å be deg fikse dette gratis. Dersom har lyst å jobbe videre med skriptet ditt kan du ta kontakt med meg på PM for en liten betaling (du kan selvsagt likevel poste kildekoden her).

Faktura1.PDF

Endret av Lurifaksen
Lenke til kommentar
Gjest Slettet-rXRozPkg

Mer prøving og feiling er nå unnagjort. Jeg har byttet ut min mockup med en kopi av en skikkelig faktura, lagt til en logo og lagt til opplisting av varer. Kode er oppdatert i min forrige post, og linken til PDF filen er den samme.

 

Da gjenstår det i grunn bare å gjøre dette litt mer dynamisk =)

Endret av Slettet-rXRozPkg
Lenke til kommentar

Fenomenalt :wow:

 

Den eneste "problemet" er filstørrelse... Oppimot en halv megabyte kan blir litt i største laget... :(

 

Finnes det ingen måte å skrive alt på et eksisterende dokument? Dvs, hvis vi får laget en helt tom giro, så bare fylles variablene inn i den?

Lenke til kommentar
Gjest Slettet-rXRozPkg

Det gjør det sikkert, men jeg aner ikke hvordan ;)

 

Edit: Jeg tok bort logobildet og brukte bare en font, nå er den nede i 200kb.

Edit2: Jeg fant ut at man trenger en font som heter OCR-B I (denne er ikke gratis :hrm:) hvis man skal bruke dette sammen med BBS, og at det i denne sammenhengen kun er lov å bruke ferdig opptrykte blanketter fra et godkjent trykkeri.

 

Siden man må bruke ferdige blanketter, så kan man jo droppe hele bildet, og spare noe KB til :)

Edit 3: Det var ikke mange KB man sparte nei, kun 10-12... det er nok fonten som blir bakt inn i PDFen som tar størst plass ;)

Endret av Slettet-rXRozPkg
Lenke til kommentar

Hmm.. sikker på at det ikke er de gule feltene og det som tar plass da?

Et slikt pdf-dokument skal ikke ta mer enn rundt 10KB...

 

Har du forsøkt pdf_open_file funksjonen? Får ikke testet selv, fordi jeg ikke har pdflib installert. Skal installere og teste i morgen.

Lenke til kommentar
Gjest Slettet-rXRozPkg

Og der var jeg nede i 12.5KB :w00t:

 

Fikk tatt bort det som gjorde at fonten ble bakt inn i PDFen. Nå må systemet til de som leser den ha fonten Arial installert (og det har jo de aller aller fleste).

 

Edit: Da har jeg lagt til en prøveversjon av OCR-B. Tallet 6 blir byttet ut med "DEMO".

Filstørrelsen er nå 34KB.

 

Edit2: La til en biohazard-logo for å se hvor en logo kunne plasseres, filstørrelsen er nå 40,5KB.

Endret av Slettet-rXRozPkg
Lenke til kommentar
Og der var jeg nede i 12.5KB  :w00t:

Kunne jeg fått se på koden din? Blir 206 kb til meg :(

 

Skal lage et giro-program for fatter'n, med kunderegister, arkiv osv, kan gi deg koden til det når jeg er ferdig ;)

Endret av zokra
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...