THotPDF.AddStructureElement וכלי עזר ל-Tagged PDF
דף זה מתעד את כלי העזר הנוכחיים של THotPDF עבור Tagged PDF ועץ מבנה PDF/UA. מזהי הקוד נשמרים כפי שהם מופיעים בהצהרות הציבוריות
ממשק Delphi נוכחי
function AddStructureElement(const Role: AnsiString; Parent: THPDFDictionaryObject;
PageIndex: Integer = -1; MCID: Integer = -1): THPDFDictionaryObject; overload;
function AddStructureElement(const Role: AnsiString; Parent: THPDFDictionaryObject;
PageIndex: Integer; MCID: Integer;
const AltText: AnsiString; const ActualText: AnsiString): THPDFDictionaryObject; overload;
function AddStructureElement(const Role: AnsiString; Parent: THPDFDictionaryObject;
PageIndex: Integer; MCID: Integer;
const AltText: AnsiString; const ActualText: AnsiString;
const IDStr: AnsiString): THPDFDictionaryObject; overload;
function AddStructureElement(T: THPDFStandardStructureType; Parent: THPDFDictionaryObject;
PageIndex: Integer = -1; MCID: Integer = -1): THPDFDictionaryObject; overload;
procedure SetStructureElementLanguage(Elem: THPDFDictionaryObject; const Lang: AnsiString);
procedure SetStructureElementExpansionText(Elem: THPDFDictionaryObject; const ExpansionText: AnsiString);
procedure SetStructureElementTitle(Elem: THPDFDictionaryObject; const Title: AnsiString);
procedure AddStructRoleMap(const SourceRole: AnsiString; const TargetRole: AnsiString);
function BeginTaggedContent(const Role: AnsiString; Parent: THPDFDictionaryObject;
const Lang: AnsiString = ''; const Alt: AnsiString = '';
const ActualText: AnsiString = ''; const ExpansionText: AnsiString = ''): THPDFDictionaryObject;
procedure EndTaggedContent;
function EmitTaggedHeading(Level: Integer; Parent: THPDFDictionaryObject; X, Y: Single; const Text: WideString): THPDFDictionaryObject;
function BeginTaggedList(Parent: THPDFDictionaryObject; const NumberingStyle: AnsiString = 'None'): THPDFDictionaryObject;
function EmitTaggedListItem(ListElem: THPDFDictionaryObject; LblX, LblY: Single; const LabelText: WideString; BodyX, BodyY: Single; const BodyText: WideString): THPDFDictionaryObject;
function BeginTaggedTable(Parent: THPDFDictionaryObject): THPDFDictionaryObject;
function AddTaggedTableRow(TableElem: THPDFDictionaryObject): THPDFDictionaryObject;
function EmitTaggedTableHeader(TRElem: THPDFDictionaryObject; X, Y: Single; const Text: WideString; const Scope: AnsiString): THPDFDictionaryObject;
function EmitTaggedTableCell(TRElem: THPDFDictionaryObject; X, Y: Single; const Text: WideString): THPDFDictionaryObject;
function BeginTaggedFigure(Parent: THPDFDictionaryObject; const AltText: AnsiString; const BBox: array of Single): THPDFDictionaryObject;
procedure EndTaggedFigure;
procedure RegisterAnnotForStructure(AnnotDict: THPDFDictionaryObject; StructElem: THPDFDictionaryObject);
function StandardStructureTypeToName(T: THPDFStandardStructureType): AnsiString;
function IsStandardStructureType(const Name: AnsiString): Boolean;
יצירת רכיבי מבנה
AddStructureElement יוצר מילון /StructElem ומצרף אותו כילד של Parent; העברת nil מצרפת אותו מתחת לשורש עץ המבנה. PageIndex מקשר את הרכיב לעמוד דרך /Pg, וערך שלילי משמיט את הקישור. MCID מאפס ומעלה מקשר רצף marked-content בעמוד לרכיב ורושם אותו ב-/ParentTree של המסמך. העומס עם שישה ארגומנטים מוסיף /Alt לתיאור חלופי ו-/ActualText לטקסט חלופי בעת העתקה. העומס עם שבעה ארגומנטים כותב גם /ID ייחודי במסמך
סוגי מבנה תקניים (Table 333)
עומס THPDFStandardStructureType הוא נקודת כניסה בטוחה מבחינת טיפוסים: שם התפקיד /S מובטח להיות אחד מסוגי המבנה התקניים של ISO 32000-1 §14.8.4 Table 333, וכך מצטמצם הסיכון לשגיאות כתיב או רישיות במחרוזת פתוחה
- קיבוץ:
sstDocument,sstPart,sstArt,sstSect,sstDiv,sstBlockQuote,sstCaption,sstTOC,sstTOCI,sstIndex,sstNonStruct,sstPrivate - רמת בלוק:
sstH,sstH1-sstH6,sstP,sstL,sstLI,sstLbl,sstLBody,sstTable,sstTR,sstTH,sstTD,sstTHead,sstTBody,sstTFoot - רמה משולבת בשורה:
sstSpan,sstQuote,sstNote,sstReference,sstBibEntry,sstCode,sstLink,sstAnnot - Ruby ו-Warichu:
sstRuby,sstRB,sstRT,sstRP,sstWarichu,sstWT,sstWP - איור:
sstFigure,sstFormula,sstForm
שימו לב לאותיות הקטנות ב-sstLbl / sstLBody: שמות התפקיד בפועל ב-PDF הם Lbl ו-LBody. עדיין אפשר להעביר שמות תפקיד מותאמים דרך עומס AnsiString ולמפות אותם חזרה לתפקיד תקני בעזרת AddStructRoleMap
דוגמה
PDF.PDFUACompliance := pdfuaPDFUA1;
PDF.BeginDoc;
Doc := PDF.AddStructureElement(sstDocument, nil);
H1 := PDF.AddStructureElement(sstH1, Doc);
PDF.SetStructureElementLanguage(Doc, 'en-US');
PDF.SetStructureElementTitle(H1, 'Annual Report');
// Alt / ActualText ride on the AnsiString overload; reuse the
// spec-prescribed role name via StandardStructureTypeToName
Fig := PDF.AddStructureElement(StandardStructureTypeToName(sstFigure), Doc, 0, -1,
'Sales by quarter: Q1 4.2M, Q2 5.1M, Q3 5.8M, Q4 6.4M', '');
מאפייני מבנה ומיפוי תפקידים
SetStructureElementLanguage כותב עקיפה של /Lang לפי BCP-47, SetStructureElementExpansionText כותב טקסט הרחבה /E, SetStructureElementTitle כותב כותרת קריאה /T, ו-AddStructRoleMap ממפה תפקידי מבנה מותאמים בחזרה לתפקידי PDF תקניים. StandardStructureTypeToName מחזיר שם תפקיד PDF עבור ערך THPDFStandardStructureType, ו-IsStandardStructureType בודק אם שם תפקיד הוא תקני
כלי עזר ברמה גבוהה לתוכן tagged
EmitTaggedHeading, BeginTaggedList, EmitTaggedListItem, BeginTaggedTable, AddTaggedTableRow, EmitTaggedTableHeader, EmitTaggedTableCell, BeginTaggedFigure, EndTaggedFigure ו-RegisterAnnotForStructure מכסים חיבור רגיל של כותרות, רשימות, טבלאות, איורים והערות עבור PDF/UA בלי לנהל MCID ידנית
תהליך עבודה טיפוסי
הפעילו פלט tagged או PDFUACompliance, צרו את רכיב המבנה הראשי, השתמשו במשפחת כלי העזר כדי להפיק תוכן סמנטי, וסגרו כל רצף tagged-content או איור שהתחיל לפני EndDoc