Toolmaker Produkt-Dokumentation
pdf4i Musterprogramme
- Robert E. Schneider
- Elisa Knapp (Unlicensed)
Inhaltsübersicht
Das Musterprogramm FORMINV
Im ersten Musterprogramm wird ein Rechnungsformular erzeugt, das für die Rechnungsschreibung als Schablone dient. Das zweite Programm füllt die Rechnungsdaten in diese Schablone. Die Quellen stehen in DIRWEB/QRPGLESRC/FORMINV bzw. INVOICE.
Rechnungsformular:
‚ ********************************************************************************************** * Program :ˆFormInv * Descriptions :ˆForm of invoice * Programmer :ˆToolmaker * Creation Date :ˆ01.07.2014 ‚ ********************************************************************************************** ˆ * H E A D E R - S P E C I F I C A T I O N S ‚ ********************************************************************************************** H/COPY Qcpylesrc,H_SPECSPDF ‚ ********************************************************************************************** ˆ * F I L E S P E C I F I C A T I O N S ‚ ********************************************************************************************** ‚ ********************************************************************************************** š * P R O T O T Y P I N G / C O P Y M E M B E R ‚ ********************************************************************************************** D/Include Qprolesrc,pdfsrvpgm ‚ * ‚ ********************************************************************************************** ˆ * D E F I N I T I O N G L O B A L V A R I A B L E S ‚ ********************************************************************************************** d Handle s * d Font s 256 inz('Helvetica-Bold') varying d Encoding s 256 inz('unicode') varying d FontOpt s 256 inz(' ') d CrtOpt s 256 inz('fontname=Helvetica + d fontsize=8 encoding=unicode + d fillcolor={gray 0} + d alignment=justify') d Fontsize s 6s 0 inz(08) d Ftext s 4096 inz('Toolmaker Advanced + d Efficiency GmbH') d Ftext1 s 4096 inz('Westendstrasse 34') d Ftext2 s 4096 inz('86916 Kaufering') d Ftext3 s 4096 inz('Tel.: 0049 8191 968 0') d sender s 4096 inz('Toolmaker Advanced Efficiency + d GmbH, Westendstr. 34, + d 86916 Kaufering') d TxtKdnr s 4096 inz('Kundennummer') d TxtRenr s 4096 inz('Rechnungsnummer') d Txtdate s 4096 inz('Datum') d AText s 4096 inz('Der Rechnungsbetrag ist + d innerhalb von 14 Tagen netto + d zahlbar. Die Produkte bleiben bis + d zur vollständigen Bezahlung + d unser Eigentum. Es gelten unsere + d allgemeinen Geschäftsbedingungen.') ‚ ********************************************************************************************** ˆ * M A I N P R O G R A M ‚ ********************************************************************************************** ‚ /Free Handle=PDF_CreateDoc('(*license='' '') + (*Searchpath= + /Toolmaker/DirectWEB/htdocs/pdf4iexamples/fonts) + (*Docname = + /Toolmaker/DirectWEB/htdocs/pdf4iexamples/resdoc/Testform.pdf)' + '(*Creator =RPG) + (*Author =Max Maus) + (*dimension =mm) + (*direction =topdown) + (*Title =Header for documents)'); PDF_Image(Handle:'(*imgtype=auto) + (*image = + /Toolmaker/DirectWEB/htdocs/pdf4iexamples/images/tm_logo.jpg) + (*imgfopt =scale 0.3) + (*imgx =140) + (*imgy =20)'); PDF_DrawLine(Handle:'(*strokewidth=2) + (*StrokeColor=blue) + (*Strokefromx=008) + (*Strokefromy=25) + (*Stroketox =205) + (*Stroketoy =25)'); PDF_TextLine(Handle:'(*singletext='+sender+')' + '(*textx =25) + (*texty =60) + (*textoption =fillcolor={gray 0.5}) + (*font =arial) + (*fontencoding=unicode) + (*fontsize =06)'); PDF_TextLine(Handle:'(*singletext='+ftext+')' + '(*textx =150) + (*texty =60) + (*textoption =fillcolor={gray 0.5}) + (*font =arial) + (*fontencoding=unicode) + (*fontsize =08)'); PDF_TextLine(Handle:'(*singletext='+ftext1+')' + '(*textx =150) + (*texty =65) + (*textoption =fillcolor={gray 0.5}) + (*font =arial) + (*fontencoding=unicode) + (*fontsize =08)'); PDF_TextLine(Handle:'(*singletext='+ftext2+')' + '(*textx =150) + (*texty =70) + (*textoption =fillcolor={gray 0.5}) + (*font =arial) + (*fontencoding=unicode) + (*fontsize =08)'); PDF_TextLine(Handle:'(*singletext='+ftext3+')' + '(*textx =150) + (*texty =75) + (*textoption =fillcolor={gray 0.5}) + (*font =arial) + (*fontencoding=unicode) + (*fontsize =08)'); PDF_DrawBox(Handle:'(*strokewidth=1) + (*rectx =20) + (*recty =130) + (*StrokeColor= ) + (*rectwidth =170) + (*rectheight =20)'); PDF_TextLine(Handle:'(*singletext='+TxtKdnr+')' + '(*textx =25) + (*texty =120) + (*textoption =fillcolor={gray 0.5}) + (*font =arial) + (*fontencoding=unicode) + (*fontsize =10)'); PDF_TextLine(Handle:'(*singletext='+TxtRenr+')' + '(*textx =80) + (*texty =120) + (*textoption =fillcolor={gray 0.5}) + (*font =arial) + (*fontencoding=unicode) + (*fontsize =10)'); PDF_TextLine(Handle:'(*singletext='+TxtDate+')' + '(*textx =150) + (*texty =120) + (*textoption =fillcolor={gray 0.5}) + (*font =arial) + (*fontencoding=unicode) + (*fontsize =10)'); PDF_TextFlow(Handle:'(*flowtext='+AText +')' + '(*flowlux =20) + (*flowluy =270) + (*flowrdx =190) + (*flowrdy =285) + (*flowwidth =0) + (*flowheight=0) + (*flowcrtopt='+crtopt +')'); PDF_TextLine(Handle:'(*singletext=Seite -) + *textx =100) + (*texty =290) + (*textoption =fillcolor={gray 0.5}) + (*font =arial) + (*fontencoding=unicode) + (*fontsize =08)'); PDF_CloseDoc(Handle:' '); *Inlr=*on; ‚ /End-free
Das mit diesem Programm erzeugte PDF-Dokument sieht so aus:
Das Musterprogramm INVOICE
Das folgende Programm verwendet das zuvor erstellte PDF-Dokument als Schablone und füllt die Rechnungsdaten ein. Kundendaten und Artikel sind zur besseren Lesbarkeit als Konstante bzw. in einer Datenstruktur dargestellt und nicht wie üblich einer Datenbank entnommen.
Hinweis: Wenn anstelle einer jpg-Datei eine PDF-Datei als Vorlage zur Erstellung einer neuen PDF-Datei dienen soll, ist die PDFLIB02-Lizenz erforderlich. Siehe Frage Nr 5. bei den Häufig gestellten Fragen.
PDFLIB01 PDF-Dokumente erzeugen
PDFLIB02 PDF-Dokumente erzeugen mit Nutzung bereits vorhandener PDF-Dokumente
Variante 1 - Alle Rechnungen in einem PDF-Dokument
Alle Rechnungen werden in einer Datei mit Namen ‚Invoice Tagesdatum' gespeichert. Wenn jede Rechnung in eine eigene Datei gespeichert werden soll, kann die Variante 2 als Muster verwendet werden.
‚ ********************************************************************************************** * Program :ˆInvoice * Descriptions :ˆSample invoice * Programmer :ˆGerd Schramm * Creation Date :ˆ01.07.2014 ‚ ********************************************************************************************** ˆ * H E A D E R - S P E C I F I C A T I O N S ‚ ********************************************************************************************** H/COPY Qcpylesrc,H_SPECSPDF ‚ ********************************************************************************************** ˆ * F I L E S P E C I F I C A T I O N S ‚ ********************************************************************************************** ‚ ********************************************************************************************** š * P R O T O T Y P I N G / C O P Y M E M B E R ‚ ********************************************************************************************** D/COPY qprolesrc,pdfsrvpgm ‚ * ‚ ********************************************************************************************** ˆ * D E F I N I T I O N G L O B A L V A R I A B L E S ‚ ********************************************************************************************** d Handle s * d Adr1 s 30 inz('Musterkunde') varying d Adr2 s 30 inz('Musterstrasse') varying d Adr3 s 30 inz('XXXXX Ort') varying d Font s 256 inz('Helvetica-Bold') varying d Encoding s 256 inz('unicode') varying d FontOpt s 256 inz(' ') d CrtOpt s 256 inz('fontname=Helvetica + d fontsize=8 encoding=unicode + d fillcolor={gray 0} + d alignment=justify') d CrtOptr s 256 inz('fontname=Helvetica + d fontsize=8 encoding=unicode + d fillcolor={gray 0} + d alignment=right') d CurDat s d datfmt(*eur) d Today s 10 d Invnbr s 10i 0 d InvnbrA s 5 d line s 10i 0 d x s 10i 0 d linea s 5 d savekdnr s 5 d pricea s 12 d totala s 12 d total s 9 2 d Fontsize s 6s 0 inz(12) d Stext s 4096 inz('Überschrift' ) d Stext2 s 4096 inz('Farbbox' ) d Txtsum s 4096 inz('Rechnungsbetrag') d varying d TxtEUR s 4096 inz('EUR') d varying D DSItem DS Qualified D 10I 0 inz(1) D 5A Varying inz('12345') D 30A Varying inz('Software product 1') D 9 2 inz(2500,00) D 10I 0 inz(2) D 5A Varying inz('12345') D 30A Varying inz('Software product 2') D 9 2 inz(3000,00) D 10I 0 inz(3) D 5A Varying inz('12345') D 30A Varying inz('Software product 3') D 9 2 inz(4000,00) D 10I 0 inz(4) D 5A Varying inz('12346') D 30A Varying inz('Software product 1') D 9 2 inz(1500,00) D 10I 0 inz(5) D 5A Varying inz('12346') D 30A Varying inz('Software product 3') D 9 2 inz(6000,00) D Arr Dim(5) Overlay(DSItem) D Num 10I 0 Overlay(Arr) D Kdnr 5A Varying Overlay(Arr: *Next) D Item 30A Varying Overlay(Arr: *Next) D Price 9 2 Overlay(Arr: *Next) ‚ ********************************************************************************************** ˆ * M A I N P R O G R A M ‚ ********************************************************************************************** ‚ /Free CurDat=%date(); today=%char(curdat); Handle=PDF_CreateDoc('(*license='' '') + (*Searchpath=/Toolmaker/Fonts) + (*Docname =/home/gsc/Invoice '+Today+'.pdf)' + '(*Creator =RPG) + (*Author =Gerd Schramm) + (*pdidoc =forminv.pdf) + (*dimension =mm) + (*direction =topdown) + (*pagenbr =0) + (*pagex =110) + (*pagey =290) + (*Title =Test invoice)'); For x=1 to 5; if dsitem.kdnr(x)<>savekdnr; if savekdnr<>*blank; exsr Sum; PDF_NextPage(Handle:'(*pagenbr=0)'); endif; invnbr+=1; line =140; invnbra=%char(invnbr); savekdnr=dsitem.kdnr(x); PDF_TextLine(Handle:'(*singletext='+adr1+')' + '(*textx =25) + (*texty =70) + (*font =arial) + (*fontencoding=unicode) + (*fontsize =10)'); PDF_TextLine(Handle:'(*singletext='+adr2+')' + '(*textx =25) + (*texty =75) + (*font =arial) + (*fontencoding=unicode) + (*fontsize =10)'); PDF_TextLine(Handle:'(*singletext='+adr3+')' + '(*textx =25) + (*texty =85) + (*font =arial) + (*fontencoding=unicode) + (*fontsize =10)'); PDF_TextLine(Handle:'(*singletext='+dsitem.kdnr(x)+')' + '(*textx =60) + (*texty =120) + (*font =arial) + (*fontencoding=unicode) + (*fontsize =10)'); PDF_TextLine(Handle:'(*singletext='+invnbra+')' + '(*textx =120) + (*texty =120) + (*font =arial) + (*fontencoding=unicode) + (*fontsize =10)'); PDF_TextLine(Handle:'(*singletext='+today+')' + '(*textx =165) + (*texty =120) + (*font =arial) + (*fontencoding=unicode) + (*fontsize =10)'); endif; line+=10; linea=%char(line); total+=dsitem.price(x); pricea=%editw(dsitem.price(x):' . . , '); PDF_TextLine(Handle:'(*singletext=1) + (*textx =25) + (*texty ='+linea+')' + '(*font =arial) + (*fontencoding=unicode) + (*fontsize =10)'); PDF_TextLine(Handle:'(*singletext='+dsitem.item(x)+')' + '(*textx =35) + (*texty ='+linea+')' + '(*textoption =fillcolor={gray 0.5}) + (*font =arial) + (*fontencoding=unicode) + (*fontsize =10)'); PDF_TextLine(Handle:'(*singletext='+txteur+')' + '(*textx =130) + (*texty ='+linea+')' + '(*textoption =fillcolor={gray 0.5}) + (*font =arial) + (*fontencoding=unicode) + (*fontsize =10)'); PDF_TextLine(Handle:'(*singletext='+pricea+')' + '(*textx =140) + (*texty ='+linea+')' + '(*textoption =fillcolor={gray 0.5}) + (*font =arial) + (*fontencoding=unicode) + (*fontsize =10)'); Endfor; exsr sum; PDF_CloseDoc(Handle:' '); *Inlr=*on; ‚ begsr sum; line+=10; linea=%char(line); totala=%editw(total:' . . , '); PDF_TextLine(Handle:'(*singletext=------------) + (*textx =140) + (*texty ='+linea+')' + '(*textoption =fillcolor={gray 0.5}) + (*font =arial) + (*fontencoding=unicode) + (*fontsize =10)'); line+=10; linea=%char(line); PDF_TextLine(Handle:'(*singletext='+txtsum+')' + '(*textx =35) + (*texty ='+linea+')' + '(*textoption =fillcolor={gray 0.5}) + (*font =arial) + (*fontencoding=unicode) + (*fontsize =10)'); PDF_TextLine(Handle:'(*singletext='+txteur+')' + '(*textx =130) + (*texty ='+linea+')' + '(*textoption =fillcolor={gray 0.5}) + (*font =arial) + (*fontencoding=unicode) + (*fontsize =10)'); PDF_TextLine(Handle:'(*singletext='+totala+')' + '(*textx =140) + (*texty ='+linea+')' + '(*textoption =fillcolor={gray 0.5}) + (*font =arial) + (*fontencoding=unicode) + (*fontsize =10)'); total =*zero; endsr; ‚ /End-free
Variante 2 - Pro Rechnung ein PDF-Dokument
Programmname INVOICEN. Eine Datei mit Namen 'Invoice <rechnungsnr>' pro Rechnung.
Die Zeilen 87-112 von INVOICE aus Variante 1 ersetzt werden.
CurDat=%date(); today=%char(curdat); For x=1 to 5; if dsitem.kdnr(x)<>savekdnr; if savekdnr<>*blank; exsr Sum; PDF_CloseDoc(Handle:' '); endif; invnbr+=1; line =140; invnbra=%char(invnbr); savekdnr=dsitem.kdnr(x); Handle=PDF_CreateDoc('(*license='' '') + (*Searchpath=/Toolmaker/Fonts) + (*Docname =/home/gsc/Invoice '+invnbra+'.pdf)' + '(*Creator =RPG) + (*Author =Gerd Schramm) + (*pdidoc =forminv.pdf) + (*dimension =mm) + (*direction =topdown) + (*pagenbr =0) + (*pagex =110) + (*pagey =290) + (*Title =Test invoice)');
Die komplette Musterrechnung
Das Musterprogramm FERDINV
Das Musterprogramm FERDINV erstellt ein leeres PDF mit integriertem ZUGFeDR XML-Teil.
0001.00*************************************************************************** 0002.00 * Program : Ferdinv 0003.00 * Descriptions : Sample FeRD document 0004.00 * Programmer : Toolmaker 0005.00 * Creation Date : 30.09.2015 0006.00*************************************************************************** 0007.00 * H E A D E R - S P E C I F I C A T I O N S 0008.00*************************************************************************** 0009.00 H/COPY Qcpylesrc,H_SPECSPDF 0010.00*************************************************************************** 0011.00 * F I L E S P E C I F I C A T I O N S 0012.00*************************************************************************** 0013.00*************************************************************************** 0014.00 * P R O T O T Y P I N G / C O P Y M E M B E R 0015.00*************************************************************************** 0016.00 D/COPY qprolesrc,pdfsrvpgm 0017.00 * 0018.00*************************************************************************** 0019.00 * D E F I N I T I O N G L O B A L V A R I A B L E S 0020.00*************************************************************************** 0021.00 d Handle s * 0022.00 d renra s 10 inz('12345') 0023.00 d datea s 8 inz('20150929') 0024.00 d sellername s 50 inz('Mustermann GmbH') 0025.00 d sellerline1 s 50 inz('Musterstrasse 7') 0026.00 d sellercity s 50 inz('München') 0027.00 d sellerplz s 5 inz('80000') 0028.00 d sellercountry s 3 inz('DE') 0029.00 d buyername s 50 inz('Einkauf AG') 0030.00 d buyerline1 s 50 inz('Einkaufstrasse 9') 0031.00 d buyercity s 50 inz('Hamburg') 0032.00 d buyerplz s 5 inz('20000') 0033.00 d buyercountry s 3 inz('DE') 0034.00 d curr s 3 inz('EUR') 0035.00 d vatid s 20 inz('DE123456789') 0036.00 d vatpera s 4 inz('19.0') 0037.00 d vatamounta s 15 inz('6,94') 0038.00 d Termtext s 256 inz('Zahlbar netto innerhalb von - 0039.00 d 14 Tagen') 0040.00 d totala s 15 inz('36,50') 0041.00 d gtotala s 15 inz('43,44') 0042.00 d line1 s 15 inz('1') 0043.00 d itemname1 s 15 inz('Äpfel') 0044.00 d quant1 s 15 inz('30') 0045.00 d amount1 s 15 inz('16,50') 0046.00 d line2 s 15 inz('2') 0047.00 d itemname2 s 15 inz('Birnen') 0048.00 d quant2 s 15 inz('20') 0049.00 d amount2 s 15 inz('20,00') 0050.00 0051.00*************************************************************************** 0052.00 * M A I N P R O G R A M 0053.00*************************************************************************** 0054.00 /Free 0055.00 0056.00 Handle=PDF_CreateDoc('(*license='' '') + 0057.00 (*Searchpath=/Toolmaker/Fonts) + 0058.00 (*Docname =/tmp/ferdempty.pdf) + 0059.00 (*Creator =RPG) + 0060.00 (*Author =Gerd Schramm) + 0061.00 (*dimension =mm) + 0062.00 (*direction =topdown) + 0063.00 (*docoptions=pdfa=PDF/A-3b metadata={filename={+ 0064.00 ZUGFeRD_extension_schema.xmp}}) + 0065.00 (*Title =Test FeRD)'); 0066.00 PDF_FERDDOC('(*Docnbr ='+renra+') + 0067.00 (*Docname =/tmp/ferdempty.pdf) + 0068.00 (*Doctype =380) + 0069.00 (*Docjjjjmmdd ='+datea+') + 0070.00 (*Sellername ='+Sellername+') + 0071.00 (*Sellerline1 ='+sellerline1+') + 0072.00 (*SellerPostcode ='+sellerplz+') + 0073.00 (*Sellercity ='+sellercity+') + 0074.00 (*Sellercountry ='+sellercountry+') + 0075.00 (*Buyername ='+buyername+') + 0076.00 (*Buyerline1 ='+buyerline1+') + 0077.00 (*BuyerPostcode ='+buyerplz+') + 0078.00 (*Buyercity ='+buyercity+') + 0079.00 (*Buyercountry ='+buyercountry+') + 0080.00 (*Currency ='+curr+') + 0081.00 (*Vatid ='+vatid+') + 0082.00 (*Vatpercent ='+Vatpera+') + 0083.00 (*Vatamount ='+Vatamounta+') + 0084.00 (*Payterm ='+Termtext+') + 0085.00 (*Total ='+totala+') + 0086.00 (*Grandtotal ='+gtotala+')'); 0087.00 PDF_FERDITEM('(*Docnbr ='+renra+') + 0088.00 (*Docname =/tmp/ferdempty.pdf) + 0089.00 (*Doctype =380) + 0090.00 (*Docjjjjmmdd ='+datea+') + 0091.00 (*itemline ='+line1+') + 0092.00 (*itemname ='+itemname1+') + 0093.00 (*itemquantity ='+quant1+') + 0094.00 (*itemamount ='+amount1+')'); 0095.00 PDF_FERDITEM('(*Docnbr ='+renra+') + 0096.00 (*Docname =/tmp/ferdempty.pdf) + 0097.00 (*Doctype =380) + 0098.00 (*Docjjjjmmdd ='+datea+') + 0099.00 (*itemline ='+line2+') + 0100.00 (*itemname ='+itemname2+') + 0101.00 (*itemquantity ='+quant2+') + 0102.00 (*itemamount ='+amount2+')'); 0103.00 PDF_CloseDoc(Handle:' '); 0104.00 *Inlr=*on; 0105.00 0106.00 /End-free
Das Musterprogramm FERDINVPR
Dieses Programm erzeugt das lesbare PDF mit XML-Datei.
0001.00*************************************************************************** 0002.00 * Program : FeRDinvpr 0003.00 * Descriptions : Sample invoice FeRD with printable pdf 0004.00 * Programmer : Toolmaker 0005.00 * Creation Date : 17.11.2015 0006.00*************************************************************************** 0007.00 * H E A D E R - S P E C I F I C A T I O N S 0008.00*************************************************************************** 0009.00 H/COPY Qcpylesrc,H_SPECSPDF 0010.00*************************************************************************** 0011.00 * F I L E S P E C I F I C A T I O N S 0012.00*************************************************************************** 0013.00*************************************************************************** 0014.00 * P R O T O T Y P I N G / C O P Y M E M B E R 0015.00*************************************************************************** 0016.00 D/include qprolesrc,pdfsrvpgm 0017.00 0018.00 * 0019.00*************************************************************************** 0020.00 * D E F I N I T I O N G L O B A L V A R I A B L E S 0021.00*************************************************************************** 0022.00 d Handle s * 0023.00 d sellername s 50 inz('Toolmaker Advanced Efficiency - 0024.00 d GmbH') 0025.00 d sellerline1 s 50 inz('Westendstrasse 34') 0026.00 d sellercity s 50 inz('Kaufering') 0027.00 d sellerplz s 5 inz('86916') 0028.00 d sellercountry s 3 inz('DE') 0029.00 d buyername s 50 inz('Mustermann GmbH') 0030.00 d buyerline1 s 50 inz('Musterstrasse 34') 0031.00 d buyercity s 50 inz('München') 0032.00 d buyerplz s 5 inz('80000') 0033.00 d buyercountry s 3 inz('DE') 0034.00 d buyerkdnr s 5 inz('12345') 0035.00 d invnbra s 5 inz('54321') 0036.00 d curr s 3 inz('EUR') 0037.00 d vatid s 20 inz('DE123456789') 0038.00 d vattext s 30 inz('Mehrwertsteuer 19.0 %') 0039.00 d vatpera s 5 inz('19,00') 0040.00 d vatamounta s 15 0041.00 d vatpercent s 4 2 inz(19,00) 0042.00 d vatamount s 9 2 0043.00 d Termtext s 256 inz('Der Rechnungsbetrag ist inn- 0044.00 d erhalb von 14 Tagen netto zahlba- 0045.00 d r. Die Produkte bleiben bis zur - 0046.00 d vollständeigen Bezahlung unser E- 0047.00 d igentum. Es gelten unsere allgem- 0048.00 d einen Geschäftsbedingungen.') 0049.00 d total s 9 2 0050.00 d gtotal s 9 2 0051.00 d totala s 15 0052.00 d gtotala s 15 0053.00 d CurDat s d datfmt(*eur) 0054.00 d Today s 10 0055.00 d date8 s 8 0056.00 d Invnbr s 10i 0 0057.00 d line s 10i 0 0058.00 d x s 10i 0 0059.00 d xa s 3 0060.00 d linea s 5 0061.00 d pricea s 12 0062.00 d Fontsize s 6s 0 inz(12) 0063.00 d Stext s 4096 inz('Überschrift' ) 0064.00 d Stext2 s 4096 inz('Farbbox' ) 0065.00 d Txtsum s 4096 inz('Rechnungsbetrag netto') 0066.00 d gtotaltext s 4096 inz('Rechnungsbetrag brutto') 0067.00 d* 0068.00 D DSItem DS Qualified 0069.00 D 10I 0 inz(1) 0070.00 D 30A Varying inz('Software product 1') 0071.00 D 15A Varying inz('1') 0072.00 D 9 2 inz(1500,00) 0073.00 D 10I 0 inz(2) 0074.00 D 30A Varying inz('Software product 2') 0075.00 D 15A Varying inz('1') 0076.00 D 9 2 inz(3000,00) 0077.00 D 10I 0 inz(3) 0078.00 D 30A Varying inz('Software product 3') 0080.00 D 9 2 inz(4000,00) 0081.00 D 10I 0 inz(4) 0082.00 D 30A Varying inz('Software product 4') 0083.00 D 15A Varying inz('2') 0084.00 D 9 2 inz(3000,00) 0085.00 D 10I 0 inz(5) 0086.00 D 30A Varying inz('Software product 5') 0087.00 D 15A Varying inz('1') 0088.00 D 9 2 inz(4000,00) 0089.00 D 10I 0 inz(6) 0090.00 D 30A Varying inz('Software product 6') 0091.00 D 15A Varying inz('3') 0092.00 D 9 2 inz(6000,00) 0093.00 D 10I 0 inz(7) 0094.00 D 30A Varying inz('Software product 7') 0095.00 D 15A Varying inz('1') 0096.00 D 9 2 inz(1300,00) 0097.00 D 10I 0 inz(8) 0098.00 D 30A Varying inz('Software product 8') 0099.00 D 15A Varying inz('1') 0100.00 D 9 2 inz(2300,00) 0101.00 D 10I 0 inz(9) 0102.00 D 30A Varying inz('Software product 9') 0103.00 D 15A Varying inz('1') 0104.00 D 9 2 inz(1600,00) 0105.00 D 10I 0 inz(10) 0106.00 D 30A Varying inz('Software product 10') 0107.00 D 15A Varying inz('1') 0108.00 D 9 2 inz(1200,00) 0109.00 D 10I 0 inz(11) 0110.00 D 30A Varying inz('Software product 11') 0111.00 D 15A Varying inz('1') 0112.00 D 9 2 inz(6300,00) 0113.00 D 10I 0 inz(12) 0114.00 D 30A Varying inz('Software product 12') 0115.00 D 15A Varying inz('3') 0116.00 D 9 2 inz(3300,00) 0117.00 D 10I 0 inz(13) 0118.00 D 30A Varying inz('Software product 13') 0119.00 D 15A Varying inz('4') 0120.00 D 9 2 inz(4400,00) 0121.00 D Arr Dim(13) Overlay(DSItem) 0122.00 D Num 10I 0 Overlay(Arr) 0123.00 D Item 30A Varying Overlay(Arr: *Next) 0124.00 D quantity 15A Varying Overlay(Arr: *Next) 0125.00 D Price 9 2 Overlay(Arr: *Next) 0126.00 0127.00*************************************************************************** 0128.00 * M A I N P R O G R A M 0129.00*************************************************************************** 0130.00 /Free 0131.00 CurDat=%date(); 0132.00 today=%char(curdat); 0133.00 date8 = %char(curdat:*iso); 0134.00 0135.00 Handle=PDF_CreateDoc('(*license='' '')+ 0136.00 (*Searchpath=/Toolmaker/Fonts) + 0137.00 (*Docname =/tmp/Ferdinv.pdf)' + 0138.00 '(*Creator =RPG) + 0139.00 (*Author =Gerd Schramm) + 0140.00 (*pdidoc =forminv.pdf) + 0141.00 (*dimension =mm) + 0142.00 (*direction =topdown) + 0143.00 (*docoptions=pdfa=PDF/A-3b metadata={filename={+ 0144.00 ZUGFeRD_extension_schema.xmp}}) + 0145.00 (*pagenbr =0) + 0146.00 (*pagex =110) + 0147.00 (*pagey =290) + 0148.00 (*Title =Test invoice)'); 0149.00 0150.00 invnbr+=1; 0151.00 exsr head; 0152.00 0153.00 For x=1 to 13; 0154.00 If line>250; 0155.00 PDF_NextPage(Handle:''); 0156.00 exsr head; 0157.00 Endif; 0158.00 line+=10; 0159.00 linea=%char(line); 0160.00 xa =%char(x); 0161.00 total+=dsitem.price(x); 0162.00 pricea=%editw(dsitem.price(x):' . . , '); 0163.00 0164.00 PDF_TextLine(Handle:'(*singletext='+xa+')' + 0165.00 ' (*textx =25) + 0166.00 (*texty ='+linea+')' + 0167.00 '(*font =LuciduxSans-Oblique) + 0168.00 (*fontencoding=unicode) + 0169.00 (*fontoption =embedding) + 0170.00 (*fontsize =10)'); 0171.00 PDF_TextLine(Handle:'(*singletext='+dsitem.item(x)+')' + 0172.00 '(*textx =35) + 0173.00 (*texty ='+linea+')' + 0174.00 '(*font =LuciduxSans-Oblique) + 0175.00 (*fontencoding=unicode) + 0176.00 (*fontoption =embedding) + 0177.00 (*fontsize =10)'); 0178.00 PDF_TextLine(Handle:'(*singletext='+dsitem.quantity(x)+')' + 0179.00 '(*textx =110) + 0180.00 (*texty ='+linea+')' + 0181.00 '(*font =LuciduxSans-Oblique) + 0182.00 (*fontencoding=unicode) + 0183.00 (*fontoption =embedding) + 0184.00 (*fontsize =10)'); 0185.00 PDF_TextLine(Handle:'(*singletext='+curr+')' + 0186.00 '(*textx =130) + 0187.00 (*texty ='+linea+')' + 0188.00 '(*font =LuciduxSans-Oblique) + 0189.00 (*fontencoding=unicode) + 0190.00 (*fontoption =embedding) + 0191.00 (*fontsize =10)'); 0192.00 PDF_TextLine(Handle:'(*singletext='+pricea+')' + 0193.00 '(*textx =140) + 0194.00 (*texty ='+linea+')' + 0195.00 '(*font =LuciduxSans-Oblique) + 0196.00 (*fontencoding=unicode) + 0197.00 (*fontoption =embedding) + 0198.00 (*fontsize =10)'); 0199.00 Endfor; 0200.00 exsr sum; 0201.00 PDF_CloseDoc(Handle:' '); 0202.00 *Inlr=*on; 0203.00//************************************************************************* 0204.00 begsr sum; 0205.00 If line>250; 0206.00 PDF_NextPage(Handle:''); 0207.00 exsr head; 0208.00 Endif; 0209.00 line+=10; 0210.00 linea=%char(line); 0211.00 vatamount=total*vatpercent/100; 0212.00 vatamounta=%editw(vatamount:' . . , '); 0213.00 gtotal=vatamount+total; 0214.00 totala=%editw(total:' . . , '); 0215.00 gtotala=%editw(gtotal:' . . , '); 0216.00 0217.00 PDF_TextLine(Handle:'(*singletext=------------) + 0218.00 (*textx =140) + 0219.00 (*texty ='+linea+')' + 0220.00 '(*textoption =fillcolor={gray 0.5}) + 0221.00 (*font =LuciduxSans-Oblique) + 0222.00 (*fontencoding=unicode) + 0223.00 (*fontoption =embedding) + 0224.00 (*fontsize =10)'); 0225.00 line+=10; 0226.00 linea=%char(line); 0227.00 PDF_TextLine(Handle:'(*singletext='+txtsum+')' + 0228.00 '(*textx =35) + 0229.00 (*texty ='+linea+')' + 0230.00 '(*textoption =fillcolor={gray 0.5}) + 0231.00 (*font =LuciduxSans-Oblique) + 0232.00 (*fontencoding=unicode) + 0233.00 (*fontoption =embedding) + 0234.00 (*fontsize =10)'); 0235.00 PDF_TextLine(Handle:'(*singletext='+curr+')' + 0236.00 '(*textx =130) + 0237.00 (*texty ='+linea+')' + 0238.00 '(*font =LuciduxSans-Oblique) + 0239.00 (*fontencoding=unicode) + 0221.00 (*font =LuciduxSans-Oblique) + 0222.00 (*fontencoding=unicode) + 0223.00 (*fontoption =embedding) + 0224.00 (*fontsize =10)'); 0225.00 line+=10; 0226.00 linea=%char(line); 0227.00 PDF_TextLine(Handle:'(*singletext='+txtsum+')' + 0228.00 '(*textx =35) + 0229.00 (*texty ='+linea+')' + 0230.00 '(*textoption =fillcolor={gray 0.5}) + 0231.00 (*font =LuciduxSans-Oblique) + 0232.00 (*fontencoding=unicode) + 0233.00 (*fontoption =embedding) + 0234.00 (*fontsize =10)'); 0235.00 PDF_TextLine(Handle:'(*singletext='+curr+')' + 0236.00 '(*textx =130) + 0237.00 (*texty ='+linea+')' + 0238.00 '(*font =LuciduxSans-Oblique) + 0239.00 (*fontencoding=unicode) + 0240.00 (*fontoption =embedding) + 0222.00 (*fontencoding=unicode) + 0223.00 (*fontoption =embedding) + 0224.00 (*fontsize =10)'); 0225.00 line+=10; 0226.00 linea=%char(line); 0227.00 PDF_TextLine(Handle:'(*singletext='+txtsum+')' + 0228.00 '(*textx =35) + 0229.00 (*texty ='+linea+')' + 0230.00 '(*textoption =fillcolor={gray 0.5}) + 0231.00 (*font =LuciduxSans-Oblique) + 0232.00 (*fontencoding=unicode) + 0233.00 (*fontoption =embedding) + 0234.00 (*fontsize =10)'); 0235.00 PDF_TextLine(Handle:'(*singletext='+curr+')' + 0236.00 '(*textx =130) + 0237.00 (*texty ='+linea+')' + 0238.00 '(*font =LuciduxSans-Oblique) + 0239.00 (*fontencoding=unicode) + 0240.00 (*fontoption =embedding) + 0241.00 (*fontsize =10)'); 0242.00 PDF_TextLine(Handle:'(*singletext='+totala+')' + 0243.00 '(*textx =140) + 0244.00 (*texty ='+linea+')' + 0245.00 '(*font =LuciduxSans-Oblique) + 0246.00 (*fontencoding=unicode) + 0247.00 (*fontoption =embedding) + 0248.00 (*fontsize =10)'); 0249.00 line+=10; 0250.00 linea=%char(line); 0251.00 PDF_TextLine(Handle:'(*singletext=------------) + 0252.00 (*textx =140) + 0253.00 (*texty ='+linea+')' + 0254.00 '(*textoption =fillcolor={gray 0.5}) + 0255.00 (*font =LuciduxSans-Oblique) + 0256.00 (*fontencoding=unicode) + 0257.00 (*fontoption =embedding) + 0258.00 (*fontsize =10)'); 0259.00 line+=10; 0260.00 linea=%char(line); 0261.00 PDF_TextLine(Handle:'(*singletext='+vattext+')' + 0243.00 '(*textx =140) + 0244.00 (*texty ='+linea+')' + 0245.00 '(*font =LuciduxSans-Oblique) + 0246.00 (*fontencoding=unicode) + 0247.00 (*fontoption =embedding) + 0248.00 (*fontsize =10)'); 0249.00 line+=10; 0250.00 linea=%char(line); 0251.00 PDF_TextLine(Handle:'(*singletext=------------) + 0252.00 (*textx =140) + 0253.00 (*texty ='+linea+')' + 0254.00 '(*textoption =fillcolor={gray 0.5}) + 0255.00 (*font =LuciduxSans-Oblique) + 0256.00 (*fontencoding=unicode) + 0257.00 (*fontoption =embedding) + 0258.00 (*fontsize =10)'); 0259.00 line+=10; 0260.00 linea=%char(line); 0261.00 PDF_TextLine(Handle:'(*singletext='+vattext+')' + 0262.00 '(*textx =35) + 0263.00 (*texty ='+linea+')' + 0264.00 '(*textoption =fillcolor={gray 0.5}) + 0265.00 (*font =LuciduxSans-Oblique) + 0266.00 (*fontencoding=unicode) + 0267.00 (*fontoption =embedding) + 0268.00 (*fontsize =10)'); 0269.00 PDF_TextLine(Handle:'(*singletext='+curr+')' + 0270.00 '(*textx =130) + 0271.00 (*texty ='+linea+')' + 0272.00 '(*font =LuciduxSans-Oblique) + 0273.00 (*fontencoding=unicode) + 0274.00 (*fontoption =embedding) + 0275.00 (*fontsize =10)'); 0276.00 PDF_TextLine(Handle:'(*singletext='+vatamounta+')' + 0277.00 '(*textx =140) + 0278.00 (*texty ='+linea+')' + 0279.00 '(*font =LuciduxSans-Oblique) + 0280.00 (*fontencoding=unicode) + 0281.00 (*fontoption =embedding) + 0282.00 (*fontsize =10)'); 0283.00 line+=10; 0284.00 linea=%char(line); 0285.00 PDF_TextLine(Handle:'(*singletext=------------) + 0286.00 (*textx =140) + 0287.00 (*texty ='+linea+')' + 0288.00 '(*textoption =fillcolor={gray 0.5}) + 0289.00 (*font =LuciduxSans-Oblique) + 0290.00 (*fontencoding=unicode) + 0291.00 (*fontoption =embedding) + 0292.00 (*fontsize =10)'); 0293.00 line+=10; 0294.00 linea=%char(line); 0295.00 PDF_TextLine(Handle:'(*singletext='+gtotaltext+')' + 0296.00 '(*textx =35) + 0297.00 (*texty ='+linea+')' + 0298.00 '(*textoption =fillcolor={gray 0.5}) + 0299.00 (*font =LuciduxSans-Oblique) + 0300.00 (*fontencoding=unicode) + 0301.00 (*fontoption =embedding) + 0302.00 (*fontsize =10)'); 0303.00 PDF_TextLine(Handle:'(*singletext='+curr+')' + 0304.00 '(*textx =130) + 0305.00 (*texty ='+linea+')' + 0306.00 '(*font =LuciduxSans-Oblique) + 0307.00 (*fontencoding=unicode) + 0308.00 (*fontoption =embedding) + 0309.00 (*fontsize =10)'); 0310.00 PDF_TextLine(Handle:'(*singletext='+gtotala+')' + 0311.00 '(*textx =140) + 0312.00 (*texty ='+linea+')' + 0313.00 '(*font =LuciduxSans-Oblique) + 0314.00 (*fontencoding=unicode) + 0315.00 (*fontoption =embedding) + 0316.00 (*fontsize =10)'); 0317.00 PDF_FERDDOC('(*Docnbr ='+invnbra+') + 0318.00 (*Docname =/tmp/ferdinv.pdf) + 0319.00 (*Doctype =380) + 0320.00 (*Docjjjjmmdd ='+date8+') + 0321.00 (*Sellername ='+Sellername+') + 0322.00 (*Sellerline1 ='+sellerline1+') + 0323.00 (*SellerPostcode ='+sellerplz+') + 0324.00 (*Sellercity ='+sellercity+') + 0325.00 (*Sellercountry ='+sellercountry+') + 0326.00 (*Buyername ='+buyername+') + 0327.00 (*Buyerline1 ='+buyerline1+') + 0328.00 (*BuyerPostcode ='+buyerplz+') + 0329.00 (*Buyercity ='+buyercity+') + 0330.00 (*Buyercountry ='+buyercountry+') + 0331.00 (*Currency ='+curr+') + 0332.00 (*Vatid ='+vatid+') + 0333.00 (*Vatpercent ='+Vatpera+') + 0334.00 (*Vatamount ='+Vatamounta+') + 0335.00 (*Payterm ='+Termtext+') + 0336.00 (*Total ='+totala+') + 0337.00 (*Grandtotal ='+gtotala+')'); 0338.00 For x=1 to 13; 0339.00 xa=%char(x); 0340.00 pricea=%editw(dsitem.price(x):' . . , '); 0341.00 PDF_FERDITEM('(*Docnbr ='+invnbra+') + 0342.00 (*Docname =/tmp/ferdinv.pdf) + 0343.00 (*Doctype =380) + 0344.00 (*Docjjjjmmdd ='+date8+') + 0345.00 (*itemline ='+xa+') + 0346.00 (*itemname ='+dsitem.item(x)+') + 0347.00 (*itemquantity ='+dsitem.quantity(x)+') + 0348.00 (*itemamount ='+pricea+')'); 0349.00 EndFor; 0350.00 endsr; 0351.00//************************************************************************* 0352.00 begsr head; 0353.00 PDF_TextLine(Handle:'(*singletext='+buyername+')' + 0354.00 '(*textx =25) + 0355.00 (*texty =70) + 0356.00 (*font =LuciduxSans-Oblique) + 0357.00 (*fontencoding=unicode) + 0358.00 (*fontoption =embedding) + 0359.00 (*fontsize =10)'); 0360.00 PDF_TextLine(Handle:'(*singletext='+buyerline1+')' + 0361.00 '(*textx =25) + 0362.00 (*texty =75) + 0363.00 (*font =LuciduxSans-Oblique) + 0364.00 (*fontencoding=unicode) + 0365.00 (*fontsize =10)'); 0366.00 PDF_TextLine(Handle:'(*singletext='+buyerplz+')' + 0367.00 '(*textx =25) + 0368.00 (*texty =85) + 0369.00 (*font =LuciduxSans-Oblique) + 0370.00 (*fontencoding=unicode) + 0371.00 (*fontoption =embedding) + 0372.00 (*fontsize =10)'); 0373.00 PDF_TextLine(Handle:'(*singletext='+buyercity+')' + 0374.00 '(*textx =50) + 0375.00 (*texty =85) + 0376.00 (*font =LuciduxSans-Oblique) + 0377.00 (*fontencoding=unicode) + 0378.00 (*fontoption =embedding) + 0379.00 (*fontsize =10)'); 0380.00 PDF_TextLine(Handle:'(*singletext='+buyerkdnr+')' + 0381.00 '(*textx =60) + 0382.00 (*texty =120) + 0364.00 (*fontencoding=unicode) + 0365.00 (*fontsize =10)'); 0366.00 PDF_TextLine(Handle:'(*singletext='+buyerplz+')' + 0367.00 '(*textx =25) + 0368.00 (*texty =85) + 0369.00 (*font =LuciduxSans-Oblique) + 0370.00 (*fontencoding=unicode) + 0371.00 (*fontoption =embedding) + 0372.00 (*fontsize =10)'); 0373.00 PDF_TextLine(Handle:'(*singletext='+buyercity+')' + 0374.00 '(*textx =50) + 0375.00 (*texty =85) + 0376.00 (*font =LuciduxSans-Oblique) + 0377.00 (*fontencoding=unicode) + 0378.00 (*fontoption =embedding) + 0379.00 (*fontsize =10)'); 0380.00 PDF_TextLine(Handle:'(*singletext='+buyerkdnr+')' + 0381.00 '(*textx =60) + 0382.00 (*texty =120) + 0383.00 (*font =LuciduxSans-Oblique) + 0384.00 (*fontencoding=unicode) + 0385.00 (*fontoption =embedding) + 0386.00 (*fontsize =10)'); 0387.00 PDF_TextLine(Handle:'(*singletext='+invnbra+')' + 0388.00 '(*textx =120) + 0389.00 (*texty =120) + 0390.00 (*font =LuciduxSans-Oblique) + 0391.00 (*fontencoding=unicode) + 0392.00 (*fontoption =embedding) + 0393.00 (*fontsize =10)'); 0394.00 PDF_TextLine(Handle:'(*singletext='+today+')' + 0395.00 '(*textx =165) + 0396.00 (*texty =120) + 0397.00 (*font =LuciduxSans-Oblique) + 0398.00 (*fontencoding=unicode) + 0399.00 (*fontoption =embedding) + 0400.00 (*fontsize =10)'); 0401.00 0402.00 line =140; 0403.00 linea=%char(line); 0404.00 PDF_TextLine(Handle:'(*singletext=Nr)' + 0405.00 ' (*textx =25) + 0406.00 (*texty ='+linea+')' + 0407.00 '(*textoption =fillcolor={gray 0.5}) + 0408.00 (*font =LuciduxSans-Oblique) + 0409.00 (*fontencoding=unicode) + 0410.00 (*fontoption =embedding) + 0411.00 (*fontsize =10)'); 0412.00 PDF_TextLine(Handle:'(*singletext=Artikel)' + 0413.00 '(*textx =35) + 0414.00 (*texty ='+linea+')' + 0415.00 '(*textoption =fillcolor={gray 0.5}) + 0416.00 (*font =LuciduxSans-Oblique) + 0417.00 (*fontencoding=unicode) + 0418.00 (*fontoption =embedding) + 0419.00 (*fontsize =10)'); 0420.00 PDF_TextLine(Handle:'(*singletext=Menge)' + 0421.00 '(*textx =105) + 0422.00 (*texty ='+linea+')' + 0423.00 '(*textoption =fillcolor={gray 0.5}) + 0424.00 (*font =LuciduxSans-Oblique) + 0425.00 (*fontencoding=unicode) + 0426.00 (*fontoption =embedding) + 0427.00 (*fontsize =10)'); 0428.00 PDF_TextLine(Handle:'(*singletext=Währung)' + 0429.00 '(*textx =125) + 0430.00 (*texty ='+linea+')' + 0431.00 '(*textoption =fillcolor={gray 0.5}) + 0432.00 (*font =LuciduxSans-Oblique) + 0433.00 (*fontencoding=unicode) + 0434.00 (*fontoption =embedding) + 0435.00 (*fontsize =10)'); 0436.00 PDF_TextLine(Handle:'(*singletext=Preis)' + 0437.00 '(*textx =145) + 0438.00 (*texty ='+linea+')' + 0439.00 '(*textoption =fillcolor={gray 0.5}) + 0440.00 (*font =LuciduxSans-Oblique) + 0441.00 (*fontencoding=unicode) + 0442.00 (*fontoption =embedding) + 0443.00 (*fontsize =10)'); 0444.00 endsr; 0445.00 //*************************************************************************** 0446.00 /End-free
Das Musterprogramm FERDRetrieve
Das Programm extrahiert die XML-Datei aus dem PDF/A-3b Ferdinv.pdf.
0001.00*************************************************************************** 0002.00 * Program : Ferdretr 0003.00 * Descriptions : Retrieve xml from pdf 0004.00 * Programmer : Toolmaker 0005.00 * Creation Date : 17.11.2015 0006.00*************************************************************************** 0007.00 * H E A D E R - S P E C I F I C A T I O N S 0008.00*************************************************************************** 0009.00 H/COPY Qcpylesrc,H_SPECSPDF 0010.00*************************************************************************** 0011.00 * F I L E S P E C I F I C A T I O N S 0012.00*************************************************************************** 0013.00*************************************************************************** 0014.00 * P R O T O T Y P I N G / C O P Y M E M B E R 0015.00*************************************************************************** 0016.00 D/include qprolesrc,pdfsrvpgm 0017.00 * 0018.00*************************************************************************** 0019.00 * D E F I N I T I O N G L O B A L V A R I A B L E S 0020.00*************************************************************************** 0021.00 0022.00*************************************************************************** 0023.00 * M A I N P R O G R A M 0024.00*************************************************************************** 0025.00 /Free 0026.00 0027.00 PDF_FERDRETRIEVE('(*Docname =/tmp/Ferdinv.pdf) + 0028.00 (*xmlfile =/tmp/zugferd.xml)'); 0029.00 *Inlr=*on; 0030.00 0031.00 /End-free