Technical Article

Izgradnja pristupačnih PDF pregledača sa funkcijom pretvaranja teksta u govor u Delphiju

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.