Η προσβασιμότητα δεν αποτελεί πλέον προαιρετικό χαρακτηριστικό στη σύγχρονη ανάπτυξη λογισμικού. Σύμφωνα με κανονισμούς όπως ο ADA (Νόμος για Αμερικανούς με Αναπηρίες) και η Οδηγία της ΕΕ για την Προσβασιμότητα στον Ιστό, το λογισμικό που χειρίζεται έγγραφα πρέπει να παρέχει υποστηρικτικές τεχνολογίες. Για τα προγράμματα προβολής PDF, αυτό σημαίνει την εφαρμογή ισχυρής ενσωμάτωσης μηχανών Κειμένου σε Ομιλία (Text-to-Speech - TTS) και προγραμμάτων ανάγνωσης οθόνης.
Σε αυτό το άρθρο, θα εξετάσουμε πώς να εξάγουμε σημασιολογικές ροές κειμένου από ένα PDF χρησιμοποιώντας το PDFium στο Delphi, και στη συνέχεια να τροφοδοτήσουμε αυτό το κείμενο στο Windows Speech API (SAPI) για την κατασκευή ενός πλήρως προσβάσιμου προγράμματος προβολής PDF.
Η Πρόκληση της Εξαγωγής Κειμένου PDF
Ένα PDF είναι θεμελιωδώς ένας καμβάς οδηγιών σχεδίασης. Δεν γνωρίζει εγγενώς τι είναι μια "παράγραφος" ή μια "στήλη"· απλώς τοποθετεί γλυφές (glyphs) σε συγκεκριμένες συντεταγμένες X/Y. Για να διαβαστεί ένα έγγραφο δυνατά με λογική σειρά, ο αναλυτής (parser) σας πρέπει να ανακατασκευάσει τη σειρά ανάγνωσης.
Το PDFium το χειρίζεται αυτό μέσω της οικογένειας API FPDFText_*, η οποία αναλύει τις χωρικές σχέσεις των γλυφών για να παραγάγει συνεκτικές ροές κειμένου.
Βήμα 1: Εξαγωγή Κειμένου με το PDFium
Πριν μπορέσουμε να εκφωνήσουμε το κείμενο, πρέπει να το εξάγουμε. Ο ακόλουθος κώδικας Delphi δείχνει πώς να αρχικοποιήσετε μια σελίδα κειμένου και να εξάγετε τα περιεχόμενά της σε μια τυπική συμβολοσειρά (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;
Βήμα 2: Ενσωμάτωση του Windows Speech API (SAPI)
Μόλις έχουμε το σημασιολογικό κείμενο, μπορούμε να το περάσουμε στο Windows Speech API. Το SAPI παρέχει τη διεπαφή COM SpVoice, η οποία επιτρέπει την ασύγχρονη σύνθεση ομιλίας, την επιλογή φωνής και τον έλεγχο ρυθμού ομιλίας.
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;
Βήμα 3: Συγχρονισμός Ομιλίας με Επισήμανση
Ένα πραγματικά προσβάσιμο πρόγραμμα προβολής δεν διαβάζει απλώς το κείμενο στα τυφλά· επισημαίνει τις λέξεις στην οθόνη καθώς εκφωνούνται. Το SAPI παρέχει συμβάντα (μέσω σημείων σύνδεσης) που ενεργοποιούνται όταν προσεγγίζεται το όριο μιας λέξης.
Χαρτογραφώντας τον δείκτη χαρακτήρα που επιστρέφεται από το συμβάν ορίου λέξης του SAPI πίσω στον δείκτη χαρακτήρα στο PDFium χρησιμοποιώντας την FPDFText_GetCharBox(), μπορείτε να ανακτήσετε το ορθογώνιο οριοθέτησης (bounding rectangle) της λέξης που εκφωνείται εκείνη τη στιγμή και να σχεδιάσετε μια επικάλυψη επισήμανσης (highlight overlay) στον καμβά του προγράμματος προβολής σας.
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;
Κατασκευή μιας Συμπεριληπτικής Εφαρμογής
Συνδυάζοντας τη χωρική εξαγωγή κειμένου του PDFium με τη μηχανή ομιλίας του SAPI, οι προγραμματιστές Delphi μπορούν να δημιουργήσουν ισχυρά εργαλεία για χρήστες με προβλήματα όρασης ή για όσους προτιμούν την ακουστική μάθηση. Η σωστή εφαρμογή αυτών των χαρακτηριστικών διασφαλίζει ότι η εφαρμογή σας συμμορφώνεται με αυστηρά εταιρικά και κυβερνητικά πρότυπα προσβασιμότητας.
Σημείωση: Η ενσωματωμένη εξαγωγή κειμένου και η χαρτογράφηση συντεταγμένων υποστηρίζονται πλήρως από το PDFium Component.