הגרסה המקומית הזו מתמקדת ב-Factur-X and ZUGFeRD Hybrid Invoices in Delphi ומשתמשת במאמר האנגלי המעודכן כבסיס טכני לצוותי Delphi, PDF ותוכנות מסמכים
הדף הופך את מאמר הבסיס המעודכן לנקודות בדיקה מעשיות עבור תכנון, יישום ואימות
מה סונכרן מהמאמר האנגלי
מאמר הבסיס באנגלית הורחב בהקשר יישומי, החלטות טכניות ודוגמאות קונקרטיות, ולכן דף זה מיועד לשמש מדריך עבודה ולא תקציר קצר
חלקים חשובים במאמר הבסיס המעודכן:
- השתמשו תחילה בקובצי קלט קטנים שניתן לשחזר
- השאירו ללא שינוי שמות מוצרים, API, קבצים וערכי literal
- שמרו את פלט ה-validator ואת פרטי הגרסאות יחד עם קובץ הדוגמה שנוצר
בחירות מעשיות ביישום
התחילו מסוג הקובץ, הפלט הרצוי ומצב השגיאה שהמשתמש צריך לראות. לאחר מכן קשרו כל קריאת API לתוצאה ניתנת לבדיקה, כדי שאימות, רישום ותמיכה יוכלו לשחזר את תרחיש הלקוח
- השתמשו תחילה בקובצי קלט קטנים שניתן לשחזר
- השאירו ללא שינוי שמות מוצרים, API, קבצים וערכי literal
- שמרו את פלט ה-validator ואת פרטי הגרסאות יחד עם קובץ הדוגמה שנוצר
קוד ונקודות API
דוגמאות הקוד נשמרות ללא שינוי כדי שמפתחים יוכלו להשוות אותן ישירות לפרויקטי Delphi, C++Builder ו-Lazarus/FPC
function BuildInvoiceXMLText(const AProfile: TeInvoiceProfile;
const Data: TInvoiceData): string;
begin
// XMLFamily = 1 means the legacy ZUGFeRD 1.0 :1p0 schema; every
// other profile is the modern UN/CEFACT :100 Cross Industry Invoice.
if AProfile.XMLFamily = 1 then
Result := BuildZUGFeRD1Text(AProfile, Data)
else
Result := BuildCII100Text(AProfile, Data);
end;PDF := TPDFlib.Create;
try
// Mode 5 = PDF/A-3b, 6 = PDF/A-3a, 7 = PDF/A-3u.
if PDF.SetPDFAMode(5) <> 1 then
raise Exception.Create('PDF/A-3 mode could not be enabled');
// Optional: swap the built-in sRGB intent for an explicit ICC profile.
if PDF.LoadOutputIntentProfile(ICCFile, 'DeviceRGB') <> 1 then
{ fall back to the built-in sRGB intent that SetPDFAMode embedded };
finally
// ... continue building the document
end;// 1. PDF/A-3 mode and output intent are already set.
// 2. Draw the visible page (embeds a real TrueType font).
DrawInvoicePage(PDF, AProfile, Data);
// 3. Build the profile-correct XML and attach it as an
// associated file with /AFRelationship = Alternative.
InvoiceXML := BuildInvoiceXML(AProfile, Data); // AnsiString of UTF-8 bytes
FileID := PDF.AddFacturXAssociatedFileFromString(
InvoiceXML,
AProfile.ConformanceLevel, // e.g. 'EN16931'
AProfile.FileName, // 'factur-x.xml'
AProfile.Description,
AProfile.Relationship, // 'Alternative'
AProfile.Version, // '1.0'
AProfile.CountryCode); // '' or 'DE' or 'FR'
if FileID <= 0 then
raise Exception.Create('Invoice XML could not be attached');
PDF.SaveToFile(TargetFile);בדיקה לפני פרסום
בדקו את קובץ הפלט באותם כלים שבהם ישתמש הלקוח או הארכיון. תעדו גרסת רכיב, נתוני בדיקה, גרסת validator ותוצאה נצפית כדי לעקוב במדויק אחר רגרסיה עתידית