HotXLS מייצא חוברת עבודה או גיליון עבודה בודד ישירות ל-PDF/A מתוך Delphi ו-C++Builder, ללא Excel וללא מנהל התקן מדפסת PDF. הגדר את UsePDFA ובחר פרופיל ב-TXLSPDFExport, והקובץ המיוצא נושא פרופיל ICC מסוג sRGB מוטבע כ-output intent שלו, בלוק הזיהוי pdfaid במטא-נתוני ה-XMP שלו, וכותרת גרסת PDF מתאימה לרמת התאימות
הדרישה בדרך כלל מגיעה ממדיניות שימור רשומות ולא ממפתח. דוחות כספיים, תוצאות מעבדה, הגשות רגולטוריות וכל דבר שגוף ציבורי חייב לשמור במשך עשורים חייבים להיות מאוחסנים בפורמט שמרונדר זהה בעוד חמישים שנה, וזה מה ש-PDF/A, תקן ISO 19005, נועד להבטיח. גיליון אלקטרוני הוא חישוב חי; עותק מאורכב של גיליון אלקטרוני חייב להיות תמונה קבועה שלו
מה הופך PDF ל-PDF ארכיוני?
שלוש דרישות עושות את רוב העבודה. הקובץ חייב להיות עצמאי, כך שכל גופן שהוא משתמש בו מוטבע ואף משאב חיצוני אינו מוזכר בהפניה. הצבע שלו חייב להיות חד-משמעי, מה שאומר output intent שנוקב במרחב הצבע שהקובץ הוכן עבורו. והוא חייב לזהות את עצמו, באמצעות מטא-נתוני XMP שמצהירים על מספר החלק ורמת התאימות
HotXLS מספק את שלושתם. פרופיל ה-sRGB מוטבע כאובייקט זרם עם שלושה רכיבים ו-DeviceRGB כחלופה שלו, מוזכר בהפניה מ-output intent מסוג GTS_PDFA1 שהתנאי והמזהה שלו שניהם נוקבים ב-sRGB IEC61966-2.1. חבילת ה-XMP נושאת את רשומות החלק והתאימות של pdfaid. בייטי הפרופיל מקומפלים לתוך הספרייה ולא נטענים בזמן ריצה, כך שאין שלב פריסה ואין סיכוי שקובץ חסר יהפוך ייצוא ארכיוני לייצוא רגיל
uses
lxHandleX, lxPDF;
var
Book: TXLSXWorkbook;
Exporter: TXLSPDFExport;
begin
Book := TXLSXWorkbook.Create;
Exporter := TXLSPDFExport.Create;
try
if Book.Open('quarterly-results.xlsx') <> 1 then
Exit;
Exporter.UsePDFA := True;
Exporter.PDFAProfile := xlsPdfA2b; // ISO 19005-2 level B
Exporter.DocumentLanguage := 'en-GB';
Exporter.TagMode := xlsPdfTagsAutomatic;
if Exporter.SaveAsPDF(Book, 'quarterly-results-archive.pdf') <> 1 then
raise Exception.Create('archival export failed');
finally
Exporter.Free;
Book.Free;
end;
end;
באיזה פרופיל כדאי לבחור?
הספירה של הפרופילים מכסה PDF/A-1, PDF/A-2 ו-PDF/A-3, כל אחד בגרסת נגישות ובגרסה בסיסית. ההבדלים המעשיים צרים יותר ממה שהרשימה מרמזת
רמה B, הגרסה הבסיסית, מבטיחה שהמראה החזותי ניתן לשחזור. רמה A מוסיפה דרישות מבניות וסמנטיות, בעיקר עץ מבנה מתויג וסדר קריאה מוגדר, כך שהמסמך נגיש לטכנולוגיה מסייעת. חלק 2 מקל על חלק מהמגבלות של חלק 1 ומתיר זרמי אובייקטים ו-JPEG 2000; חלק 3 מתיר בנוסף קבצים מוטבעים שרירותיים, וזה מה שפורמטים של חשבוניות אלקטרוניות משתמשים בו כדי לשאת XML קריא-מכונה לצד העמוד הקריא-אדם
עבור גיליון אלקטרוני מאורכב, PDF/A-2b היא ברירת המחדל הפרגמטית: היא מקובלת באופן נרחב על ארכיונים, היא לא דורשת את משמעת התיוג שרמה A כופה על רשת של תאים, והיא מתירה את המבנים הקומפקטיים ששומרים על ייצוא חוברת עבודה בת 200 עמודים מלנפוח. בחר בחלק 3 כאשר הארכיון חייב לשאת גם את נתוני המקור כקובץ מצורף, מה שהמייצא תומך בו דרך AddAttachment
כלל הגופן שתופס את רוב האנשים
כל גליף שקובץ PDF/A מצייר חייב להגיע מגופן מוטבע. זו הסיבה הנפוצה ביותר לכך שייצוא שאחרת נכון נכשל באימות, ומצב הכשל עדין: הקובץ נראה נכון על המחשב שיצר אותו, מכיוון שלמחשב הזה הגופן מותקן
HotXLS מטביע תת-קבוצות TrueType עבור הגופנים שהוא משתמש בהם, אך נתיב הנפילה ל-base-14 קיים עבור מקרים שבהם לא ניתן לפתור גופן, ונפילה ל-base-14 אינה מוטבעת מעצם הגדרתה. עבור פלט ארכיוני, הגדר קובץ גופן Unicode מפורש כך שנתיב הנפילה לעולם לא נלקח. המכניקה של יצירת תת-קבוצות ושרשרת הנפילה מתוארת ביצירת תת-קבוצות גופני TrueType; הכלל המעשי הוא לבדוק את הייצוא על מחשב שאין בו הגופנים הארגוניים שלך מותקנים
מה המייצא מבטיח, ומה לא
דיוק כאן חשוב יותר מלהישמע בטוח. הייצוא מפיק את מנגנון הזיהוי של PDF/A — output intent, פרופיל ICC מוטבע, מטא-נתוני pdfaid, כותרת גרסה מתאימה — והוא מנתב טקסט דרך נתיב ההטבעה. הוא לא מריץ כלי אימות מלא על הפלט שלו עצמו, כך שהוא לא אוכף כל איסור במפרט, כמו הכללים על שקיפות, על סוגי הערות מסוימים ועל תוכן אופציונלי
עבור ייצוא גיליון אלקטרוני המבנים האלה נדירים להופיע, ולכן שיעור ההצלחה המעשי גבוה. אבל גבוה אינו זהה למובטח, ועבור צנרת ארכיונית אמיתית הארכיטקטורה הנכונה היא לייצא ואז לאמת עם כלי עצמאי, תוך התייחסות לכשל אימות כשגיאת צנרת ולא כאזהרה. חלוקת אחריות דומה עבור מסמכי PDF מתוארת באימות preflight ל-PDF/A
הפריסה היא חלק מהנאמנות הארכיונית
גיליון אלקטרוני מאורכב שתואם טכנית ובלתי קריא ויזואלית נכשל במשימה האמיתית שלו. הגדרת עמוד נושאת משקל רב יותר בייצוא ארכיוני מאשר בהדפסה יומיומית, מכיוון שאף אחד לא יוכל לארגן אותו מחדש (reflow) בהמשך
שלוש הגדרות משתלמות. התאמה לרוחב מונעת את הכשל הקלאסי שבו טבלה ברוחב 14 עמודות מגיעה כשבעה עמודים של שתי עמודות כל אחד. שורות כותרת חוזרות שומרות על כל עמוד קריא בבידוד. ואזורי הדפסה מפורשים מוציאים את הערות העבודה שנמצאות מימין לנתונים האמיתיים. הקבוצה המלאה של בקרות הדפסה והגדרת עמוד מכוסה בהגנה, הגדרת עמוד והדפסה
// Archive-ready page setup, applied before the export
Sheet := Book.Sheets[0];
Sheet.PageLandscape := True;
Sheet.FitToWidth := 1;
Sheet.FitToHeight := 0; // as many pages tall as needed
Sheet.SetPrintArea('A1:N480');
Sheet.PrintTitleRows := '$1:$3';
// Metadata belongs in the archive too
Book.Title := 'Quarterly results 2026 Q2';
Book.Author := 'Finance';
רשימת בדיקה לפני שהאצווה הראשונה רצה
אשר שהקובץ מזהה את עצמו: אל תפרוק כלום, פשוט פתח את ה-PDF בעורך טקסט וחפש את רשומות החלק והתאימות של pdfaid ואת ה-output intent מסוג GTS_PDFA1. אשר את הגופנים: בדוק שכל גופן במסמך מדווח כמוטבע. אשר את המראה: השווה את העמודים המיוצאים מול עותק מודפס, מכיוון שהגדרת התאמה-לעמוד שמכווצת טקסט בשקט לארבע נקודות תואמת וחסרת תועלת
לאחר מכן הרץ כלי אימות עצמאי על מדגם ייצוגי ושמור את הדוח. ארכיונים מבקשים יותר ויותר את ראיית האימות, לא רק את הקובץ, וייצור שלה בזמן הייצוא זול הרבה יותר משחזורה שנים לאחר מכן. עבור נתיב הייצוא היומיומי, הלא-ארכיוני, ואפשרויות הרינדור שלו, ראה ייצוא גיליון עבודה ל-PDF
ייצוא ארכיוני, הגדרת עמוד ומנוע הרינדור שמאחוריהם מגיעים בספרייה אחת עבור Delphi ו-C++Builder; רשימת התכונות המלאה נמצאת בעמוד רכיב הגיליון האלקטרוני HotXLS ל-Delphi