Pristupačnost više nije opciona funkcija u modernom razvoju softvera. Prema propisima kao što su ADA (Zakon o Amerikancima sa invaliditetom) i Direktiva EU o pristupačnosti veba, softver koji obrađuje dokumente mora da obezbedi pomoćne tehnologije. Za PDF pregledače, to znači implementaciju robusnog pretvaranja teksta u govor (Text-to-Speech - TTS) i integraciju čitača ekrana.
U ovom članku ćemo pogledati kako izdvojiti semantičke tokove teksta iz PDF-a koristeći PDFium u Delphiju, a zatim proslediti taj tekst u Windows Speech API (SAPI) kako bismo izgradili potpuno pristupačan PDF pregledač.
Izazov izdvajanja PDF teksta
PDF je u osnovi platno sa instrukcijama za crtanje. On inherentno ne zna šta je "pasus" ili "kolona"; on samo postavlja glifove na određene X/Y koordinate. Da biste pročitali dokument naglas u logičnom redosledu, vaš parser mora da rekonstruiše redosled čitanja.
PDFium ovo obrađuje preko FPDFText_* API porodice, koja analizira prostorne odnose glifova za izlaz koherentnih tokova teksta.
Korak 1: Izdvajanje teksta pomoću PDFiuma
Pre nego što možemo izgovoriti tekst, moramo ga izdvojiti. Sledeći Delphi kod demonstrira kako inicijalizovati tekstualnu stranicu i izdvojiti njen sadržaj u standardni string.
uses
System.SysUtils, pdfium_lib;
function ExtractPageText(Doc: FPDF_DOCUMENT; PageIndex: Integer): string;
var
Page: FPDF_PAGE;
TextPage: FPDF_TEXTPAGE;
CharCount: Integer;
Buffer: array of WideChar;
begin
Result := '';
Page := FPDF_LoadPage(Doc, PageIndex);
if Page = nil then Exit;
try
// Initialize the text extraction engine for this page
TextPage := FPDFText_LoadPage(Page);
if TextPage <> nil then
begin
try
CharCount := FPDFText_CountChars(TextPage);
if CharCount > 0 then
begin
SetLength(Buffer, CharCount + 1);
// Extract the text into the wide string buffer
FPDFText_GetText(TextPage, 0, CharCount, @Buffer[0]);
Result := WideCharToString(@Buffer[0]);
end;
finally
FPDFText_ClosePage(TextPage);
end;
end;
finally
FPDF_ClosePage(Page);
end;
end;
Korak 2: Integracija Windows Speech API-ja (SAPI)
Kada dobijemo semantički tekst, možemo ga proslediti Windows Speech API-ju. SAPI obezbeđuje SpVoice COM interfejs, koji omogućava asinhronu sintezu govora, izbor glasa i kontrolu brzine govora.
uses
System.Win.ComObj, Winapi.ActiveX;
const
SVSFlagsAsync = 1;
procedure SpeakText(const TextToSpeak: string);
var
SpVoice: OLEVariant;
begin
CoInitialize(nil);
try
SpVoice := CreateOleObject('SAPI.SpVoice');
// Speak asynchronously so the UI does not freeze
SpVoice.Speak(TextToSpeak, SVSFlagsAsync);
finally
CoUninitialize;
end;
end;
Korak 3: Sinhronizacija govora sa isticanjem
Zaista pristupačan pregledač ne čita tekst samo naslepo; on ističe reči na ekranu dok se izgovaraju. SAPI obezbeđuje događaje (preko tačaka povezivanja) koji se pokreću kada se dostigne granica reči.
Mapiranjem indeksa karaktera koji vraća SAPI događaj granice reči nazad na indeks karaktera u PDFiumu pomoću FPDFText_GetCharBox(), možete preuzeti granični pravougaonik trenutno izgovorene reči i nacrtati sloj za isticanje na platnu vašeg pregledača.
procedure HighlightWord(TextPage: FPDF_TEXTPAGE; CharIndex: Integer; CharCount: Integer);
var
i: Integer;
L, T, R, B: Double;
begin
// Iterate through the characters of the spoken word
for i := CharIndex to CharIndex + CharCount - 1 do
begin
// Get the physical bounding box on the PDF page
FPDFText_GetCharBox(TextPage, i, @L, @R, @B, @T);
// Transform PDF coordinates to screen coordinates and draw highlighting rect...
end;
end;
Izgradnja inkluzivne aplikacije
Kombinovanjem PDFiumovog prostornog izdvajanja teksta sa SAPI govornim mehanizmom, Delphi programeri mogu kreirati moćne alate za slabovide korisnike ili one koji preferiraju slušno učenje. Pravilna implementacija ovih funkcija osigurava da je vaša aplikacija usklađena sa strogim standardima pristupačnosti preduzeća i vlade.
Napomena: Integrisano izdvajanje teksta i mapiranje koordinata su u potpunosti podržani od strane PDFium Component VCL komponente.