THotPDF.AddStructureElement + PDF/UA accessibility attributes

THotPDF tagged-PDF surface (v2.119.36 / v2.119.40 / v2.119.41)

 

AddXFAPacket  AcroForm Support

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 สร้าง dictionary /StructElem แล้วเพิ่มเป็นลูกของ Parent; ส่ง nil เพื่อผูกไว้ใต้รากของต้นไม้โครงสร้าง PageIndex เชื่อมองค์ประกอบกับหน้าผ่าน /Pg และค่าติดลบจะไม่เขียนการเชื่อมนี้ MCID ตั้งแต่ศูนย์ขึ้นไปจะเชื่อมลำดับ marked-content บนหน้ากับองค์ประกอบและลงทะเบียนใน /ParentTree ของเอกสาร overload แบบหกอาร์กิวเมนต์เพิ่ม /Alt และ /ActualText ส่วน overload แบบเจ็ดอาร์กิวเมนต์จะเขียน /ID ที่ไม่ซ้ำกันในเอกสารด้วย

ชนิดโครงสร้างมาตรฐาน (Table 333)

overload THPDFStandardStructureType เป็นจุดเข้าแบบ type-safe: ชื่อ role /S ที่เขียนออกมาจะเป็นชนิดโครงสร้างมาตรฐานตาม ISO 32000-1 §14.8.4 Table 333 เสมอ จึงลดความเสี่ยงจากการสะกดผิดหรือความต่างตัวพิมพ์เล็กใหญ่ใน role แบบสตริงเปิด

โปรดสังเกตตัวพิมพ์เล็กใน sstLbl / sstLBody: ชื่อ role จริงใน PDF คือ Lbl และ LBody role แบบกำหนดเองยังส่งผ่าน overload AnsiString ได้ และ map กลับเป็น role มาตรฐานด้วย 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', '');

แอตทริบิวต์โครงสร้างและการ map role

SetStructureElementLanguage เขียนค่า override /Lang ตาม BCP-47, SetStructureElementExpansionText เขียนข้อความขยาย /E, SetStructureElementTitle เขียนชื่อเรื่องที่อ่านได้ใน /T และ AddStructRoleMap map role โครงสร้างแบบกำหนดเองกลับไปเป็น role PDF มาตรฐาน StandardStructureTypeToName คืนชื่อ role PDF สำหรับค่า THPDFStandardStructureType และ IsStandardStructureType ตรวจว่าชื่อ role เป็นมาตรฐานหรือไม่

ตัวช่วยระดับสูงสำหรับเนื้อหา tagged

EmitTaggedHeading, BeginTaggedList, EmitTaggedListItem, BeginTaggedTable, AddTaggedTableRow, EmitTaggedTableHeader, EmitTaggedTableCell, BeginTaggedFigure, EndTaggedFigure และ RegisterAnnotForStructure ครอบคลุมการเชื่อม PDF/UA ทั่วไปสำหรับหัวข้อ รายการ ตาราง รูปภาพ และ annotation โดยไม่บังคับให้ผู้เรียกจัดการ MCID เอง

เวิร์กโฟลว์ทั่วไป

เปิดใช้ output แบบ tagged หรือ PDFUACompliance, สร้างองค์ประกอบโครงสร้างราก, ใช้ชุดตัวช่วยเพื่อเขียนเนื้อหาเชิงความหมาย และปิดทุกลำดับ tagged-content หรือรูปภาพที่เริ่มไว้ก่อน EndDoc