Moderne programvare må være tilgjengelig. For dokumentvisere betyr dette å tilby robust integrasjon med skjermlesere og tekst-til-tale (TTS)-motorer for synshemmede brukere. Imidlertid innebærer det å bygge bro over gapet mellom den interne gjengivelsesstrukturen til en PDF og en ekstern TTS-motor å navigere forbi noen dype arkitektoniske hindringer.
I denne artikkelen vil vi utforske hvordan man kan kartlegge PDF-innholdsfragmenter til semantiske leseenheter, håndtere tekstvalg i sanntid, og koble leseøktlogikken skikkelig fra verts-UI-et i en Delphi-applikasjon ved bruk av PDFium-motoren.
Kjerneutfordringen: Frakoblede koordinatrom
Den primære hindringen for å bygge en TTS-aktivert PDF-leser er at tekstrepresentasjonen inne i PDF DOM ikke automatisk kartlegges 1:1 med teksten som gjengis på skjermen, eller teksten som snakkes av TTS-motoren. I PDFium gir lesing av tekst via FPDFTextObj_GetText et innholdsfragment, men dette fragmentet bærer ikke iboende den lineære tegnindeksen som kreves for å fremheve teksten på den gjengitte siden via FPDFText_*-API-er.
Siden mellomrom og tekstrekkefølge kan variere veldig mellom den strukturelle DOM-en og den visuelle utformingen, vil forsøk på å kartlegge lesefragmenter direkte til sidens tegnindekser vanligvis mislykkes.
Bruk av ordbokser som mellombro
Den arkitektoniske løsningen er å bruke "ordbokser" (for eksempel TPdfWordBox) som den grunnleggende enheten for tekstinteraksjon. En ordboks kobler iboende de geometriske koordinatene til ordet på siden, tegnindeksene som representerer det ordet, og selve strengnyttelasten.
Når du konstruerer den talte tekstnyttelasten for TTS-motoren, setter du den sammen fra disse sekvensielle ordboksene i stedet for rå innholdsfragmenter. Dette lar deg opprettholde en aktiv "ordmarkør". Mens TTS-motoren snakker, signaliserer den gjeldende ordindeks. Fordi denne indeksen korresponderer direkte til en spesifikk ordboks, kan du umiddelbart fremheve teksten på skjermen ved å bruke tegnindeksene lagret i boksen, og oppnå perfekt synkronisering mellom lyd og visuell fremheving uten noe fuzzy streng-samsvar.
Frakobling av leseøkten fra verts-UI
En vanlig feil ved implementering av TTS er å koble talemotoren, den tikkende timeren og PDF-visningen tett sammen. Dette gjør hodeløs testing umulig og låser logikken til et spesifikt operativsystem eller UI-rammeverk (for eksempel å binde den utelukkende til Windows SAPI).
I stedet bør TPdfReadingSession utformes som en uavhengig tilstandsmaskin:
- Ingen interne timere: Tid bør injiseres av vertsapplikasjonen via en
Tick(SpeechStillBusy, ElapsedMs)-metode. - Ingen direkte motoravhengigheter: Økten bør ikke lenke direkte til en TTS API. Alle interaksjoner bør fyres utover via hendelser som
OnWordChangeogOnChunkChange. - Idempotente hendelsesvakter: Fordi verts-UI-et vil sløyfe og tikke økten ofte, må økten sikre at den ikke utløser
OnWordChangefor det samme ordet to ganger. Dette forhindrer at UI-fremhevingen flimrer unødvendig.
Vertens ansvar
Ved å holde økten rent logisk, beholder vertsapplikasjonen (din Delphi Form eller FPC/Lazarus-vindu) ansvaret for de tunge løftene:
- Gå videre til neste side når en bit (chunk) er ferdig.
- Estimering av tempo (for eksempel å fremheve et ord hver ~340 ms hvis TTS-motoren mangler nøyaktige tilbakekall for ordgrenser, slik som med NVDA-kontrollerklienten).
- Skyve de faktiske strengene til COM- eller opprinnelige tale-API-er.
Ved å overholde denne adskilte arkitekturen kan Delphi-applikasjonen din gi en tilgjengelig dokumentleseopplevelse i verdensklasse som forblir rask, minnesikker og utrolig responsiv.
Merk: TPdfReadingSession, TPdfWordBox og tilgjengelighetsbro-funksjonene er innebygd direkte i PDFium VCL Component.