När HotXLS exporterar ett kalkylblad till PDF med automatisk taggning aktiverad avger kalkylbladsbilder som bär alternativ text nu som oberoende /Figure-strukturelement med en Unicode-/Alt-post, täta sidlokala marked-content-identifierare och exakta föräldraträdesposter. Bilder utan alternativ text förblir dekorativa artefakter, och diagram förblir artefakter också. Den precisa omfattningen spelar roll: den gör informativa bilder nåbara för en skärmläsare, och det är inte samma sak som full PDF/UA-överensstämmelse
Mekanikerna bakom den är mer intressanta än funktionsbeskrivningen, eftersom två av dem är den sort detalj som tyst producerar en strukturellt giltig PDF vars struktur pekar på fel innehåll
Vad räknas som en informativ bild?
Endast en icke-tom AltText. Egenskapen TXLSXImage.AltText bevarar bildens OOXML-attribut descr ur de icke-visuella egenskaperna orört genom rundturer, vilket är där Excel lagrar texten en användare skriver in i alt-text-panelen. Det är den enda signalen i filen att upphovspersonen ansåg att bilden bär information snarare än dekoration, så det är den enda signalen exportören litar på
Två nära-träffar accepteras med flit inte. Titelfältet, lagrat åtskilt från beskrivningen, är ingen ersättning: en titel är ett namn för objektet, inte en textuell motsvarighet till det, och att befordra den till /Alt skulle ge ett dokument som passerar en automatisk kontroll medan det annonserar ”Bild 3” till en skärmläsare. En tom beskrivning är också inte ett gap att fylla med en platshållare; den betyder att bilden förblir en artefakt, vilket är det rätta utfallet för en logotyp eller en avdelarlinje. Diagram förblir också artefakter för tillfället, eftersom ett diagrams textuella motsvarighet är dess data och att syntetisera en ur serien skulle vara uppfinning i stället för extraktion
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];
// Granska innan export: en bild utan beskrivning
// kommer exporteras som en dekorativ artefakt
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;
Varför behöver sidan en enda MCID-allocerare?
För föräldraträdet är en array indexerad efter marked-content-identifierare, och två allocerare producerar två poster som gör anspråk på samma plats. Taggad PDF förbinder innehåll med struktur i båda riktningarna. På innehållssidan är ett stycke av sidans innehållsström insvept i BDC- och EMC-operatorer som bär ett /MCID-nummer som är unikt inom den sidan. På struktursidan bär sidordlistan en /StructParents-nyckel som namnger en rad i dokumentets /ParentTree, och den raden är en array vars element vid index n är strukturelementet som äger MCID n
En kalkylbladssida innehåller tabellceller och, nu, figurer. Om celltaggaren räknar sina identifierare från noll och figurtaggaren också räknar från noll gör den första figuren anspråk på platsen den första cellen redan äger. Ingenting vid den resulterande filen är felformerad nog för att en parser ska avvisa den: strukturträdet är intakt, det markerade innehållet är balanserat och en validator ser ett dokument med ett föräldraträd. Det en skärmläsare får är en tabellcell annonserad som en bild, eller en bild annonserad med texten av en cell. Exportören allokerar därför från en sidnivåräknare delad av båda taggarna, och fryser sidoposten först när sidobjektnumret är känt, eftersom föräldraträdesraden inte kan skrivas innan sidan den hänvisar till har en identitet
Figuren måste svepa in hela den synliga instansen
Den naiva placeringen är att svepa in Do-operatorn som anropar bild-XObject:et, eftersom det är operatorn som ritar bilden. Det räcker inte. En kalkylbladsbild ritas ofta med en skugga bakom sig och en urklippsbana runt sig, och de märkena är en del av det synliga objektet. Lämnade utanför /Figure-omfattningen blir de omärkt innehåll, vilket är exakt det tillstånd en strukturgranskning flaggar
Så den markerade-innehåll-omfattningen öppnas före skuggan och stängs efter bildritningen, täckande urklippet också. Delning bevaras där delning är korrekt: två celler som visar samma bildnyttolast refererar fortfarande ett bild-XObject, eftersom det är en resursnivåoptimering och inte har något med semantik att göra. Det varje synlig instans får är sin egen MCID och sitt eget strukturelement, för två förekomster av samma logotyp på olika ställen är två saker en läsare stöter på. Bildplacering och EMU-geometrin som positionerar dessa objekt tas upp i artikeln om bildgeometri
Läsordning på en kalkylbladssida
Läsordning är ett beslut exportören måste fatta, eftersom ett kalkylblad inte har något författat flöde på det sätt ett dokument gör. Regeln som antagits är stabil och lätt att förklara: för varje sida kommer tabellen först, sedan figurer i ritordning. En läsare hör därför sidans tabulära innehåll och sedan dess bilder, i stället för att ha bilder sammanflätade vid vilken position ritobjekten råkade inta i filen
Den ordningen är per sida i stället för per dokument, vilket spelar roll på en arbetsbok som paginerar in i dussintals sidor: varje sidas strukturgren är självförsörjande, så en läsare som rör sig mellan sidor hoppar inte tillbaka in i en tidigare tabell. Om du behöver kontroll över hur arket paginerar från början beskrivs sidinställningars och utskriftsområdets samspel i artikeln om skydd och sidinställning
Vad detta certifierar, och vad det inte gör
Det certifierar att informativa bilder når hjälpmedelsteknologi med sin upphovspersonlevererade beskrivning, och att innehåll-till-struktur-mappningen är korrekt snarare än blott närvarande. Det gör inte utmatningen PDF/UA-konform, och att beskriva den på det sättet skulle vara ett påstående implementeringen inte kan stödja: diagram är fortfarande artefakter, och ett fullständigt överensstämmelseutlåtande kräver en granskning av varje strukturtyp, varje teckensnitt och dokumentets metadata som helhet
Om ditt krav är en arkiverings- eller överensstämmelseprofil i stället för tillgänglighetsförbättring är det en annan exportkonfiguration och en annan uppsättning kontroller, som beskrivs i artikeln om PDF/A-arkiveringsexport. De två kombineras, men de svarar olika granskare
Ett praktiskt förslag för en rapportpipeline: granska alternativ text vid punkten där arbetsboken genereras, inte vid exporttillfället. Generatorn vet vad varje diagrambild eller inbäddat diagram representerar och kan skriva en riktig beskrivning in i AltText; ett pass vid exporttillfället kan bara tala om att en beskrivning saknas. HotXLS läser och skriver XLS, XLSX, ODS och CSV nativt från Delphi och C++Builder utan något Excel-beroende, och dess exportkonfigurationsalternativ listas på produktsidan för HotXLS Delphi spreadsheet component