OBS/Makros und Scripting/Anwendungsbereiche/interaktive PDF

Aus OBS Wiki
Zur Navigation springen Zur Suche springen


Interaktive PDF

Interaktive PDF sind PDF Dokumente, die es erlauben bestimmte Werte direkt einzutragen oder zu ändern.

OBS bietet ebenfalls die Möglichkeiten diese PDF nach der Ausfüllung wieder einzulesen und die eingetragenen Daten zu verarbeiten.

Mithilfe von interaktiven/ausfüllbaren PDF ist es möglich Dokumente außerhalb von OBS zu bearbeiten um zum Beispiel bei einem Kundenbesuch diese über ein Tablet oder Laptop direkt auszufüllen.

Die ausgefüllten Daten können dann direkt in OBS importiert werden und erspart Ihnen eine manuelle Datenerfassung.


Eine Beschreibung inklusive Anwendungs-Beispiel von interaktiven PDF finden Sie unter: Interaktive PDF

Besonderheiten PDF/A

PDF/A ist ein spezielles PDF Format zum langfristigen archivieren von Dokumenten. Dabei ist unter anderem die Unveränderbarkeit des Dokumentes sehr wichtig.

Diese Eigenschaft von PDF/A steht im direkten Kontrast zu interaktiven PDF und hat zur Folge, dass PDF/A interaktive Elemente nur zum teil oder gar nicht unterstützt.

Im besten Fall sollten für interaktive PDF die Formulare 001, 002, 003, 004 und 006 gemieden werden, da diese immer PDF/A erstellen.

Mögliche Steuerelemente

Eingabefled/Textfeld

Einfache Eingabefelder die normalen Text beinhalten.

PDF Textfeld.png

Numerische Felder

Eingabefelder, die nur die Eingabe von Zahlen zulassen

Datumsfelder

Felder zum eintragen eines Datums

Schaltfläche

Drückbare Schaltflächen

Neben den einfachen zurücksetzen des Dokumentes (Reset), bieten diese Schaltflächen auch die Einreichung des Dokumentes an eine externe Website (Submit)

oder das ausführen eines Javascripts für komplexe Aufgaben.

Checkbox

Felder zum ankreuzen

PDF Checkbox.png

Verbundene Checkbox (Radiobox)

Mehrere Felder zum ankreuzen eines Feldes

PDF Radiobox.png

Auswahlbox (Combobox)

Eine Liste vordefinierter auswählbarer Einträge

PDF Combobox.png

Anmerkungen

Kommentar- und Hinweisfelder

PDF Annot.png

Freihand Unterschriften

Im PDF gibt es kein Steuerelement, welches ein Freihand Unterschriften Feld definiert.

Lediglich ein Steuerelement für eine Digitale Signatur ist möglich.


Wenn Sie Freihand Unterschriften eines Kunden hinzufügen wollen, muss diese Funktion vom jeweiligen PDF-Viewer unterstützt werden. (z.B.: Adobe Acrobat Reader oder Xodo)

Erstellung über Druckdateien

Die interaktiven Steuerelemente werden direkt über die Druckdatei von OBS hinzugefügt

Dafür können je nach Komplexität kosten zum anpassen der jeweiligen Drucke anfallen.

Beim Export von Durcken als PDF werden diese interaktiv. Sollte ein solcher Druck "normal" ausgedruckt werden, werden die Steuerelemte nach Möglichkeit zu druckbaren Elementen konvertiert.

Implementierung im Druck

Bei der Implementierung stehen folgende Funktionen zur Verfügung:

//Eingabefeld
qRep_PDFFormFieldEdit(EZ, 'EditField1', oValues);

//Nummerisches Feld
qRep_PDFFormFieldNumEdit(EZ, 'EditField2', oValues);

//Datumsfeld
qRep_PDFFormFieldDateEdit(EZ, 'EditField3', oValues);

//Zeitfeld
qRep_PDFFormFieldTimeEdit(EZ, 'EditField4', oValues);

//Schaltfläche
qRep_PDFFormFieldButton(EZ, 'Schaltfläche', oValues);

//Checkbox
qRep_PDFFormFieldCheckBox(EZ, 'CheckBox', oValues);

//Radiobutton
qRep_PDFFormFieldRadioButton(EZ, 'RadioButton1', oValues);   

//Combobox
qRep_PDFFormFieldCombobox(EZ, 'Combobox', oValues);

//Kommentar
qRep_PDFFormFieldTextAnnot(EZ, 'TextAnot1', oValues);

Die spezifischen Eigenschaften der einzelnen Elemente werden über das oValues Objekt definiert und übergeben.

Dieses Objekt ist vom Typ "TFormFieldValue" und muss vor dem Hinzufügen der einzelnen Werte erstellt und am Ende wieder freigegeben werden.

Das Objekt bietet eine Reset Funktion, die alle Werte des Objekt auf Standard zurück setzt. Dadurch ist es möglich das Objekt mehrfach zu nutzen.

oValues := TFormFieldValue.Create(Rect(10, 10, 50, 20));
oValues.cValue := 'dies ist ein Textfeld';
oValues.lIsMultiline := False;
oValues.oFont.Size := 10;
qRep_PDFFormFieldEdit(EZ, 'EditField1', oValues);

oValues.Reset(Rect(10, 30, 26, 46));
oValues.lChecked := True;
qRep_PDFFormFieldCheckBox(EZ, 'CheckBox', oValues);

MyFreeAndNil(oValues);

Für das Create und Reset wird jeweils ein Rect übergeben, welches die Position im Dokument definiert

Rect(left, top, right, bottom)

oValues.Reset(Rect(qRep_SAnfang(EZ,'pk1'), qRep_Ypos(EZ,y), qRep_SAnfang(EZ,'pk2'), qRep_Ypos(EZ,y+1)));

Verfügbare Werte

Wert Für Typ Werte Standard Wert Beschreibung
aRect: TRect alle Rect für die Positionierung im Dokument
cPreferences: String alle 'afpreadonly'

'afprequired'

[] Definition des Feldes (nur Lesen oder ausfüllen erforderlich)
oBackgroundColor: TColor alle $FFD7CC Farbe des Hintergrunds
oBorderColor: TColor alle clBlack Farbe dess Rahmens
oFont: TFont alle
oFont.Name := 'Arial';
oFont.Size := 10;
oFont.Color := clBlack;
Definition der Schriftart (Schriftstile wie "Fett" oder Kursiv" werden wie folgt definiert):
qSetRepStyle(EZ, [fsBold]);
oValues.Reset(Rect(10, 10, 30, 20));
qRep_PDFFormFieldEdit(EZ, 'Textfeld', oValues);
qSetRepStyle(EZ, []);
Ausnahmen:

Die schriftart von Checkboxen und Radioboxen ist nicht änderbar

lPrintable: Boolean alle True, False True True: Das Feld wird bei normalen Drucken angezeigt
cJavaScript: String

cJavaScriptK: String

Textfeld Textfelder können JavaScript enthalten, um ein bestimmtes Verhalten zu erzeugen.

Nummernfelder und Datumsfelder sind Textfelder mit JavaScript. Zwei Werte können gesetzt werden: cJavaScript: Enthält den auszuführenden Code JavascriptK (KeyStroke): enthält den Code, der beim Tastenanschlag ausgeführt wird.

//Ein Feld mit dem Währungszeichen € (u20AC)
oValues.Reset(Rect(qRep_SAnfang(EZ,'2'), qRep_Ypos(EZ,y), qRep_SAnfang(EZ,'2') + 180, qRep_Ypos(EZ,y+1)));
oValues.cJavaScriptF := 'AFNumber_Format\(2, 2, 0, 0, "\\u20AC", false\);';
oValues.cJavaScriptK := 'AFNumber_Keystroke\(2, 2, 0, 0, "\\u20AC", false\);';
qRep_PDFFormFieldEdit(EZ, 'EditField5' + astr(lP2), oValues);
Funktion Werte Beispiel Beispiel Code
  • AFNumber_Format(nDec, sepStyle, negStyle, currStyle, strCurrency, bCurrencyPrepend)
  • AFNumber_Keystroke(nDec, sepStyle, negStyle, currStyle, strCurrency, bCurrencyPrepend)    
  • nDec: Anzahl der Nachkommastellen
  • sepStyle: Tausender Trennzeichen:
    • 0 = 10,000.20
    • 1 = 10000.20
    • 2 = 10.000,20
    • 3 = 10000,20
  • negStyle: Format für negative Zahlen:
    • 0 = minus, schwarz
    • 1 = minus, rot
  • currStyle: wird nicht verwendet
  • strCurrency: Währungssymbol
  • bCurrencyPrepend prefix ("true') oder postfix ('false')
12,123.03€ AFNumber_Format(2, 0, 3, 0, "\u0024", true);

AFNumber_Keystroke(2, 0, 3, 0, "\u0024", true);

  • AFPercent_Format(nDec, sepStyle)
  • AFPercent_Keystroke(nDec, sepStyle)
  • nDec: Anzahl der Nachkommastellen;
  • sepStyle: Tausender Trennzeichen:
    • 0 = 10,000.20
    • 1 = 10000.20
    • 2 = 10.000,20
    • 3 = 10000,20
32.24% AFPercent_Format(2, 1);

AFPercent_Keystroke(2, 1);

  • AFDate_FormatEx(cFormat)
  • FDate_KeystrokeEx(cFormat)
  • cFormat: Datum Format:
    • "m/d", "m/d/yy", "mm/dd/yy", "mm/yy", "d-mmm", "d-mmm-yy", "dd-mmm-yy", "yymm-dd", "mmm-yy", "mmmm-yy", "mmm d, yyyy", "mmmm d, yyyy", "m/d/yy h:MM tt", "m/d/yy HH:MM"
04/13/2010 AFDate_FormatEx("mm/dd/yyyy");

AFDate_KeystrokeEx("mm/dd/yyyy");

AFTime_Format(ptf)AFTime_Keystroke(ptf)
  • ptf: Zeit Format:
    • 0 = 24HR_MM [ 14:30 ], 1 = 12HR_MM [ 2:30 pm ], 2 = 24HR_MM_SS [ 14:30:15 ], 3 = 12HR_MM_SS [ 2:30:15 pm ]
14:30:15 AFTime_Format(2);

AFTime_Keystroke(2);

AFSpecial_Format(psf)AFSpecial_Keystroke(psf)
  • psf: Format:
    • 0 = zip code
    • 1 = zip + 4
    • 2 = phone
    • 3 = SSN
123-45-6789 AFSpecial_Format(3);

AFSpecial_Keystroke(3);

cValue: String Textfeld

Numerisches Feld

Datumsfeld

Der initialwert eines Feldes
cHAlignment: String Textfeld

Numerisches Feld

Datumsfeld

'tacenter'

'taright'

'taleft'

'taleft' die Textausrichtung eines Feldes

mitte, rechts-, linksbündig

lIsMultiline: Boolean Textfeld

Numerisches Feld

Datumsfeld

True, False False Einzeilig oder mehrzeilige Felder
lIsPassword: Boolean Textfeld

Numerisches Feld

Datumsfeld

True, False False Anzeige von Punkten statt der Eingabe
lIsFileSelect: Boolean Textfeld

Numerisches Feld

Datumsfeld

True, False False Auswahl einer Datei zum speichern des Pfades
lIsDoNotSpellCheck: Boolean Textfeld

Numerisches Feld

Datumsfeld

True, False False Rechtschreibung für das Feld ignorieren
lIsDoNotScroll: Boolean Textfeld

Numerisches Feld

Datumsfeld

True, False False Keine Scrollbar anzeigen
lIsBorder: Boolean Textfeld

Numerisches Feld

Datumsfeld

True, False False Rahmen anzeigen
nMaxLength: Integer Textfeld

Numerisches Feld

Datumsfeld

-1 Maximale länge der Eingabe
nXTextOffsetPtn: Double Textfeld

Numerisches Feld

Datumsfeld

Schaltflächen

0 Korrektur des anzuzeigenden Textes auf der X-Achse in Punkte

Für bestimmte Fonts kann es nötig sein diese anzupassen,

da der Text nicht korrekt Positioniert wird

nYTextOffsetPtn: Double Textfeld

Numerisches Feld

Datumsfeld

Schaltflächen

0 Korrektur des anzuzeigenden Textes auf der Y-Achse in Punkte

Für bestimmte Fonts kann es nötig sein diese anzupassen,

da der Text nicht korrekt Positioniert wird

nBorderWidth: Integer Schaltflächen 1 Rahmenbreite
lVisible: Boolean Schaltflächen True, False True Sichbarkeit der Schaltfläche
cNormalCaption: String Schaltflächen Text bei normaler Anzeige der Schaltfläche
cRolloverCaption: String Schaltflächen cNormalCaption Text beim berühren der Schaltfläche mit der Maus
cDownCaption: String Schaltflächen cNormalCaption Text beim betätigen der Schaltfläche
cJavaScript: String Schaltflächen Hinterlegtes Javascript bei Typ 'pbajavascript'
cJavaScript := 'app.alert("Hello World")';

cJavaScript :=
' var tf1 = this.getField("tfName");             ' +
' var btn1 = this.getField("pbValidate");        ' +
' var btn2 = this.getField("pbSubmit");          ' +
' if (tf1.valueAsString.length > 3) {            ' +
'   tf1.value = tf1.valueAsString.toUpperCase(); ' +
'   btn2.buttonSetCaption("Submit");             ' +
'   btn1.display = display.hidden;               ' +
'   btn1.setFocus();                             ' +
' } else {                                       ' +
'   app.alert("Please enter a valid name.");     ' +
'   tf1.setFocus();                              ' +
' }';
cAction: String Schaltflächen 'pbaNone'

'pbasubmit'

'pbareset'

'pbajavascript'

'pbaNone' Typ der Schaltfläche
cSubmitURL: String Schaltflächen URL bei Typ 'pbasubmit'
cSubmitURL := 
'http://www.bergau.de/200804/forms_test.asp';
cFormSubmitFormat: String Schaltflächen 'fsfhtml'

'fsffdf' 'fsfxml'

'fsfhtml' Format der Einreichung
lAtleastOneSelectedItem: Boolean Radiobox True, False False Mindestens ein Feld muss ausgefüllt sein
AddRadioItem

(qr_printer: TQR_Printer; Rect:TRect)

Radiobox Methode zum hinzufügen von Werten
lChecked: Boolean CheckBox

Radiobox

True, False False Checkbox ist bei der Erstellung angehakt
cSymbol: String CheckBox

Radiobox

'pfcsCross'

'pfcscheck'

'pfcscircle'

'pfcsdiamond'

'pfcssquare'

'pfcsstar'

'pfcsCross' Symbol für die Checkbox
lIsEditable: Boolean ComboBox True, False False Einträge können hinzugefügt werden
lIsSortList: Boolean ComboBox True, False False Einträge werden Sortiert.

nSelectedItemIndex wird dann aber unter

Umständen nicht mehr korrekt funktionieren

cBoxItems: String ComboBox Einträge der Combobox
oValue.cBoxItems := oValue.cBoxItems + 'Test' + '|' + 'Test2';
nSelectedItemIndex: Integer ComboBox

Radiobox

-1 vorausgewählter Eintrag
cTitel: String Anmerkungen Titel der Anmerkung
cSubject: String Anmerkungen Betreff der Anmerkung
cContents: String Anmerkungen Inhalt der Anmerkung
lOpen: Boolean Anmerkungen True, False False Anmerkung wird beim öffnen des PDF angezeigt
cTyp: String Anmerkungen 'tncomment'

'tninsert'

'tnparagraph'

tnnewparagraph'

'tnhelp'

'tnnote'

'tnkey'

'tncomment' Typ der Anmerkung

Beispiele

Reparaturauftrag Beispiel 1

Reparaturauftrag PDF Beispiel 1 .png

...
procedure Kopf();
var cBuffer   : String;
    cLK       : String;
    cOrt      : String;
    cPLZ      : String;
    cVorname  : String;
    cName     : String;
    cZusatz1  : String;
    cZusatz2  : String;
    cWhere    : String;
    i         : integer;
    oQRCode   : TBitMap;
	nRunMater : Double;
    oValues   : TFormFieldValue;
    qQuery    : TxQuery;
begin
 
	nRunMater := 7.5; 
	//nRunMater := 5; 
 
  with EZ do begin

    QRCode('OBSRA'+A_Query.A2C('a_nr'),-1,-1,3,oQRCode);   
	
	
	qRep_BildPrint(EZ,oQRCode,'',qRep_SAnfang(EZ,'newM1'),80,80,qRep_Ypos(EZ,y+2.1));
    oQRCode.Free;
    
    oValues := TFormFieldValue.Create();

 	qSetRepFontSize(EZ,iFontgroesse+2);
    qSetRepStyle(EZ,[fsBold]);
    qRep_Stext(EZ,'new5' ,'Dienstleistungsauftrag',qRep_Ypos(EZ,y+1.5));
    qSetRepStyle(EZ,[]);
    qSetRepFontSize(EZ,iFontgroesse);
	
	qRep_Stext(EZ,'new5' ,'Auftragsnummer',qRep_Ypos(EZ,y+3.5));
    qRep_Stext(EZ,'new5' ,'Kunden-Nr.'    ,qRep_Ypos(EZ,y+4.5));
    qRep_Stext(EZ,'new5' ,'Auftragsdatum' ,qRep_Ypos(EZ,y+5.5));
	
	qRep_Text3(EZ,qRep_SAnfang(EZ,'5')-21,qRep_YPos(Ez,y+3.5),': ' + A_Query.A2C('a_nr'));
	qRep_Text3(EZ,qRep_SAnfang(EZ,'5')-21,qRep_YPos(Ez,y+4.5),': ' + A_Query.A2C('a_knr'));
	qRep_Text3(EZ,qRep_SAnfang(EZ,'5')-21,qRep_YPos(Ez,y+5.5),': ' + A_Query.A2C('a_datum'));

    nUnterBox := y+7;
        
	qx_PrintRect(EZ,qRep_SAnfang(EZ,'new4')+77,qRep_Ypos(EZ,y+1),qRep_Sanfang(EZ,'newR'),qRep_Ypos(EZ,y+6.5),StrToInt(PMode_Var(600)));

    cBuffer := DB_ReadSQLValue(oDB,'S_ANRED','ar_name','ar_nr='+DB_SQLVal(A_Query.A2C('a_anrede'),'C'));
    if (not empty(cbuffer)) then begin
      qRep_Text3(EZ,iLinkerRand,qRep_Ypos(EZ,y),cBuffer);
      y := y + 1;
      cBuffer := '';
    end;

    cVorname := A_Query.A2C('a_vorname');
    cName    := A_Query.A2C('a_name');
    if (not(empty(cVorname))) then begin
      cBuffer := cVorname + ' ';
    end;
    if (not(empty(cName))) then begin
      cBuffer := cBuffer + cName;
    end;
    if (not empty(cBuffer)) then begin
      qRep_Text3(EZ,iLinkerRand,qRep_Ypos(EZ,y),cBuffer);
      y := y + 1;
      cBuffer := '';
    end;

    cZusatz1 := A_Query.A2C('a_zusatz1');
    cZusatz2 := A_Query.A2C('a_zusatz2');
    
    if (not(empty(cZusatz1))) then begin
      qRep_Text3(EZ,iLinkerRand,qRep_Ypos(EZ,y),cZusatz1);
      y := y + 1;
    end;
    if (not(empty(cZusatz2))) then begin
      qRep_Text3(EZ,iLinkerRand,qRep_Ypos(EZ,y),cZusatz2);
      y := y + 1;
    end;

    cBuffer := A_Query.A2C('a_postf');
    if (not empty(cBuffer)) then begin
      qRep_Text3(EZ,iLinkerRand,qRep_Ypos(EZ,y),'Postfach '+cBuffer);
      y := y + 2;
      cBuffer := '';
    end else begin
      cBuffer := A_Query.A2C('a_strasse');
      if (not empty(cBuffer)) then begin
        qRep_Text3(EZ,iLinkerRand,qRep_Ypos(EZ,y),cBuffer);
        y := y + 2;
        cBuffer := '';
      end;
    end;

    cLK  := A_Query.A2C('a_LK');
    cPLZ := A_Query.A2C('a_PLZ');
    cOrt := A_Query.A2C('a_Ort');

    if (not(empty(cLK))) then begin
      cBuffer := cLK + ' ';
    end;
    if (not(empty(cPLZ))) then begin
      cBuffer := cBuffer + cPLZ + ' ';
    end;
    if (not(empty(cOrt))) then begin
      cBuffer := cBuffer + cOrt;
    end;

    if (not empty(cBuffer)) then begin
      qRep_Text3(EZ,iLinkerRand,qRep_Ypos(EZ,y),cBuffer);
      cBuffer := '';
      y := y + 2;
    end;

    y := nUnterBox;
    
    if (not(empty(cZusatz1))) and (not(empty(cZusatz2))) then begin 
      y := y + 2;
    end else if (not(empty(cZusatz1))) or (not(empty(cZusatz2))) then begin
      y := y + 1;
    end;
    
    cBuffer := DB_ReadSQLValue(oDB,'S_VERK','v_name','v_nr='+DB_SQLVal(A_Query.A2C('a_verk'),'C'));
    if (not empty(cbuffer)) then begin
      qRep_Text3(EZ,iLinkerRand,qRep_Ypos(EZ,y),'Sachbearbe.');
      qRep_Stext(EZ,'2',':',qRep_Ypos(EZ,y));
      qRep_Stext(EZ,'3',cBuffer,qRep_Ypos(EZ,y));
      cBuffer := '';
    end;
    
    y := y + 1.3;

    qRep_Text3(EZ,iLinkerRand,qRep_Ypos(EZ,y),'Gerät');
    qRep_Stext(EZ,'2',':',qRep_Ypos(EZ,y));
    qRep_Stext(EZ,'3',A_Query.A2C('a_gnr')+' '+A_Query.A2C('a_geraet'),qRep_Ypos(EZ,y));

    y := y + 1;

    qRep_Stext(EZ,'3',A_Query.A2C('a_modell'),qRep_Ypos(EZ,y));

    y := y + 1;

    if (A_Query.A2C('a_mwart') = '1') then begin
       qRep_Stext(EZ,'3','WARTUNGSVERTRAG',qRep_Ypos(EZ,y));
    end;

    y := y + 1;

    qRep_Text3(EZ,iLinkerRand,qRep_Ypos(EZ,y),'Techniker');
    qRep_Stext(EZ,'2',':',qRep_Ypos(EZ,y));

    //Techniker
    cWhere  := 'a_nr=' + DB_SQLVal(A_Query.A2C('a_nr'));
    cBuffer := DB_ReadSQLValue(oDB,'RAUFSTA','a_techni',cWhere);
    cWhere  := 'm_nr=' + DB_SQLVal(cBuffer);
    cBuffer := DB_ReadSQLValue(oDB,'MITARB','m_vorname',cWhere);
    cBuffer := cBuffer + ' ' + DB_ReadSQLValue(oDB,'MITARB','m_name',cWhere);
    oValues.Reset(Rect(qRep_SAnfang(EZ, '3'), qRep_Ypos(EZ, y), qRep_Sanfang(EZ,'4')-50, qRep_Ypos(EZ, y+1)));
    
    cSQL := 'SELECT * FROM mitarb WHERE m_inaktiv <> "1" ORDER BY m_name';
    if (DB_SOPen(oDB,cSQL,qQuery,False)) then begin
        i := 0;
        while (not qQuery.EOF) do begin
            if not empty(oValues.cBoxItems) then begin
                oValues.cBoxItems := oValues.cBoxItems + '|';
            end;
            oValues.cBoxItems := oValues.cBoxItems + qQuery.A2C('m_vorname') + ' ' + qQuery.A2C('m_name');
            if (cBuffer = qQuery.A2C('m_vorname') + ' ' + qQuery.A2C('m_name')) then begin
                oValues.nSelectedItemIndex := i;        
            end;
            i := i + 1;
            qQuery.Next;
        end;
    end;
   DB_Close(qQuery);
    
    qRep_PDFFormFieldComboBox(EZ, 'Techniker', oValues);
    
    y := y + 1.2;

    qRep_Text3(EZ,iLinkerRand,qRep_Ypos(EZ,y),'Störung');
    qRep_Stext(EZ,'2',':',qRep_Ypos(EZ,y));

    cBuffer := A_Query.A2C('a_stoer1');
    if (not empty(cBuffer)) then begin
      qRep_Stext(EZ,'3',cBuffer,qRep_Ypos(EZ,y));
      cBuffer := '';
	  nRunMater := nRunMater + 1;
    end;
    
    y := y + 1;

    cBuffer := A_Query.A2C('a_stoer2');
    if (not empty(cBuffer)) then begin
      qRep_Stext(EZ,'3',cBuffer,qRep_Ypos(EZ,y));
      cBuffer := '';
	  nRunMater := nRunMater + 1;
    end;

    y := y + 1;

    cBuffer := A_Query.A2C('a_stoer3');
    if (not empty(cBuffer)) then begin
      qRep_Stext(EZ,'3',cBuffer,qRep_Ypos(EZ,y));
      cBuffer := '';
	  nRunMater := nRunMater + 1;
    end;

    y := nUnterBox;

    if (not(empty(Alltrim(A_Query.A2C('a_anspr'))))) then begin
      qRep_Stext(EZ,'new5','Ansprechpart.',qRep_Ypos(EZ,y));      
      qRep_Text3(EZ,qRep_SAnfang(EZ,'5')-21,qRep_YPos(Ez,y),': ' + A_Query.A2C('a_anspr'));
    end;

    y := y + 1;
	
	qRep_Stext(EZ,'new5','Telefon',qRep_Ypos(EZ,y));      
    qRep_Text3(EZ,qRep_SAnfang(EZ,'5')-21,qRep_YPos(Ez,y),': ' + A_Query.A2C('a_tel1'));

    y := y + 1;
	
	qRep_Stext(EZ,'new5','Serien-Nr',qRep_Ypos(EZ,y));      
    qRep_Text3(EZ,qRep_SAnfang(EZ,'5')-21,qRep_YPos(Ez,y),': ' + A_Query.A2C('a_sernr'));   

    y := y + 1;

	if (not(empty(Alltrim(A_Query.A2c('a_terminstr'))))) then begin
		qRep_Stext(EZ,'new5','Termin',qRep_Ypos(EZ,y));      
		qRep_Text3(EZ,qRep_SAnfang(EZ,'5')-21,qRep_YPos(Ez,y),': ' + A_Query.A2C('a_terminstr'));  		
	end else begin
		if (not(empty(Alltrim(A_Query.A2C('a_termin'))))) then begin
				qRep_Stext(EZ,'new5','Termin',qRep_Ypos(EZ,y));    
			if ((not(empty(Alltrim(A_Query.A2C('a_zeit'))))) and (Alltrim(A_Query.A2C('a_zeit')) <> ':')) then begin
				qRep_Text3(EZ,qRep_SAnfang(EZ,'5')-21,qRep_YPos(Ez,y),': ' + A_Query.A2C('a_termin')+' / '+A_Query.A2C('a_zeit'));
			end else begin
				qRep_Text3(EZ,qRep_SAnfang(EZ,'5')-21,qRep_YPos(Ez,y),': ' + A_Query.A2C('a_termin')); 
			end;
		end;
	end;
    
    myFreeandNil(oValues);    
    y := nUnterBox + nRunMater;

  end;

end;

//------------------------------------------------------------------

procedure Material();
var nZeile  : Integer;
    nInc    : Double;
    oValues : TFormFieldValue;
begin
    
    oValues := TFormFieldValue.Create();
	qSetRepStyle(EZ,[fsBold]);
	qRep_Stext(EZ,'newL','Material',qRep_Ypos(EZ,y));
	qSetRepStyle(EZ,[]);
	
 y := y + 1;
	
	qRep_Text3(EZ,qRep_SAnfang(EZ,'newL')+3,qRep_YPos(Ez,y),'Artikelnr.');
	qRep_Text3(EZ,qRep_SAnfang(EZ,'newM2')+3,qRep_YPos(Ez,y),'Artikelnr.');
	qRep_Text3(EZ,qRep_SAnfang(EZ,'new2')+3,qRep_YPos(Ez,y),'Bezeichnung');
	qRep_Text3(EZ,qRep_SAnfang(EZ,'new5')+3,qRep_YPos(Ez,y),'Bezeichnung');
	qRep_Text3(EZ,qRep_SAnfang(EZ,'new3')+3,qRep_YPos(Ez,y),'Menge');
	qRep_Text3(EZ,qRep_SAnfang(EZ,'new6')+3,qRep_YPos(Ez,y),'Menge');
	
	nInc := MATERIAL_ZEILEN * 1.3 + 1;
	
	for nZeile := 1 to MATERIAL_ZEILEN do begin
        y := y + 1.3;
        //Artikelnr
        oValues.Reset(Rect(qRep_SAnfang(EZ, 'newL'), qRep_Ypos(EZ, y), qRep_Sanfang(EZ,'new2')-20, qRep_Ypos(EZ, y+1)));
        oValues.cValue := '';
        oValues.lIsMultiline := False;
        qRep_PDFFormFieldEdit(EZ, 'ArtNr' + aStr(nZeile), oValues);
        //Bezeichnung
        oValues.Reset(Rect(qRep_SAnfang(EZ, 'new2'), qRep_Ypos(EZ, y), qRep_Sanfang(EZ,'new3')-20, qRep_Ypos(EZ, y+1)));
        oValues.cValue := '';
        oValues.lIsMultiline := False;
        qRep_PDFFormFieldEdit(EZ, 'Bezeichnung' + aStr(nZeile), oValues);
        //Menge 
        oValues.Reset(Rect(qRep_SAnfang(EZ, 'new3'), qRep_Ypos(EZ, y), qRep_Sanfang(EZ,'newM2')-20, qRep_Ypos(EZ, y+1)));
        oValues.cValue := '';
        oValues.lIsMultiline := False;
        qRep_PDFFormFieldNumEdit(EZ, 'Menge' + aStr(nZeile), oValues);
        //Artikelnr
        oValues.Reset(Rect(qRep_SAnfang(EZ, 'newM2'), qRep_Ypos(EZ, y), qRep_Sanfang(EZ,'new5')-20, qRep_Ypos(EZ, y+1)));
        oValues.cValue := '';
        oValues.lIsMultiline := False;
        qRep_PDFFormFieldEdit(EZ, 'ArtNr' + aStr(nZeile + 7), oValues);
        //Bezeichnung
        oValues.Reset(Rect(qRep_SAnfang(EZ, 'new5'), qRep_Ypos(EZ, y), qRep_Sanfang(EZ,'new6')-20, qRep_Ypos(EZ, y+1)));
        oValues.cValue := '';
        oValues.lIsMultiline := False;
        qRep_PDFFormFieldEdit(EZ, 'Bezeichnung' + aStr(nZeile + 7), oValues);
        //Menge 
        oValues.Reset(Rect(qRep_SAnfang(EZ, 'new6'), qRep_Ypos(EZ, y), iRechterRand, qRep_Ypos(EZ, y+1)));
        oValues.cValue := '';
        oValues.lIsMultiline := False;
        qRep_PDFFormFieldNumEdit(EZ, 'Menge' + aStr(nZeile + 7), oValues);

	end;
    y := y +1;    
    myFreeandNil(oValues);
end;

//------------------------------------------------------------------

procedure Stunden();
var nZeile  : Integer;
    nInc    : Double;
    oValues : TFormFieldValue;
begin
	
    oValues := TFormFieldValue.Create();
    
 y := y + 1;
	
	qSetRepStyle(EZ,[fsBold]);
	qRep_Stext(EZ,'newL','Ausgeführte Tätigkeiten',qRep_Ypos(EZ,y-0.5));
	qSetRepStyle(EZ,[]);
	
 y := y + 0.5;
	//MultiLine
    oValues.Reset(Rect(qRep_SAnfang(EZ, 'newL'), qRep_Ypos(EZ, y), iRechterRand, qRep_Ypos(EZ, y+7.5)));
    oValues.cValue := 'Hier ausgeführte Arbeiten erfassen';
    oValues.lIsMultiline := True;
    qRep_PDFFormFieldEdit(EZ, 'RepText', oValues);
    
    myFreeandNil(oValues);
    y := y + 7.5;
	
end;

//------------------------------------------------------------------

procedure Fuss();
var cBuffer    : String;
    iZeilen    : Integer;
    i          : Integer;
    nYtmp      : Double;
    cResultVor : String;
    oValues    : TFormFieldValue;
begin
    oValues := TFormFieldValue.Create();
    
	qx_PrintRect(EZ,qRep_SAnfang(EZ,'newL'),qRep_Ypos(EZ,y+1),qRep_Sanfang(EZ,'newR'),qRep_Ypos(EZ,y+8),StrToInt(PMode_Var(600)));	
 y := y + 1.5;
	//Links
	qSetRepStyle(EZ,[fsBold]);
	qRep_Text3(EZ,qRep_SAnfang(EZ,'newL')+3,qRep_YPos(Ez,y),'VDE-Prüfung');  		
	qSetRepStyle(EZ,[]);
	qRep_Text3(EZ,qRep_SAnfang(EZ,'new2')-5,qRep_YPos(Ez,y),'nach DIN VDE 0701-0702 durchgeführt');
	qRep_Text3(EZ,qRep_SAnfang(EZ,'newL')+3,qRep_YPos(Ez,y+1.3),'1. Sichtprüfung i.O.');
	qRep_Text3(EZ,qRep_SAnfang(EZ,'newL')+3,qRep_YPos(Ez,y+2.6),'3. Isolationswiderstand');
	qRep_Text3(EZ,qRep_SAnfang(EZ,'newL')+3,qRep_YPos(Ez,y+3.9),'5. Berührungsstrom' );
	qSetRepFontSize(EZ,iFontgroesse-4);
	qRep_Text3(EZ,qRep_SAnfang(EZ,'new2')+27,qRep_YPos(Ez,y+4.2),'Diff / Dir / EA');
	qSetRepFontSize(EZ,iFontgroesse);
	qRep_Text3(EZ,qRep_SAnfang(EZ,'newL')+3,qRep_YPos(Ez,y+5.2),'Prüfung bestanden' );
	
	//Links J/N
	qRep_Text3(EZ,qRep_SAnfang(EZ,'new3')-75,qRep_YPos(Ez,y+1.3),'ja           nein' );
    oValues.Reset();
    oValues.AddRadioItem(EZ, Rect(qRep_SAnfang(EZ,'new3')-100, qRep_Ypos(EZ,y+1.3)+1, qRep_SAnfang(EZ,'new3') -88, qRep_Ypos(EZ,y+2.3)-2));
    oValues.AddRadioItem(EZ, Rect(qRep_SAnfang(EZ,'new3')-50, qRep_Ypos(EZ,y+1.3)+1, qRep_SAnfang(EZ,'new3') - 38, qRep_Ypos(EZ,y+2.3)-2));
    oValues.lAtleastOneSelectedItem := False;
    qRep_PDFFormFieldRadioButton(EZ, 'Sichtpruefung', oValues);   
    
	qRep_Text3(EZ,qRep_SAnfang(EZ,'new3')-75,qRep_YPos(Ez,y+2.6),'_______ MOhm' );
    oValues.Reset(Rect(qRep_SAnfang(EZ, 'new3')-75, qRep_Ypos(EZ, y+2.6), qRep_SAnfang(EZ, 'new3')-25, qRep_Ypos(EZ, y+3.6)));
    oValues.cValue := '';
    oValues.lIsMultiline := False;
    qRep_PDFFormFieldEdit(EZ, 'Isolationswiderstand', oValues);
    
	qRep_Text3(EZ,qRep_SAnfang(EZ,'new3')-75,qRep_YPos(Ez,y+3.9),'_______ mA' );
    oValues.Reset(Rect(qRep_SAnfang(EZ, 'new3')-75, qRep_Ypos(EZ, y+3.9), qRep_SAnfang(EZ, 'new3')-25, qRep_Ypos(EZ, y+4.9)));
    oValues.cValue := '';
    oValues.lIsMultiline := False;
    qRep_PDFFormFieldEdit(EZ, 'Beruehrungsstrom', oValues);
    
	qRep_Text3(EZ,qRep_SAnfang(EZ,'new3')-75,qRep_YPos(Ez,y+5.2),'ja           nein -> Gerät nicht in Betrieb nehmen!' );
    oValues.Reset();
    oValues.AddRadioItem(EZ, Rect(qRep_SAnfang(EZ,'new3')-100, qRep_Ypos(EZ,y+5.2)+1, qRep_SAnfang(EZ,'new3') -88, qRep_Ypos(EZ,y+6.2)-2));
    oValues.AddRadioItem(EZ, Rect(qRep_SAnfang(EZ,'new3')-50, qRep_Ypos(EZ,y+5.2)+1, qRep_SAnfang(EZ,'new3') - 38, qRep_Ypos(EZ,y+6.2)-2));
    oValues.lAtleastOneSelectedItem := False;
    qRep_PDFFormFieldRadioButton(EZ, 'Bestanden', oValues);   
    
	
	//Rechts
	qRep_Text3(EZ,qRep_SAnfang(EZ,'newM2')+3,qRep_YPos(Ez,y),'ja           nein' );
    oValues.Reset();
    oValues.AddRadioItem(EZ, Rect(qRep_SAnfang(EZ,'newM2')-20, qRep_Ypos(EZ,y)+1, qRep_SAnfang(EZ,'newM2') -8, qRep_Ypos(EZ,y+1)-2));
    oValues.AddRadioItem(EZ, Rect(qRep_SAnfang(EZ,'newM2')+30, qRep_Ypos(EZ,y)+1, qRep_SAnfang(EZ,'newM2') +42, qRep_Ypos(EZ,y+1)-2));
    oValues.lAtleastOneSelectedItem := False;
    qRep_PDFFormFieldRadioButton(EZ, 'VDE_Pruefung', oValues);   
    
	qRep_Text3(EZ,qRep_SAnfang(EZ,'newM2')+3,qRep_YPos(Ez,y+1.3),'2. Schutzleiterwiderstand');
	qRep_Text3(EZ,qRep_SAnfang(EZ,'newM2')+3,qRep_YPos(Ez,y+2.6),'4. Schutzleiterstrom');
	qSetRepFontSize(EZ,iFontgroesse-4);
	qRep_Text3(EZ,qRep_SAnfang(EZ,'new5')+30,qRep_YPos(Ez,y+2.9),'Diff / Dir / EA');	
	qRep_Text3(EZ,qRep_SAnfang(EZ,'newM2')+3,qRep_YPos(Ez,y+4.2),'Messgerät BENNING ST 720 Ser.Nr.: 05F-0198   13F-0975   46G-0253   13F-0970');
	qSetRepFontSize(EZ,iFontgroesse);
	
	//Rechts J/N
	qRep_Text3(EZ,qRep_SAnfang(EZ,'new6')-75,qRep_YPos(Ez,y+1.3),'_______ Ohm');
    oValues.Reset(Rect(qRep_SAnfang(EZ, 'new6')-75, qRep_Ypos(EZ, y+1.3), qRep_SAnfang(EZ, 'new6')-25, qRep_Ypos(EZ, y+2.3)));
    oValues.cValue := '';
    oValues.lIsMultiline := False;
    qRep_PDFFormFieldEdit(EZ, 'Schutzleiterwiderstand', oValues);
    
	qRep_Text3(EZ,qRep_SAnfang(EZ,'new6')-75,qRep_YPos(Ez,y+2.6),'_______ mA');
    oValues.Reset(Rect(qRep_SAnfang(EZ, 'new6')-75, qRep_Ypos(EZ, y+2.6), qRep_SAnfang(EZ, 'new6')-25, qRep_Ypos(EZ, y+3.6)));
    oValues.cValue := '';
    oValues.lIsMultiline := False;
    qRep_PDFFormFieldEdit(EZ, 'Schutzleiterstrom', oValues);
	
 y := y + 7.5;
	
	qx_PrintRect(EZ,qRep_SAnfang(EZ,'newL'),qRep_Ypos(EZ,y),qRep_Sanfang(EZ,'newR'),qRep_Ypos(EZ,y+3),StrToInt(PMode_Var(600)));
	
 y := y + 0.5;
	
	//Links
	qRep_Text3(EZ,qRep_SAnfang(EZ,'newL')+3,qRep_YPos(Ez,y),'Wegezeit' );
    //Wegezeit
    oValues.Reset(Rect(qRep_SAnfang(EZ, 'new2')+60, qRep_Ypos(EZ, y), qRep_Sanfang(EZ,'new2')+100, qRep_Ypos(EZ, y+1)));
    oValues.cJavaScript  := 'AFTime_Format\(0\);';
    oValues.cJavaScriptK := 'AFTime_KeyStroke\(0\);';
    oValues.cValue       := '00:00';
    qRep_PDFFormFieldTimeEdit(EZ, 'WegezeitVon', oValues);
    oValues.Reset(Rect(qRep_SAnfang(EZ, 'new2')+130, qRep_Ypos(EZ, y), qRep_Sanfang(EZ,'new2')+170, qRep_Ypos(EZ, y+1)));
    oValues.cJavaScript  := 'AFTime_Format\(0\);';
    oValues.cJavaScriptK := 'AFTime_KeyStroke\(0\);';
    oValues.cValue       := '00:00';
    qRep_PDFFormFieldTimeEdit(EZ, 'WegezeitBis', oValues);
    
	qRep_Text3(EZ,qRep_SAnfang(EZ,'newL')+3,qRep_YPos(Ez,y+1.3),'Arbeitscode' );
	qSetRepFontSize(EZ,iFontgroesse-4);																
	qRep_Text3(EZ,qRep_SAnfang(EZ,'new2')+38,qRep_YPos(Ez,y+0.075),'von :                         bis :' );
	qRep_Text3(EZ,qRep_SAnfang(EZ,'new2')+38,qRep_YPos(Ez,y+1.475),'Sym.:    	       	            Urs.:    	       	            Akt.:' );
	qSetRepFontSize(EZ,iFontgroesse);
    //FehlerCode
    oValues.Reset(Rect(qRep_SAnfang(EZ, 'new2')+60, qRep_Ypos(EZ, y+1.3), qRep_Sanfang(EZ,'new2')+100, qRep_Ypos(EZ, y+2.3)));
	oValues.cBoxItems := '|B01|B02|B03|B04|B05|B06|B07|B08|B09|B10|B11|B12|B13|B14|B15|B16|B17|B18|B19|B20';
    oValues.cBoxItems := oValues.cBoxItems+'|B21|B22|B23|B24|B25|M01|M02|M03|M04|M05|M06|M07|M08|M09|M10|P01|P02|P03|P04|P05';
    oValues.cBoxItems := oValues.cBoxItems+'|P06|P07|S01|S02|S03|S04|S05|S06|S07|S08|S09|S10';
    oValues.nSelectedItemIndex := 0;
    qRep_PDFFormFieldComboBox(EZ, 'Fehlercode', oValues);
    //Ersatzscode
    oValues.Reset(Rect(qRep_SAnfang(EZ, 'new2')+130, qRep_Ypos(EZ, y+1.3), qRep_Sanfang(EZ,'new2')+170, qRep_Ypos(EZ, y+2.3)));
	oValues.cBoxItems := '|E01|E02|E03|E04|E05|E06|E07|E08|E09|E10|E11|E12|E13|E14|E15';
    oValues.nSelectedItemIndex := 0;
    qRep_PDFFormFieldComboBox(EZ, 'Ersatzcode', oValues);
    
    //Arbeitscode
    oValues.Reset(Rect(qRep_SAnfang(EZ, 'new2')+200, qRep_Ypos(EZ, y+1.3), qRep_Sanfang(EZ,'new2')+240, qRep_Ypos(EZ, y+2.3)));
	oValues.cBoxItems := '|A01|A02|A03|A04|A05|A06|A07|A08|A09|A10|A11|A12|A13|A14|A15|A16';
    oValues.nSelectedItemIndex := 0;
    qRep_PDFFormFieldComboBox(EZ, 'Arbeitscode', oValues);
        
	//Rechts
	qRep_Text3(EZ,qRep_SAnfang(EZ,'newM2')+3,qRep_YPos(Ez,y),'Arbeitszeit' );
    //Arbeitszeit
    oValues.Reset(Rect(qRep_SAnfang(EZ, 'new6')-50, qRep_Ypos(EZ, y), qRep_Sanfang(EZ,'new6')-10, qRep_Ypos(EZ, y+1)));
    oValues.cJavaScript  := 'AFTime_Format\(0\);';
    oValues.cJavaScriptK := 'AFTime_KeyStroke\(0\);';
    oValues.cValue       := '00:00';
    qRep_PDFFormFieldTimeEdit(EZ, 'ArbeitszeitVon', oValues);
    oValues.Reset(Rect(qRep_SAnfang(EZ, 'new6')+10, qRep_Ypos(EZ, y), qRep_Sanfang(EZ,'new6')+50, qRep_Ypos(EZ, y+1)));
    oValues.cJavaScript  := 'AFTime_Format\(0\);';
    oValues.cJavaScriptK := 'AFTime_KeyStroke\(0\);';
    oValues.cValue       := '00:00';
    qRep_PDFFormFieldTimeEdit(EZ, 'ArbeitszeitBis', oValues);
    
	qRep_Text3(EZ,qRep_SAnfang(EZ,'newM2')+3,qRep_YPos(Ez,y+1.3),'Arbeit abgeschlossen' );
	qSetRepFontSize(EZ,iFontgroesse-4);
	qRep_Text3(EZ,qRep_SAnfang(EZ,'new6')-75,qRep_YPos(Ez,y),'von :                      		   bis :' );
	qSetRepFontSize(EZ,iFontgroesse);
	qRep_Text3(EZ,qRep_SAnfang(EZ,'new6')-75,qRep_YPos(Ez,y+1.3),'ja           FR' );
    //qRep_Text3(EZ,qRep_SAnfang(EZ,'newM2')+3,qRep_YPos(Ez,y),'ja           nein' );
    oValues.Reset();
    oValues.AddRadioItem(EZ, Rect(qRep_SAnfang(EZ,'new6')-50, qRep_Ypos(EZ,y+1.3)+1, qRep_SAnfang(EZ,'new6') -38, qRep_Ypos(EZ,y+2.3)-2));
    oValues.AddRadioItem(EZ, Rect(qRep_SAnfang(EZ,'new6')+10, qRep_Ypos(EZ,y+1.3)+1, qRep_SAnfang(EZ,'new6') +22, qRep_Ypos(EZ,y+2.3)-2));
    oValues.lAtleastOneSelectedItem := False;
    qRep_PDFFormFieldRadioButton(EZ, 'abgeschlossen', oValues);
	
 y := y + 3.5;
	//X
	qx_PrintLine(EZ,qRep_Sanfang(EZ,'newL'),qRep_Ypos(EZ,y),qRep_Sanfang(EZ,'newM1'),qRep_Ypos(EZ,y),StrToInt(PMode_Var(600)));
	qx_PrintLine(EZ,qRep_Sanfang(EZ,'newL'),qRep_Ypos(EZ,y+3.5),qRep_Sanfang(EZ,'newM1'),qRep_Ypos(EZ,y+3.5),StrToInt(PMode_Var(600)));
	qx_PrintLine(EZ,qRep_Sanfang(EZ,'newM2'),qRep_Ypos(EZ,y),qRep_Sanfang(EZ,'newR'),qRep_Ypos(EZ,y),StrToInt(PMode_Var(600)));
	qx_PrintLine(EZ,qRep_Sanfang(EZ,'newM2'),qRep_Ypos(EZ,y+3.5),qRep_Sanfang(EZ,'newR'),qRep_Ypos(EZ,y+3.5),StrToInt(PMode_Var(600)));
	//Y
	qx_PrintLine(EZ,qRep_Sanfang(EZ,'newL'),qRep_Ypos(EZ,y),qRep_Sanfang(EZ,'newL'),qRep_Ypos(EZ,y+3.5),StrToInt(PMode_Var(600)));
	qx_PrintLine(EZ,qRep_Sanfang(EZ,'newM1'),qRep_Ypos(EZ,y),qRep_Sanfang(EZ,'newM1'),qRep_Ypos(EZ,y+3.5),StrToInt(PMode_Var(600)));
	qx_PrintLine(EZ,qRep_Sanfang(EZ,'newM2'),qRep_Ypos(EZ,y),qRep_Sanfang(EZ,'newM2'),qRep_Ypos(EZ,y+3.5),StrToInt(PMode_Var(600)));
	qx_PrintLine(EZ,qRep_Sanfang(EZ,'newR'),qRep_Ypos(EZ,y),qRep_Sanfang(EZ,'newR'),qRep_Ypos(EZ,y+3.5),StrToInt(PMode_Var(600)));
	
	qSetRepFontSize(EZ,iFontgroesse-2);
	qRep_Text3(EZ,qRep_SAnfang(EZ,'newL')+3,qRep_YPos(Ez,y+2.6),'Unterschrift Service-Engineer');  		
	qRep_Text3(EZ,qRep_SAnfang(EZ,'newM2')+3,qRep_YPos(Ez,y+2.6),'Datum, Unterschrift Kunde');  		
	qSetRepFontSize(EZ,iFontgroesse);
    
    myFreeandNil(oValues);
end;
...

Reparaturauftrag Beispiel 2

PDF Repa.png

procedure Kopf();
var cBuffer  : String;
    cLK      : String;
    cOrt     : String;
    cPLZ     : String;
    cVorname : String;
    cName    : String;
    oValues  : TFormFieldValue;

    procedure _printText(nVon, nBis: Integer; cName: String);
    begin
        oValues.Reset(Rect(nVon, qRep_Ypos(EZ, y), nBis - 10, qRep_Ypos(EZ, y+1)));
        qRep_PDFFormFieldEdit(EZ, cName, oValues);
        
        y := y + 1;
        qx_PrintLine(EZ, nVon, qRep_Ypos(EZ, y), nBis - 10, qRep_Ypos(EZ, y), 5);
        
        y := y - 1;
    end;

begin

  with EZ do begin

    oValues := TFormFieldValue.Create();

    cBuffer := '';
    qSetRepFontSize(EZ,iFontgroesse+4);

    qSetRepStyle(EZ,[fsBold]);
    qSetRepStyle(EZ,[]);

    qSetRepFontSize(EZ,iFontgroesse);
    
    y := 1;

    qSetRepStyle(EZ,[fsBold]);
    qRep_Stext(EZ,'pk1','Reparaturauftragsnr.: '+A_Query.A2C('a_nr'),qRep_Ypos(EZ,y));
    qRep_Stext(EZ,'pk4','Maschine / Fabrikat / Modell',qRep_Ypos(EZ,y));
    qSetRepStyle(EZ,[]);

    y := y + 1;

    cVorname := A_Query.A2C('a_vorname');
    cName    := A_Query.A2C('a_name');

    if (not(empty(cVorname))) then begin
      cBuffer := cVorname + ' ';
    end;

    if (not(empty(cName))) then begin
      cBuffer := cBuffer + cName;
    end;

    cBuffer := cBuffer + ' ('+A_Query.A2C('a_knr')+')';
    qSetRepStyle(EZ,[fsBold]);
    qRep_Stext(EZ,'pk1',cBuffer,qRep_Ypos(EZ,y));
    qSetRepStyle(EZ,[]);
    cBuffer := '';

    qRep_Stext(EZ,'pk4',A_Query.A2C('a_geraet')+' '+A_Query.A2C('a_modell'),qRep_Ypos(EZ,y));

    y := y + 1;

    if (not(empty(A_Query.A2C('a_zusatz1')))) then begin
      cBuffer := cBuffer + A_Query.A2C('a_zusatz1');
    end;
    qRep_Stext(EZ,'pk1',cBuffer,qRep_Ypos(EZ,y));
    qRep_Stext(EZ,'pk4','Seriennummer : '+A_Query.A2C('a_sernr'),qRep_Ypos(EZ,y));

    y := y + 1;
      
    qRep_Stext(EZ,'pk4','Auftragsdatum : '+A_Query.A2C('a_datum'),qRep_Ypos(EZ,y));
	
    if (not(empty(A_Query.A2C('a_zusatz2')))) then begin
      cBuffer := cBuffer + A_Query.A2C('a_zusatz2');
      qRep_Stext(EZ,'pk1',cBuffer,qRep_Ypos(EZ,y));
    end;

    y := y + 1;

    qRep_Stext(EZ,'pk1',A_Query.A2C('a_strasse'),qRep_Ypos(EZ,y));

    y := y + 1;

    cBuffer := '';
    cLK  := A_Query.A2C('a_LK');
    cPLZ := A_Query.A2C('a_PLZ');
    cOrt := A_Query.A2C('a_Ort');

    if (not(empty(cLK))) then begin
      cBuffer := cLK + ' ';
    end;

    if (not(empty(cPLZ))) then begin
      cBuffer := cBuffer + cPLZ + ' ';
    end;

    if (not(empty(cOrt))) then begin
      cBuffer := cBuffer + cOrt;
    end;

    qRep_Stext(EZ,'pk1',cBuffer,qRep_Ypos(EZ,y));
    cBuffer := '';

    qRep_Stext(EZ,'pk4','Fehlerangabe : '+A_Query.A2C('a_stoer1'),qRep_Ypos(EZ,y));

    y := y + 1;

    qRep_Stext(EZ,'pk1','Abteilung : '+A_Query.A2C('a_standort'),qRep_Ypos(EZ,y));
    qRep_Stext(EZ,'pk4','          '  +A_Query.A2C('a_stoer2'),qRep_Ypos(EZ,y));
    y := y + 1;
    qRep_Stext(EZ,'pk1','Telefon : '+A_Query.A2C('a_tel1'),qRep_Ypos(EZ,y));
    qRep_Stext(EZ,'pk4','          '+A_Query.A2C('a_stoer3'),qRep_Ypos(EZ,y));
    y := y + 1;
    qRep_Stext(EZ,'pk1','Termin : '     +A_Query.A2C('a_terminstr'),qRep_Ypos(EZ,y));
    qRep_Stext(EZ,'pk4','Ersatzgerät : '+A_Query.A2C('a_leih'),qRep_Ypos(EZ,y));
    y := y + 1;
    qRep_Stext(EZ,'pk1','Ansprechpartner : '+A_Query.A2C('a_anspr'),qRep_Ypos(EZ,y));
    y := y + 1;

    oValues.Reset();
    oValues.AddRadioItem(EZ, Rect(qRep_SAnfang(EZ,'pk4')+50, qRep_Ypos(EZ,y)+1, qRep_SAnfang(EZ,'pk4') + 12 + 50, qRep_Ypos(EZ,y+1)-2));
    oValues.AddRadioItem(EZ, Rect(qRep_SAnfang(EZ,'pk4')+83, qRep_Ypos(EZ,y)+1, qRep_SAnfang(EZ,'pk4') + 12 + 83, qRep_Ypos(EZ,y+1)-2));
    oValues.lAtleastOneSelectedItem := False;
    if (A_Query.A2C('a_mgar') <> '1') then begin
      oValues.nSelectedItemIndex := -1;
    end else begin
      oValues.nSelectedItemIndex := 0;
    end;
    qRep_PDFFormFieldRadioButton(EZ, 'Garantie', oValues);   
    qRep_Stext(EZ,'pk4','Garantie      Ja       Nein',qRep_Ypos(EZ,y));

    oValues.Reset();
    oValues.AddRadioItem(EZ, Rect(qRep_SAnfang(EZ,'pk1')+110, qRep_Ypos(EZ,y)+1, qRep_SAnfang(EZ,'pk1') + 12 + 110, qRep_Ypos(EZ,y+1)-2));
    oValues.AddRadioItem(EZ, Rect(qRep_SAnfang(EZ,'pk1')+143, qRep_Ypos(EZ,y)+1, qRep_SAnfang(EZ,'pk1') + 12 + 143, qRep_Ypos(EZ,y+1)-2));
    oValues.lAtleastOneSelectedItem := False;
    if (A_Query.A2C('a_mkv') <> '1') then begin
      oValues.nSelectedItemIndex := -1;
    end else begin
      oValues.nSelectedItemIndex := 0;
    end;
    qRep_PDFFormFieldRadioButton(EZ, 'Kostenvoranschlag', oValues);   
    
    y := y - 0.1;
    _printText(qRep_SAnfang(EZ, 'pk1') + 190, qRep_SAnfang(EZ, 'pk1') + 280, 'KostenvoranschlagBetr');

    y := y + 0.1;
    qRep_Stext(EZ,'pk1','Kostenvoranschlag      Ja       Nein                               €',qRep_Ypos(EZ,y));

    oValues.Reset();
    oValues.AddRadioItem(EZ, Rect(qRep_SAnfang(EZ,'pk5')+90, qRep_Ypos(EZ,y)+1, qRep_SAnfang(EZ,'pk5') + 12 + 90, qRep_Ypos(EZ,y+1)-2));
    oValues.AddRadioItem(EZ, Rect(qRep_SAnfang(EZ,'pk5')+123, qRep_Ypos(EZ,y)+1, qRep_SAnfang(EZ,'pk5') + 12 + 123, qRep_Ypos(EZ,y+1)-2));
    oValues.lAtleastOneSelectedItem := False;
    if (A_Query.A2C('a_mwart') <> '1') then begin
      oValues.nSelectedItemIndex := -1;
    end else begin
      oValues.nSelectedItemIndex := 0;
    end;
    qRep_PDFFormFieldRadioButton(EZ, 'ServiceVertrag', oValues);   
    qRep_Stext(EZ,'pk5','Service-Vertrag        Ja       Nein',qRep_Ypos(EZ,y));

    y := y + 1;

    oValues.Reset(Rect(qRep_SAnfang(EZ,'pk4'), qRep_Ypos(EZ,y), qRep_SAnfang(EZ,'pk4') + 12, qRep_Ypos(EZ,y+1) -2));
    qRep_PDFFormFieldCheckBox(EZ, cName, oValues);
    qRep_Stext(EZ,'pk4','     Kulanz',qRep_Ypos(EZ,y));

    qSetRepStyle(EZ,[fsBold]);
    qRep_Stext(EZ,'pk5','Service-Nr. : '+A_Query.A2C('a_gnr'),qRep_Ypos(EZ,y));
    qSetRepStyle(EZ,[]);
    y := y + 1;

    oValues.Reset();
    oValues.AddRadioItem(EZ, Rect(qRep_SAnfang(EZ,'pk4'), qRep_Ypos(EZ,y)+1, qRep_SAnfang(EZ,'pk4') + 12, qRep_Ypos(EZ,y+1)-2));
    oValues.AddRadioItem(EZ, Rect(qRep_SAnfang(EZ,'pk4') + 58, qRep_Ypos(EZ,y)+1, qRep_SAnfang(EZ,'pk4') + 12 + 58, qRep_Ypos(EZ,y+1)-2));
    oValues.lAtleastOneSelectedItem := False;
    qRep_PDFFormFieldRadioButton(EZ, 'ET', oValues);   

    qRep_Stext(EZ,'pk4','     nur ET       ohne ET',qRep_Ypos(EZ,y));

    y := y +1;
    qRep_Stext(EZ,'pk1','Modell:',qRep_Ypos(EZ,y));
    qRep_Stext(EZ,'pk2','Seriennummer:',qRep_Ypos(EZ,y));
    qRep_Stext(EZ,'pk4','Zählerstand bk:',qRep_Ypos(EZ,y));
    qRep_Stext(EZ,'pk5','Zählerstand color:',qRep_Ypos(EZ,y));
	  
    y := y + 2;

    _printText(qRep_SAnfang(EZ, 'pk1'), qRep_SAnfang(EZ, 'pk2'), 'Modell');
    _printText(qRep_SAnfang(EZ, 'pk2'), qRep_SAnfang(EZ, 'pk4'), 'Seriennummer');
    _printText(qRep_SAnfang(EZ, 'pk4'), qRep_SAnfang(EZ, 'pk5'), 'ZaehlerBK');
    _printText(qRep_SAnfang(EZ, 'pk5'), iRechterRand, 'ZaehlerColor');
    
    y := y + 2;
	
// Rep-Text

    qRep_Stext(EZ,'pk1','Rep.Text',qRep_Ypos(EZ,y));
    y := y + 1;

    //MultiLine
    oValues.Reset(Rect(qRep_SAnfang(EZ, 'pk1'), qRep_Ypos(EZ, y), iRechterRand, qRep_Ypos(EZ, y+6)));
    oValues.cValue := '';
    oValues.lIsMultiline := True;
    qRep_PDFFormFieldEdit(EZ, 'RepText', oValues);

    y := y + 6;
    MyFreeAndNil(oValues);
  end;
end;

Dokument (Antrag)

PDF Antrag.png

procedure Positionen();
var yStart      : Double;
    yStart2     : Double;
    oValues     : TFormFieldValue;
    nCheckOffset: Integer;
    nCheckboxGap: Integer;
    cTmp        : String;

    procedure _printCheckbox(cName: String);
    begin
        oValues.Reset(Rect(qRep_SAnfang(EZ,'s2') + nCheckboxGap + nCheckOffset, qRep_Ypos(EZ,y) + nCheckOffset, qRep_SAnfang(EZ,'s2') + 12 + nCheckboxGap + nCheckOffset, qRep_Ypos(EZ,y+1) -2 + nCheckOffset));
        oValues.oFont.Size := 10;
        qRep_PDFFormFieldCheckBox(EZ, cName, oValues);
    end;

begin

    yStart := y;
    qSetRepFontSize(EZ,iFontgroesse);
    y := y + 0.5;

    // Name
    qSetRepStyle(EZ, [fsBold]);
    qRep_Stext(EZ, 's2', '1', qRep_Ypos(EZ, y));
    qSetRepStyle(EZ,[]);
    qRep_Stext(EZ, 's2', '  Name (as shown on your income tax return). Name is requered on this line; do not leave this blank.', qRep_Ypos(EZ, y));
    
    y := y + 0.6;
    qSetRepStyle(EZ, [fsBold]);
    oValues := TFormFieldValue.Create(Rect(qRep_SAnfang(EZ,'s2'), qRep_Ypos(EZ,y), qRep_SAnfang(EZ,'s3') - 5, qRep_Ypos(EZ,y+1)));
    oValues.cValue     := 'John Doe';
    oValues.oFont.Size := iFontgroesse + 2;
    oValues.lIsBorder  := False;
    qRep_PDFFormFieldEdit(EZ, 'Name', oValues);
    qSetRepStyle(EZ, []);

    y := y - 1;

    //Sec Number
    qSetRepStyle(EZ, [fsBold]);
    qRep_Stext(EZ, 's3', 'Social security number', qRep_Ypos(EZ, y)); 
    qSetRepStyle(EZ, []);
    
    y := y + 0.6;
    oValues.Reset(Rect(qRep_SAnfang(EZ,'s3'), qRep_Ypos(EZ,y), qRep_SAnfang(EZ,'s3')+12, qRep_Ypos(EZ,y+1)));
    oValues.lIsBorder  := True;
    oValues.nMaxLength := 1;
    qRep_PDFFormFieldNumEdit(EZ, 'Sec1', oValues);

    oValues.Reset(Rect(qRep_SAnfang(EZ,'s3') + 12, qRep_Ypos(EZ,y), qRep_SAnfang(EZ,'s3')+24, qRep_Ypos(EZ,y+1))); 
    oValues.lIsBorder  := True;
    oValues.nMaxLength := 1;
    qRep_PDFFormFieldNumEdit(EZ, 'Sec2', oValues);

    oValues.Reset(Rect(qRep_SAnfang(EZ,'s3')+24, qRep_Ypos(EZ,y), qRep_SAnfang(EZ,'s3')+36, qRep_Ypos(EZ,y+1)));
    oValues.lIsBorder  := True;
    oValues.nMaxLength := 1;
    qRep_PDFFormFieldNumEdit(EZ, 'Sec3', oValues);

    qSetRepStyle(EZ, [fsBold]);
    qRep_Text(EZ, qRep_SAnfang(EZ,'s3') + 38, qRep_Ypos(EZ,y + 0.3), '-');
    qSetRepStyle(EZ, []);

    oValues.Reset(Rect(qRep_SAnfang(EZ,'s3')+42, qRep_Ypos(EZ,y), qRep_SAnfang(EZ,'s3')+54, qRep_Ypos(EZ,y+1)));
    oValues.lIsBorder  := True;
    oValues.nMaxLength := 1;
    qRep_PDFFormFieldNumEdit(EZ, 'Sec4', oValues);

    oValues.Reset(Rect(qRep_SAnfang(EZ,'s3')+54, qRep_Ypos(EZ,y), qRep_SAnfang(EZ,'s3')+66, qRep_Ypos(EZ,y+1)));
    oValues.lIsBorder  := True;
    oValues.nMaxLength := 1;
    qRep_PDFFormFieldNumEdit(EZ, 'Sec5', oValues);

    qSetRepStyle(EZ, [fsBold]);
    qRep_Text(EZ, qRep_SAnfang(EZ,'s3') + 68, qRep_Ypos(EZ,y + 0.3), '-');
    qSetRepStyle(EZ, []);

    oValues.Reset(Rect(qRep_SAnfang(EZ,'s3')+72, qRep_Ypos(EZ,y), qRep_SAnfang(EZ,'s3')+84, qRep_Ypos(EZ,y+1)));
    oValues.lIsBorder  := True;
    oValues.nMaxLength := 1;
    qRep_PDFFormFieldNumEdit(EZ, 'Sec6', oValues);

    oValues.Reset(Rect(qRep_SAnfang(EZ,'s3')+84, qRep_Ypos(EZ,y), qRep_SAnfang(EZ,'s3')+96, qRep_Ypos(EZ,y+1)));
    oValues.lIsBorder  := True;
    oValues.nMaxLength := 1;
    qRep_PDFFormFieldNumEdit(EZ, 'Sec7', oValues);

    oValues.Reset(Rect(qRep_SAnfang(EZ,'s3')+96, qRep_Ypos(EZ,y), qRep_SAnfang(EZ,'s3')+108, qRep_Ypos(EZ,y+1)));
    oValues.lIsBorder  := True;
    oValues.nMaxLength := 1;
    qRep_PDFFormFieldNumEdit(EZ, 'Sec8', oValues);

    oValues.Reset(Rect(qRep_SAnfang(EZ,'s3')+108, qRep_Ypos(EZ,y), qRep_SAnfang(EZ,'s3')+120, qRep_Ypos(EZ,y+1)));
    oValues.lIsBorder  := True;
    oValues.nMaxLength := 1;
    qRep_PDFFormFieldNumEdit(EZ, 'Sec9', oValues);
    
    y := y + 1.4;   
    qx_PrintLine(EZ, qRep_SAnfang(EZ,'s2') - 2, qRep_Ypos(EZ, y), iRechterRand, qRep_Ypos(EZ, y), 5);

    // Business Name
    qSetRepStyle(EZ, [fsBold]);
    qRep_Stext(EZ, 's2', '2', qRep_Ypos(EZ, y));
    qSetRepStyle(EZ,[]);
    qRep_Stext(EZ, 's2', '  Business name/disregarded entity name, if different from above', qRep_Ypos(EZ, y));
    
    y := y + 0.6;

    qSetRepStyle(EZ, [fsBold]);
    oValues.Reset(Rect(qRep_SAnfang(EZ,'s2'), qRep_Ypos(EZ,y), iRechterRand, qRep_Ypos(EZ,y+1)));
    oValues.cValue     := 'Ernst Bergau GmbH';
    oValues.oFont.Size := iFontgroesse + 2;
    oValues.lIsBorder  := False;
    qRep_PDFFormFieldEdit(EZ, 'Business', oValues);
    qSetRepStyle(EZ, []);
    
    y := y + 1;   
    qx_PrintLine(EZ, qRep_SAnfang(EZ,'s2') - 2, qRep_Ypos(EZ, y), iRechterRand, qRep_Ypos(EZ, y), 5);
    
    yStart2 := y;
    
    // checkboxes Text
    qSetRepStyle(EZ, [fsBold]);
    qRep_Stext(EZ, 's2', '3', qRep_Ypos(EZ, y));
    qSetRepStyle(EZ,[]);
    qRep_Stext(EZ, 's2', '  Check appropriate box for federal tax classification; check only one of the seven boxes:', qRep_Ypos(EZ, y));
    
    y := y + 0.8;

    // checkboxes
    nCheckOffset := 3;
    nCheckboxGap := 0;
    _printCheckbox('CheckBox1');
    qRep_Text(EZ, qRep_SAnfang(EZ,'s2') + 20, qRep_Ypos(EZ,y + 0.3), 'Individual/sole proprietor or');
    qRep_Text(EZ, qRep_SAnfang(EZ,'s2') + 20, qRep_Ypos(EZ,y + 0.9), 'single-member LLC');
    
    //----
    nCheckboxGap := 150;
    _printCheckbox('CheckBox2');
    qRep_Text(EZ, qRep_SAnfang(EZ,'s2') + 20 + nCheckboxGap, qRep_Ypos(EZ,y + 0.3), 'C Corporation');
    
    //----
    nCheckboxGap := 250;
    _printCheckbox('CheckBox3');
    qRep_Text(EZ, qRep_SAnfang(EZ,'s2') + 20 + nCheckboxGap, qRep_Ypos(EZ,y + 0.3), 'S Corporation');

    //----
    nCheckboxGap := 350;
    _printCheckbox('CheckBox4');
    qRep_Text(EZ, qRep_SAnfang(EZ,'s2') + 20 + nCheckboxGap, qRep_Ypos(EZ,y + 0.3), 'Partnership');

    //----
    nCheckboxGap := 450;
    _printCheckbox('CheckBox5');
    qRep_Text(EZ, qRep_SAnfang(EZ,'s2') + 20 + nCheckboxGap, qRep_Ypos(EZ,y + 0.3), 'Trust/estate');

    y := y + 2;

    //----
    nCheckboxGap := 0;
    _printCheckbox('CheckBox6');
    qRep_Text(EZ, qRep_SAnfang(EZ,'s2') + 20 + nCheckboxGap, qRep_Ypos(EZ,y + 0.3), 'Limeted liability company. Enter the Tax classification (C=C corporation, S=S corporation. P=partnership)');

    y := y + 0.1;
    cTmp := qSetRepFont(EZ, 'Webdings');
    qRep_Text(EZ, qRep_SAnfang(EZ,'s2') + 460 + nCheckboxGap, qRep_Ypos(EZ,y + 0.3), '4');
    QSetRepFont(EZ, cTmp);

    oValues.Reset(Rect(qRep_SAnfang(EZ,'s2') + 470, qRep_Ypos(EZ,y), qRep_SAnfang(EZ,'s4') - 10, qRep_Ypos(EZ,y+1)));
    oValues.oFont.Size := iFontgroesse + 2;
    oValues.lIsBorder  := False;
    qRep_PDFFormFieldEdit(EZ, 'Limited1', oValues);

    y := y + 1;   
    qx_PrintLine(EZ, qRep_SAnfang(EZ,'s2') + 470, qRep_Ypos(EZ, y), qRep_SAnfang(EZ,'s4') - 10, qRep_Ypos(EZ, y), 5);

    //----
    y := y + 0.5;    
    qSetRepStyle(EZ, [fsBold]);   
    qRep_Text(EZ, qRep_SAnfang(EZ,'s2') + 20, qRep_Ypos(EZ,y), 'Note.');
    qSetRepStyle(EZ, []);
    qRep_Text(EZ, qRep_SAnfang(EZ,'s2') + 20, qRep_Ypos(EZ,y), '         For a single-member LLC that is disregarded, do not check LLC; check the appropriate boy in the line above for');
    y := y + 0.6;     
    qRep_Text(EZ, qRep_SAnfang(EZ,'s2') + 20, qRep_Ypos(EZ,y), 'the tax classification of the single-member owner.');
    
    y := y + 0.9;   
    //----
    _printCheckbox('Other');
    qRep_Text(EZ, qRep_SAnfang(EZ,'s2') + 20 + nCheckboxGap, qRep_Ypos(EZ,y + 0.3), 'Other (see instructions)');
    
    y := y + 0.1;   
    cTmp := qSetRepFont(EZ, 'Webdings');
    qRep_Text(EZ, qRep_SAnfang(EZ,'s2') + 120 + nCheckboxGap, qRep_Ypos(EZ,y + 0.2), '4');
    QSetRepFont(EZ, cTmp);

    oValues.Reset(Rect(qRep_SAnfang(EZ,'s2') + 130, qRep_Ypos(EZ,y), qRep_SAnfang(EZ,'s4') - 10, qRep_Ypos(EZ,y+1)));
    oValues.oFont.Size := iFontgroesse + 2;
    oValues.lIsBorder  := False;
    qRep_PDFFormFieldEdit(EZ, 'Other1', oValues);
    
    y := y + 1;   
    qx_PrintLine(EZ, qRep_SAnfang(EZ, 's2') - 2, qRep_Ypos(EZ, y), iRechterRand, qRep_Ypos(EZ, y), 5);    
    qx_PrintLine(EZ, qRep_SAnfang(EZ, 's4')-3, qRep_Ypos(EZ, yStart2), qRep_SAnfang(EZ, 's4')-3, qRep_Ypos(EZ, y), 5);

    // Exceptions
    qSetRepStyle(EZ, [fsBold]);
    qRep_Stext(EZ, 's4', '4', qRep_Ypos(EZ, yStart2));
    qSetRepStyle(EZ,[]);
    qRep_Stext(EZ, 's4', '  Exeptions (codes apply only to', qRep_Ypos(EZ, yStart2));
    yStart2 := yStart2 + 0.6;
    qRep_Stext(EZ, 's4', 'certain entities, not individuals; see', qRep_Ypos(EZ, yStart2));
    yStart2 := yStart2 + 0.6;
    qRep_Stext(EZ, 's4', 'instructions on page 3):', qRep_Ypos(EZ, yStart2));

    //Payee code
    yStart2 := yStart2 + 0.8;
    qRep_Stext(EZ, 's4', 'Exempt payee code (if any)', qRep_Ypos(EZ, yStart2));
    
    yStart2 := yStart2 - 0.2;
    oValues.Reset(Rect(qRep_SAnfang(EZ,'s4')+120, qRep_Ypos(EZ,yStart2), iRechterRand, qRep_Ypos(EZ,yStart2+1)));
    oValues.oFont.Size := iFontgroesse + 2;
    oValues.lIsBorder  := False;
    qRep_PDFFormFieldEdit(EZ, 'Payee', oValues);
    
    yStart2 := yStart2 + 1;   
    qx_PrintLine(EZ, qRep_SAnfang(EZ,'s4') +120, qRep_Ypos(EZ, yStart2), iRechterRand, qRep_Ypos(EZ, yStart2), 5);

    yStart2 := yStart2 + 0.3;   
    qRep_Stext(EZ, 's4', 'Exemption from FATCA reporting', qRep_Ypos(EZ, yStart2));
    
    yStart2 := yStart2 + 0.9;   
    qRep_Stext(EZ, 's4', 'code (if any)', qRep_Ypos(EZ, yStart2));

    yStart2 := yStart2 - 0.2;
    oValues.Reset(Rect(qRep_SAnfang(EZ,'s4')+70, qRep_Ypos(EZ,yStart2), iRechterRand, qRep_Ypos(EZ,yStart2+1)));
    oValues.oFont.Size := iFontgroesse + 2;
    oValues.lIsBorder  := False;
    qRep_PDFFormFieldEdit(EZ, 'FATCA', oValues);
    
    yStart2 := yStart2 + 1;   
    qx_PrintLine(EZ, qRep_SAnfang(EZ,'s4') +70, qRep_Ypos(EZ, yStart2), iRechterRand, qRep_Ypos(EZ, yStart2), 5);

    yStart2 := yStart2 + 0.5;   
    qSetRepFontSize(EZ,4);
    qRep_Stext(EZ, 's4', '(Applied to accounts managed outside the U.S.)', qRep_Ypos(EZ, yStart2));
    qSetRepFontSize(EZ,iFontgroesse);

    yStart2 := y;  

    // Address
    qSetRepStyle(EZ, [fsBold]);
    qRep_Stext(EZ, 's2', '5', qRep_Ypos(EZ, y));
    qSetRepStyle(EZ,[]);
    qRep_Stext(EZ, 's2', '  Address (number, street, and apt. or suit no)', qRep_Ypos(EZ, y));
    
    y := y + 0.6;

    qSetRepStyle(EZ, [fsBold]);
    oValues.Reset(Rect(qRep_SAnfang(EZ,'s2'), qRep_Ypos(EZ,y), qRep_SAnfang(EZ,'s3') - 1, qRep_Ypos(EZ,y+1)));
    oValues.oFont.Size := iFontgroesse + 2;
    oValues.lIsBorder  := False;
    qRep_PDFFormFieldEdit(EZ, 'Address', oValues);
    qSetRepStyle(EZ, []);
    
    y := y + 1;   
    qx_PrintLine(EZ, qRep_SAnfang(EZ,'s2') - 2, qRep_Ypos(EZ, y), qRep_SAnfang(EZ,'s3'), qRep_Ypos(EZ, y), 5);
    
    // City
    qSetRepStyle(EZ, [fsBold]);
    qRep_Stext(EZ, 's2', '6', qRep_Ypos(EZ, y));
    qSetRepStyle(EZ,[]);
    qRep_Stext(EZ, 's2', '  City, state, and ZIP code', qRep_Ypos(EZ, y));
    
    y := y + 0.6;

    qSetRepStyle(EZ, [fsBold]);
    oValues.Reset(Rect(qRep_SAnfang(EZ,'s2'), qRep_Ypos(EZ,y), qRep_SAnfang(EZ,'s3')-1, qRep_Ypos(EZ,y+1)));
    oValues.oFont.Size := iFontgroesse + 2;
    oValues.lIsBorder  := False;
    qRep_PDFFormFieldEdit(EZ, 'City', oValues);
    qSetRepStyle(EZ, []);
    
    y := y + 1;   
    qx_PrintLine(EZ, qRep_SAnfang(EZ,'s2') - 2, qRep_Ypos(EZ, y), iRechterRand, qRep_Ypos(EZ, y), 5);

    //Requester
    qRep_Stext(EZ, 's3', 'Requester''s name and address (optional)', qRep_Ypos(EZ, yStart2));

    yStart2 := yStart2 + 0.6;
    oValues.Reset(Rect(qRep_SAnfang(EZ,'s3') +1 , qRep_Ypos(EZ,yStart2), iRechterRand, qRep_Ypos(EZ,y)));
    oValues.oFont.Size   := iFontgroesse + 2;
    oValues.lIsBorder    := False;
    oValues.lIsMultiline := True;
    qRep_PDFFormFieldEdit(EZ, 'Requester', oValues);

    qx_PrintLine(EZ, qRep_SAnfang(EZ, 's3'), qRep_Ypos(EZ, yStart2-0.6), qRep_SAnfang(EZ, 's3'), qRep_Ypos(EZ, y), 5);

    // Accountnumber
    qSetRepStyle(EZ, [fsBold]);
    qRep_Stext(EZ, 's2', '7', qRep_Ypos(EZ, y));
    qSetRepStyle(EZ,[]);
    qRep_Stext(EZ, 's2', '  List account number(s) here (optional)', qRep_Ypos(EZ, y));
    
    y := y + 0.6;

    qSetRepStyle(EZ, [fsBold]);
    oValues.Reset(Rect(qRep_SAnfang(EZ,'s2'), qRep_Ypos(EZ,y), iRechterRand, qRep_Ypos(EZ,y+1)));
    oValues.oFont.Size := iFontgroesse + 2;
    oValues.lIsBorder  := False;
    qRep_PDFFormFieldEdit(EZ, 'Accountnumber', oValues);
    qSetRepStyle(EZ, []);
    
    y := y + 1;   
    qx_PrintLine(EZ, iLinkerRand, qRep_Ypos(EZ, y), iRechterRand, qRep_Ypos(EZ, y), 5);    
    qx_PrintLine(EZ, qRep_SAnfang(EZ, 's2')-2, qRep_Ypos(EZ, yStart), qRep_SAnfang(EZ, 's2')-2, qRep_Ypos(EZ, y), 5);

    y := y + 1;   
    
    MyFreeAndNil(oValues);
end;