Když HotXLS exportuje list do PDF se zapnutým automatickým tagováním, obrázky listů nesoucí alternativní text se nyní vypouštějí jako samostatné strukturální prvky /Figure s položkou Unicode /Alt, hustými identifikátory marked content lokálními na stránce a přesnými položkami rodičovského stromu. Obrázky bez alternativního textu zůstávají dekorativními artifacty a grafy zůstávají artifacty také. To přesné vymezení je důležité: činí informativní obrázky dostupnými čtečce obrazovky a není to totéž jako plná shoda s PDF/UA
Mechanika za tím je zajímavější než popis funkce, protože dvě její položky jsou ten druh detailu, který potichu produkuje strukturálně platné PDF, jehož struktura ukazuje na špatný obsah
Co se počítá jako informativní obrázek?
Jen neprázdný AltText. Vlastnost TXLSXImage.AltText přenáší přes zpáteční cestu atribut OOXML descr nevizuálních vlastností obrázku, kde Excel ukládá text, který uživatel napíše do panelu alt textu. To je jediný signál v souboru, že autor považoval obrázek za nositele informace, nikoli dekorace, takže je to jediný signál, kterému exporter věří
Dvě blízké varianty se záměrně nepřijímají. Pole titulu, ukládané odděleně od popisu, není náhradou: titul je jméno pro objekt, nikoli textový ekvivalent objektu, a povýšení do /Alt by produkovalo dokument, který projde automatizovanou kontrolou, zatímco čtečce obrazovky oznámí „Obrázek 3“. Prázdný popis také není mezera k vyplnění zástupným symbolem; znamená, že obrázek zůstává artifactem, což je správný výsledek pro logo nebo oddělovací linku. Grafy zatím také zůstávají artifacty, protože textovým ekvivalentem grafu jsou jeho data a syntéza jednoho ze series by byla vynalézání, nikoli extrakce
uses
lxHandleX, lxPDF;
var
Book: TXLSXWorkbook;
Sheet: TXLSXWorksheet;
Exporter: TXLSPDFExport;
I: Integer;
begin
Book := TXLSXWorkbook.Create;
try
Book.Open('regional-review.xlsx');
Sheet := Book.Sheets.ByPos[0];
// Audit před exportem: obrázek bez popisu
// se vyexportuje jako dekorativní artifact
for I := 0 to Sheet.Images.Count - 1 do
if Sheet.Images[I].AltText = '' then
Sheet.Images[I].AltText := DescribeImage(Sheet.Images[I].Name);
Exporter := TXLSPDFExport.Create;
try
Exporter.TagMode := xlsPdfTagsAutomatic;
Exporter.DocumentLanguage := 'en-US';
Exporter.SaveAsPDF(Sheet, 'regional-review.pdf');
finally
Exporter.Free;
end;
finally
Book.Free;
end;
end;
Proč stránka potřebuje jediný alokátor MCID?
Protože rodičovský strom je pole indexované identifikátorem marked content a dva alokátory produkují dvě položky nárokující stejný slot. Tagované PDF spojuje obsah se strukturou oběma směry. Na straně obsahu je úsek content streamu stránky zabalen do operátorů BDC a EMC nesoucích číslo /MCID unikátní v rámci té stránky. Na straně struktury nese slovník stránky klíč /StructParents pojmenovávající řádek dokumentového /ParentTree a ten řádek je pole, jehož prvek na indexu n je strukturální prvek vlastnící MCID n
Stránka listu obsahuje buňky tabulky a nyní i figury. Počítá-li tagger buněk své identifikátory od nuly a tagger figur také od nuly, první figura si nárokuje slot, který už vlastní první buňka. Nic na výsledném souboru není poškozené natolik, aby parser odmítl: strom struktury je neporušený, marked content je vyvážený a validátor vidí dokument s rodičovským stromem. Co dostane čtečka obrazovky, je buňka tabulky oznamovaná jako obrázek, nebo obrázek oznamovaný s textem buňky. Exportér proto alokuje z jednoho počítadla na úrovni stránky sdíleného oběma taggery a zmrazí záznam stránky teprve, jakmile je známé číslo objektu stránky, protože řádek rodičovského stromu nelze zapsat dříve, než má stránka, na níž odkazuje, identitu
Figure musí zabalit celou viditelnou instanci
Naivní umístění je zabalit operátor Do volající XObject obrázku, protože to je operátor, který kreslí obrázek. To nestačí. Obrázek listu se často kreslí se stínem za ním a ořezovou cestou kolem něj a tyto značky jsou součástí viditelného objektu. Ponechány mimo rozsah /Figure se stanou neoznačeným obsahem, což je přesně ten stav, který audit struktury označí
Rozsah marked content se proto otevírá před stínem a zavírá po vykreslení obrázku, čímž pokrývá i ořez. Sdílení zůstává zachováno tam, kde je sdílení správné: dvě buňky ukazující tentýž obsah obrázku stále odkazují na jeden XObject obrázku, protože to je optimalizace na úrovni prostředků a nesouvisí se sémantikou. Co dostane každá viditelná instance, je vlastní MCID a vlastní strukturální prvek, protože dva výskyty téhož loga na různých místech jsou dvě věci, se kterými se čtenář setká. Umístění obrázků a geometrie EMU, která tyto objekty pozicuje, je předmětem článku o geometrii obrázků
Pořadí čtení na stránce listu
Pořadí čtení je rozhodnutí, které musí exporter učinit, protože tabulka nemá autorský tok tak jako dokument. Přijaté pravidlo je stabilní a snadno vysvětlitelné: na každé stránce přijde nejdřív tabulka, poté figury v pořadí kreslení. Čtenář proto slyší tabulkový obsah stránky a poté její obrázky, namísto proplétání obrázků na kterékoliv pozici, kterou náhodou zabíraly kreslicí objekty v souboru
To pořadí je na stránku, nikoli na dokument, což má význam u sešitu stránkovaného do desítek stránek: větev struktury každé stránky je soběstačná, takže čtenář pohybující se mezi stránkami neskočí zpět do dřívější tabulky. Potřebujete-li mít kontrolu nad tím, jak se list paginuje už vůbec, interakci nastavení stránky a oblasti tisku popisuje článek o ochraně a nastavení stránky
Co to certifikuje a co nikoli
Certifikuje to, že informativní obrázky dorazí k asistivní technologii s popisem dodaným autorem a že mapování obsahu na strukturu je správné, nikoli jen přítomné. Nečiní to výstup shodným s PDF/UA a popisovat to tak by bylo tvrzení, které implementace nedokáže podpořit: grafy jsou stále artifacty a kompletní prohlášení o shodě vyžaduje audit každého typu struktury, každého písma a metadat dokumentu jako celku
Je-li vaším požadavkem archivační či konformní profil namísto zlepšení přístupnosti, je to jiná konfigurace exportu a jiná sada kontrol, popsaná v článku o archivačním exportu PDF/A. Obojí se kombinuje, ale odpovídají různým auditorům
Jeden praktický návrh pro reportovací potrubí: auditujte alternativní text v okamžiku, kdy se sešit generuje, nikoli v okamžiku exportu. Generátor ví, co představuje každý obrázek grafu nebo vložený diagram, a dokáže zapsat skutečný popis do AltText; průchod v okamžiku exportu vám může jen říci, že popis chybí. HotXLS čte a zapisuje XLS, XLSX, ODS a CSV nativně z Delphi a C++Builder bez závislosti na Excelu a jeho volby konfigurace exportu jsou uvedeny na stránce produktu HotXLS Delphi spreadsheet component