ФÑнкÑиÑÑа за ÑеÑене на Ð³Ð»Ð°Ñ Ð¸Ð¼Ð° една видима задаÑа оÑвен ÑÐ°Ð¼Ð¸Ñ Ð³Ð»Ð°Ñ: докаÑо вÑÑка дÑма Ñе пÑоизнаÑÑ, ÑÑ ÑÑÑбва да Ñ Ð¾ÑвеÑÑва на ÑÑÑаниÑаÑа и да Ñ Ð´ÑÑжи в полезÑениеÑо. Ðа да поÑÑигнеÑе Ñова, Ñе нÑждаеÑе Ð¾Ñ Ð¾Ð³ÑаниÑаваÑаÑа Ñамка (bounding box) на вÑÑка дÑма, индекÑиÑана кÑм ÑÑÑÐ¸Ñ Ð¿Ð¾Ñок Ð¾Ñ Ð·Ð½Ð°Ñи, Ð¾Ñ ÐºÐ¾Ð¹Ñо ÑеÑе глаÑовиÑÑ Ð¼Ð¾Ð´Ñл. Ðко полÑÑиÑе ÑамкиÑе, но пÑопÑÑнеÑе индекÑиÑанеÑо, маÑкиÑанеÑо Ñе изоÑÑане Ñ Ð´Ñма-две Ñлед аÑдиоÑо; ако напÑавиÑе индекÑиÑанеÑо, но не ÑпÑавлÑваÑе пÑавилно ÑÑÑÑоÑниеÑо на ÑÑÑаниÑаÑа, маÑкиÑанеÑо Ñе Ñе озове на напÑлно гÑеÑна ÑÑÑаниÑа. ÐÑипÑогÑаÑÑки ÑложнаÑа ÑаÑÑ Ð¾Ñ Ñова, ÑамиÑÑ ÑинÑезаÑоÑ, Ñе повÑежда ÑÑдко. SAPI докладва гÑаниÑиÑе на дÑмиÑе до конкÑеÑÐ½Ð¸Ñ Ð·Ð½Ð°Ðº. Това, коеÑо Ñе ÑÑпи, е ÑÑнкиÑÑ Ñлой за ÑÑпоÑÑавÑне Ð¼ÐµÐ¶Ð´Ñ Ð¾ÑмеÑÑванеÑо на знака (character offset) в бÑÑеÑа за ÑÐµÑ Ð¸ пÑавоÑгÑлника вÑÑÑ Ñ ÑендиÑанаÑа ÑÑÑаниÑа.
PDFium Component пÑедоÑÑÐ°Ð²Ñ Ñова ÑÑпоÑÑавÑне за Delphi, C++Builder и Lazarus, каÑо ÑамкиÑе за дÑми (word boxes) Ñа налиÑни Ð¾Ñ Ð²ÐµÑÑÐ¸Ñ v1.53, а пÑоÑледÑваÑиÑÑ ÐºÑÑÑÐ¾Ñ (tracking cursor) е налиÑен Ð¾Ñ v1.56. ÐнÑеÑÑейÑÑÑ Ðµ ÑмиÑлено ÑеÑен: извикване, коеÑо вÑÑÑа ÑамкиÑе за дÑми на дадена ÑÑÑаниÑа, ÑÑакеÑ, койÑо пÑевÑÑÑа оÑмеÑÑванеÑо на знака в изÑиÑÑвано маÑкиÑане, и нÑколко ÑвойÑÑва за ÑвÑÑ Ð¸ авÑомаÑиÑно пÑевÑÑÑане. ÐÑпÑеки пÑоÑÑоÑаÑа Ñи, ÑедÑÑ Ð½Ð° извикване на ÑÑнкÑииÑе опÑÐµÐ´ÐµÐ»Ñ Ð´Ð°Ð»Ð¸ ÑÑнкÑиÑÑа Ñе ÑабоÑи, а повеÑеÑо Ð¾Ñ Ð³ÑеÑкиÑе по-Ð´Ð¾Ð»Ñ Ð¿ÑоизÑиÑÐ°Ñ Ð¾Ñ Ð¸Ð·Ð²Ð¸ÐºÐ²Ð°Ð½Ðµ на пÑавилниÑе ÑÑнкÑии в гÑеÑна поÑледоваÑелноÑÑ.
ÐнаÑиÑе не Ñа дÑми, а TTS модÑлиÑе говоÑÑÑ Ð² знаÑи
ÐлаÑовиÑÑ Ð¼Ð¾Ð´Ñл обÑабоÑва плоÑÑк низ и оÑÑиÑа напÑедÑка каÑо позиÑии на знаÑи в ÑамкиÑе на Ñози низ. PDF ÑÑÑаниÑаÑа ÑÑдÑÑжа глиÑове, Ñазположени в пÑоÑÑÑанÑÑвоÑо на ÑÑÑаниÑаÑа, кÑдеÑо âдÑмаâ?е евÑиÑÑиÑен клÑÑÑÐµÑ Ð¾Ñ Ð¿Ð¾ÑедиÑи глиÑове. ÐвеÑе кооÑдинаÑни ÑиÑÑеми не ÑподелÑÑ Ð½Ð¸Ñо обÑо, оÑвен ако ÑекÑÑÑÑ, койÑо подаваÑе на ÑинÑезаÑоÑа, не ÑÑвпада Ð±Ð°Ð¹Ñ Ð¿Ð¾ Ð±Ð°Ð¹Ñ Ñ ÑекÑÑа, вÑз оÑнова на койÑо Ñа изÑиÑлени ÑамкиÑе на дÑмиÑе. Това е пÑÑвоÑо и абÑолÑÑно задÑлжиÑелно пÑавило. Ðко ноÑмализиÑаÑе пÑазниÑе пÑоÑÑÑанÑÑва, пÑÐµÐ¼Ð°Ñ Ð½ÐµÑе мекиÑе ÑиÑеÑа (soft hyphens) или по дÑÑг наÑин âпоÑиÑÑиÑеâ?извлеÑÐµÐ½Ð¸Ñ ÑекÑÑ Ð¿Ñеди глаÑовоÑо Ð¼Ñ Ð²ÑзпÑоизвеждане, вÑÑко ÑледваÑо оÑмеÑÑване Ñе бÑде неÑоÑно. ÐодавайÑе ÑоÑно Ñова, коеÑо ÑÑе извлекли, или поддÑÑжайÑе ÑÑна ÑаблиÑа за пÑенаÑоÑване на оÑмеÑÑваниÑÑа. ÐÑма ÑÑеÑи ваÑианÑ, койÑо да ÑабоÑи пÑи Ñеални докÑменÑи.
ТаблиÑаÑа за пÑенаÑоÑване не е Ñ Ð¸Ð¿Ð¾ÑеÑиÑен кÑаен ÑлÑÑай. РмоменÑа, в койÑо ваÑиÑÑ Ð¿Ð¾ÑÑебиÑелÑки инÑеÑÑÐµÐ¹Ñ Ð²Ð¼Ñкне глаÑово ÑÑобÑение за ÑÑÑаниÑа (âÑÑÑаниÑа пеÑâ? или ÑазÑиÑи ÑÑкÑаÑение за ÑинÑезаÑоÑа, изговоÑениÑÑ Ð½Ð¸Ð· Ñе Ñазминава Ñ Ð¸Ð·Ð²Ð»ÐµÑениÑ. ÐапиÑвайÑе позиÑиÑÑа и дÑлжинаÑа на вÑÑко вмÑкване, Ñлед коеÑо изваждайÑе наÑÑÑпанаÑа коÑекÑÐ¸Ñ Ð¿Ñеди вÑÑко извикване на пÑоÑледÑванеÑо. Това Ñа около двадеÑÐµÑ Ñеда оÑÑеÑноÑÑ Ð¸ именно Ñе пÑавÑÑ ÑазликаÑа Ð¼ÐµÐ¶Ð´Ñ Ð¼Ð°ÑкиÑане, коеÑо оÑелÑва пÑи ÑледваÑаÑа заÑвка за нова ÑÑнкÑиÑ, и Ñакова, коеÑо Ñе ÑÑпи оÑе пÑÑÐ²Ð¸Ñ Ð¿ÑÑ, когаÑо нÑкой поиÑка глаÑово ÑеÑене на заглавиÑ.
Ðакво ви пÑедоÑÑÐ°Ð²Ñ ÑамкаÑа за дÑма
ÐÑеки Ð·Ð°Ð¿Ð¸Ñ TPdfWordBox ÑÑдÑÑжа ÑекÑÑа на дÑмаÑа, Ð½ÐµÐ¹Ð½Ð¸Ñ StartIndex и бÑой знаÑи (Count) в ÑекÑÑа на ÑÑÑаниÑаÑа, нейноÑо меÑÑоположение в пÑоÑÑÑанÑÑвоÑо на ÑÑÑаниÑаÑа Rect и номеÑа на ÑÑÑаниÑаÑа Page (базиÑан на 1). ÐолеÑо StartIndex е моÑÑÑÑ Ð¼ÐµÐ¶Ð´Ñ Ð´Ð²ÐµÑе кооÑдинаÑни ÑиÑÑеми: Ñова е ÑÑÑоÑо оÑмеÑÑване, коеÑо SAPI Ñе вÑÑне по вÑеме на ÑеÑене. ФÑнкÑиÑÑа PageWordBoxes вÑÑÑа пÑÐ»Ð½Ð¸Ñ Ð¼Ð°Ñив за акÑивнаÑа ÑÑÑаниÑа:
procedure TReaderForm.PreparePage(PageNo: Integer);
begin
PdfView.PageNumber := PageNo; // the view's word boxes track its displayed page
FWords := PdfView.PageWordBoxes;
FPageText := BuildSpeechText(FWords); // concatenate Word.Text in order
if Length(FWords) = 0 then
HandleImageOnlyPage(PageNo); // a scan with no text layer
end;
ÐоменÑаÑÑÑ Ð·Ð° поÑледоваÑелноÑÑÑа е Ð¾Ñ ÑеÑаваÑо знаÑение. ÐеÑодÑÑ PageWordBoxes на визÑализаÑоÑа ÑокенизиÑа ÑекÑÑÐ¾Ð²Ð¸Ñ Ñлой на ÑÑÑаниÑаÑа, коÑÑо Ñе показва в моменÑа, Ñака Ñе пÑÑво навигиÑайÑе изгледа и едва Ñлед Ñова извлиÑайÑе; не Ñе изиÑква ÑендиÑане, а Ñамо оÑвоÑен докÑменÑ. (ÐомпоненÑÑÑ Ð·Ð° докÑменÑи TPdf пÑедлага ÑобÑÑвен меÑод PageWordBoxes, обвÑÑзан Ñ Pdf.PageNumber за Ñонова ÑпоÑÑеба. ÐваÑа номеÑа на ÑÑÑаниÑи Ñа незавиÑими, коеÑо е поÑенÑиален капан.) ÐÑазен ÑезÑлÑÐ°Ñ Ð·Ð° ÑÑÑаниÑа, коÑÑо видимо ÑÑдÑÑжа ÑÑдÑÑжание, ознаÑава ÑканиÑано изобÑажение без ÑекÑÑов Ñлой. ÐаÑоÑеÑе го кÑм OCR или поне го ÑÑобÑеÑе глаÑово (âÑÑÑаниÑа 4 не ÑÑдÑÑжа ÑеÑим ÑекÑÑâ?, вмеÑÑо да оÑÑавÑÑе глаÑа да заглÑÑ
не без никакво обÑÑнение.
СвÑÑзване на SAPI гÑаниÑиÑе на дÑмиÑе Ñ ÑÑакеÑа
ÐеÑодÑÑ TrackReadingWordAt вÑв визÑализаÑоÑа е ÑдÑоÑо на ÑÑлаÑа ÑÑнкÑионалноÑÑ. ÐодайÑе Ð¼Ñ Ð½Ð¾Ð¼ÐµÑ Ð½Ð° ÑÑÑаниÑа и Ð¸Ð½Ð´ÐµÐºÑ Ð½Ð° знак; Ñой намиÑа ÑамкаÑа за дÑма, ÑÑдÑÑжаÑа Ñози знак, изÑиÑÑва кÑÑÑоÑа за ÑеÑене вÑÑÑ
Ñ Ð½ÐµÑ Ð¸ вÑÑÑа индекÑа на дÑмаÑа, или -1, когаÑо индекÑÑÑ Ð¿Ð¾Ð¿Ð°Ð´Ð° Ð¼ÐµÐ¶Ð´Ñ Ð´Ñми. ÐзвеÑÑиеÑо за гÑаниÑа на дÑма на SAPI пÑедоÑÑÐ°Ð²Ñ ÑоÑно позиÑиÑÑа на знака, коÑÑо Ð¼Ñ Ðµ необÑ
одима:
procedure TReaderForm.OnSpeechWordBoundary(StreamPos: Integer);
var
WordIdx: Integer;
begin
// Maps the offset to a word box and moves the highlight in one call
WordIdx := PdfView.TrackReadingWordAt(FPageNo, StreamPos);
if WordIdx < 0 then
Exit; // boundary fell outside any word: keep last highlight
end;
Ðва деÑанзивни деÑайла Ñа изклÑÑиÑелно полезни ÑÑк. ÐÑÑво, TrackReadingWordAt поддÑÑжа Ñвой ÑобÑÑвен ÐºÐµÑ Ð½Ð° ÑамкиÑе за дÑми за пÑоÑледÑванаÑа ÑÑÑаниÑа, койÑо Ñе обновÑва авÑомаÑиÑно пÑи ÑмÑна на ÑÑÑаниÑаÑа, Ñака Ñе ÑенаÑа за вÑÑко извеÑÑие оÑÑава поÑÑоÑнна, незавиÑимо колко бÑÑзо пÑиÑÑÐ¸Ð³Ð°Ñ Ð³ÑаниÑиÑе. ÐÑоÑо, меÑодÑÑ Ð½Ðµ извÑÑÑва либеÑална пÑовеÑка на гÑаниÑиÑе. ÐÐ½Ð´ÐµÐºÑ Ð½Ð° или надÑ
вÑÑлÑÑ Ð±ÑÐ¾Ñ Ð·Ð½Ð°Ñи на ÑÑÑаниÑаÑа вÑÑÑа -1, вмеÑÑо да Ñе огÑаниÑава до поÑледнаÑа дÑма. ТÑеÑиÑайÑе -1 каÑо âзадÑÑжÑе пÑедиÑноÑо маÑкиÑанеâ? а никога каÑо гÑеÑка, ÑÑй каÑо пÑепинаÑелниÑе знаÑи и пÑазниÑе пÑоÑÑÑанÑÑва Ð¼ÐµÐ¶Ð´Ñ Ð´ÑмиÑе логиÑно генеÑиÑÐ°Ñ Ð³ÑаниÑи, коиÑо не пÑÐ¸Ð½Ð°Ð´Ð»ÐµÐ¶Ð°Ñ Ð½Ð° Ð½Ð¸ÐºÐ¾Ñ Ð´Ñма. ÐогванеÑо на вÑÑко -1 Ñе пÑеÑоваÑи ÑиÑÑемаÑа. ÐмеÑÑо Ñова ги бÑойÑе на ÑÑÑаниÑа и анализиÑайÑе ÑÑÑаниÑиÑе, пÑи коиÑо Ñози пÑоÑÐµÐ½Ñ ÑкаÑа, ÑÑй каÑо Ñова обикновено показва неÑÑоÑвеÑÑÑвие пÑи ноÑмализиÑанеÑо на ÑекÑÑа ÑÑглаÑно пÑÑвоÑо пÑавило.
СамиÑÑ ÐºÑÑÑоÑ: ÑвÑÑ, пÑоÑледÑване и изÑиÑÑване
ÐеÑодÑÑ SetReadingWord изÑиÑÑва маÑкиÑанеÑо диÑекÑно, когдаÑо вие Ñами дÑÑжиÑе ÑамкаÑа за дÑма, ReadingWordColor опÑÐµÐ´ÐµÐ»Ñ ÑÑила мÑ, а ReadingWordFollow := True пÑевÑÑÑа изгледа ÑоÑно Ñолкова, колкоÑо е необÑ
одимо, за да дÑÑжи изговоÑенаÑа дÑма видима. Това поÑледно ÑвойÑÑво е много важно. Ð ÑÑно напÑавеноÑо пÑевÑÑÑане за ÑенÑÑиÑане на ÑекÑÑаÑа дÑма каÑа ÑÑÑаниÑаÑа да Ñе ÑÑеÑе пÑи вÑÑко пÑеминаване на нов Ñед, а поÑÑебиÑели, ÑÑвÑÑвиÑелни кÑм движение, бÑÑзо Ñе изклÑÑÐ°Ñ Ñази ÑÑнкÑиÑ. ÐаÑкиÑанеÑо Ñе ÑендиÑа Ñамо вÑÑÑ
Ñ ÑÑÑаниÑаÑа, коÑÑо Ñе вижда в моменÑа в акÑÐ¸Ð²Ð½Ð¸Ñ TPdfView, Ñака Ñе ÑеÑенеÑо на нÑколко ÑÑÑаниÑи изиÑква пÑомÑна на PageNumber ÑÑпоÑедно Ñ ÑеÑÑа, поÑледвано Ð¾Ñ Ð¿Ð¾Ð²ÑоÑно изпÑлнение на подгоÑовкаÑа за новаÑа ÑÑÑаниÑа, пÑеди да пÑиÑÑигне пÑÑвоÑо ÑÑбиÑие за гÑаниÑа. Ðко пÑопÑÑнеÑе Ñова, пÑÑвиÑе нÑколко маÑкиÑÐ°Ð½Ð¸Ñ Ð½Ð° вÑÑка нова ÑÑÑаниÑа Ñе ÑоÑÐ°Ñ ÐºÑм оÑÑаÑели кооÑдинаÑи.
procedure TReaderForm.StopReading;
begin
FVoice.Stop; // halt SAPI playback first
PdfView.ClearReadingWord; // then remove the highlight; a stale cursor reads as a bug
end;
СимеÑÑиÑÑа пÑи ÑпиÑане е Ñова, коеÑо поддÑÑжа маÑкиÑанеÑо коÑекÑно. ÐÑеки пÑÑ Ð½Ð° паÑза, ÑпиÑане или пÑелиÑÑване на ÑÑÑаниÑа ÑÑÑбва да завÑÑÑва Ñ ClearReadingWord. Ðко пÑопÑÑнеÑе Ñова, на ÑпÑÑнаÑа ÑÑÑаниÑа Ñе оÑÑане жÑÐ»Ñ Ð¿ÑавоÑгÑлник, койÑо изглежда ÑоÑно каÑо деÑекÑ, коеÑо е вид пÑоблем, койÑо вÑеки ÑеÑÑÐµÑ Ñе докладва, вÑпÑеки Ñе Ñеално ниÑо не е ÑÑÑпено.
СкоÑоÑÑÑа на ÑеÑÑа наÑоваÑва Ñази веÑига много повеÑе, оÑколкоÑо ÑазмеÑÑÑ Ð½Ð° докÑменÑа. ÐÑи 300 дÑми в минÑÑа ÑÑбиÑиÑÑа за гÑаниÑи пÑиÑÑÐ¸Ð³Ð°Ñ Ð½Ð° вÑеки 200 ms, а пÑи най-виÑокиÑе ÑкоÑоÑÑи на SAPI Ñе Ð¸Ð´Ð²Ð°Ñ Ð¿Ð¾-бÑÑзо, оÑколкоÑо окоÑо може Ñдобно да пÑоÑледи. ÐÑавилноÑо поведение е обединÑване (coalesce), а не опаÑка Ð¾Ñ Ð·Ð°Ñвки. Ðко пÑиÑÑигне ново ÑÑбиÑие, докаÑо акÑÑализаÑиÑÑа на маÑкиÑанеÑо вÑе оÑе Ñе обÑабоÑва, Ð¸Ð·Ñ Ð²ÑÑлеÑе ÑÑаÑоÑо и изÑиÑÑвайÑе най-новоÑо. ÐÑÑÑоÑ, койÑо пÑеминава пÑез вÑÑка дÑма подÑед, но закÑÑнÑва Ñ Ð¿Ð¾Ð»Ð¾Ð²Ð¸Ð½ ÑекÑнда, изглежда ÑÑÑпен; Ñози, койÑо понÑкога пÑопÑÑка дÑма, но оÑÑава в ÑÐ¸Ð½Ñ Ñон Ñ Ð³Ð»Ð°Ñа, изглежда наÑед.
ÐÑайни ÑлÑÑаи, коиÑо оÑлиÑÐ°Ð²Ð°Ñ Ð´ÐµÐ¼Ð¾ веÑÑииÑе Ð¾Ñ ÑеалниÑе пÑодÑкÑи
ÐÑколко каÑегоÑии докÑменÑи ÑазкÑÐ¸Ð²Ð°Ñ ÑлабиÑе меÑÑа. ÐомбиниÑаÑиÑе знаÑи (combining characters) Ñа най-ÑиниÑÑ Ð¿Ñоблем: Unicode поÑледоваÑелноÑÑиÑе, каÑо напÑÐ¸Ð¼ÐµÑ Ð¾Ñновна бÑква плÑÑ ÐºÐ¾Ð¼Ð±Ð¸Ð½Ð¸ÑаÑа диакÑиÑиÑна маÑка, Ð¼Ð¾Ð³Ð°Ñ Ð´Ð° Ð·Ð°ÐµÐ¼Ð°Ñ Ð¿Ð¾Ð²ÐµÑе знаÑи, оÑколкоÑо визÑалнаÑа дÑма подÑказва, Ñака Ñе вÑÑка аÑиÑмеÑика на оÑмеÑÑванеÑо, коÑÑо пÑедполага один Ð¸Ð½Ð´ÐµÐºÑ Ð½Ð° глиÑ, бавно Ñе запоÑне да Ñе Ñазминава. Това е най-ÑигÑÑниÑÑ Ð°ÑгÑÐ¼ÐµÐ½Ñ Ð´Ð° оÑÑавиÑе TrackReadingWordAt да ÑпÑавлÑва ÑÑпоÑÑавÑнеÑо, вмеÑÑо да изÑиÑлÑваÑе номеÑаÑа на дÑмиÑе ÑÑÑно. ÐÑенаÑÑнеÑо на дÑми е по-пÑозаиÑно, но по-ÑеÑÑо ÑÑеÑано: дÑма, Ñазделена на нов Ñед, Ñе пÑевÑÑÑа в две Ñамки и ако Ñ Ð¸Ð·Ð³Ð¾Ð²Ð¾ÑиÑе каÑо един Ñокен, ÑÑбиÑиеÑо за гÑаниÑа на вÑоÑаÑа половина Ñе Ñе наÑоÑи кÑм пÑÑваÑа Ñамка. Това обикновено е пÑиемливо, но е пÑоекÑно ÑеÑение, Ñака Ñе го вземеÑе ÑÑзнаÑелно, вмеÑÑо да го оÑкÑиваÑе впоÑледÑÑвие. СÑÑÑкÑÑÑиÑанеÑо пÑÐ¾Ð¼ÐµÐ½Ñ ÑÐ°Ð¼Ð¸Ñ Ñед на ÑеÑене. ÐогаÑо докÑменÑÑÑ ÑÑдÑÑжа пÑавилни ÑÑÑÑкÑÑÑни Ñагове (облаÑÑÑа на ISO 14289, PDF/UA), поÑледоваÑелноÑÑÑа на дÑмиÑе Ñледва логиÑеÑкаÑа ÑÑÑÑкÑÑÑа; без ÑÑÑ
ÑиÑÑемаÑа ÑазÑиÑа на евÑиÑÑика за оÑоÑмление и двÑколона неÑÑÑÑкÑÑÑиÑана ÑÑÑаниÑа може да бÑде пÑоÑеÑена Ñ
оÑизонÑално пÑез двеÑе колони. ÐавÑÑÑениÑе ÑÑÑаниÑи Ñа поÑледниÑÑ ÑеÑÑо ÑÑеÑан ÑлÑÑай: Rect на вÑÑка дÑма вÑе оÑе Ñ Ð¾Ð³Ñажда пÑавилно в пÑоÑÑÑанÑÑвоÑо на ÑÑÑаниÑаÑа, но полиÑикаÑа за пÑоÑледÑване на пÑозоÑеÑа, наÑÑÑоена за Ñ
оÑизонÑален поÑок, Ñе пÑевÑÑÑа ÑÑзко, когаÑо ÑекÑÑÑÑ Ð²ÑÑви веÑÑикално, заÑова запазеÑе поне един завÑÑÑÑн докÑÐ¼ÐµÐ½Ñ Ð²Ñв ваÑÐ¸Ñ ÑеÑÑов комплекÑ. Ðа ÑпÑавление на Ñеда на ÑеÑене, изÑеÑÐµÐ½Ð¸Ñ ÑÑез ReadingUnits и по-ÑиÑокаÑа аÑиÑÑиÑаÑа ÑоÑÑÑеÑна аÑÑ
иÑекÑÑÑа, вижÑе маÑеÑиала за изгÑаждане на доÑÑÑпен PDF ÑеÑÐµÑ Ð² Delphi.
Ðдно огÑаниÑение на плаÑÑоÑмаÑа влиÑе вÑÑÑ Ñ Ð²Ð½ÐµÐ´ÑÑванеÑо. SAPI е налиÑна Ñамо за Windows. API за Ñамки на дÑми и пÑоÑледÑване е напÑлно иденÑиÑно под Lazarus и FPC, но веÑÑииÑе за Linux и macOS изиÑÐºÐ²Ð°Ñ ÑазлиÑен ÑинÑезаÑоÑ, ÑвÑÑзан зад ÑÑÑиÑе ÑÑбиÑÐ¸Ñ Ð·Ð° гÑаниÑи; Ñази конÑигÑÑаÑÐ¸Ñ Ðµ Ñазгледана в маÑеÑиала за ÑабоÑа Ñ Ð²Ð¸Ð·ÑализаÑоÑа под Lazarus и FPC. ЦенаÑа на маÑкиÑанеÑо ÑÑÑо Ñака взаимодейÑÑва Ñ Ð²Ð°ÑÐ¸Ñ ÐºÐµÑ Ð½Ð° ÑÑÑаниÑи, когаÑо ÑкоÑоÑÑÑа на говоÑене Ñе ÑвелиÑи, а изÑиÑлениÑÑа в ÑемаÑа за ÑендиÑане на кеÑа и пÑоизводиÑелноÑÑ Ð¿Ñи маÑабиÑане Ñе пÑÐ¸Ð»Ð°Ð³Ð°Ñ Ð¸ ÑÑк без пÑомÑна.
ÐогаÑо маÑкиÑанеÑо дÑма по дÑма е гÑеÑнаÑа деÑайлноÑÑ
ÐаÑаоке еÑекÑÑÑ Ð½Ð° ниво дÑма невинаги е Ñова, коеÑо ÑиÑаÑелÑÑ Ð¸Ñка. ÐÑи виÑоки ÑкоÑоÑÑи на говоÑене пÑемигванеÑо на кÑÑÑоÑа дÑма по дÑма Ñе пÑевÑÑÑа в визÑален ÑÑм и нÑкои ÑлÑÑаÑели пÑоÑледÑÐ²Ð°Ñ Ð¸Ð·ÑеÑениÑÑа по-леÑно, оÑколкоÑо бÑÑзоÑо ÑменÑне на оÑделни дÑми. Ðа Ñози ÑлÑÑай компоненÑÑÑ Ð¸Ð·Ð»Ð°Ð³Ð° по-едÑа единиÑа. ReadingUnits вÑÑÑа единиÑи на ниво изÑеÑение и блок, вÑÑка ÑÑÑ Ñвои ÑобÑÑвени пÑавоÑгÑлниÑи за маÑкиÑане, коиÑо ÑиÑÑваÑе ÑÑÑ SetReadingHighlight вмеÑÑо ÑÑÑ SetReadingWord. СвÑÑзванеÑо е в ÑÑÑаÑа ÑоÑма: оÑмеÑÑванеÑо на гÑаниÑаÑа вÑе оÑе опÑÐµÐ´ÐµÐ»Ñ ÐºÐ¾Ð¹ ÐµÐ»ÐµÐ¼ÐµÐ½Ñ ÑвеÑва, но маÑкиÑанаÑа единиÑа обÑ
ваÑа ÑÑла ÑÑаза или Ñед вмеÑÑо единиÑен Ñокен. Ðо-бавниÑе ÑиÑаÑели и вÑзпÑоизвежданеÑо Ñ Ð²Ð¸Ñока ÑкоÑоÑÑ Ð¾Ð±Ð¸ÐºÐ½Ð¾Ð²ÐµÐ½Ð¾ пÑедпоÑиÑÐ°Ñ Ñози подÑ
од и ниÑо не ви пÑеÑи да пÑедложиÑе и дваÑа Ñежима каÑо поÑÑебиÑелÑка наÑÑÑойка.
ÐинималниÑе изиÑÐºÐ²Ð°Ð½Ð¸Ñ Ð·Ð° веÑÑииÑе Ñи ÑÑÑÑва да бÑÐ´Ð°Ñ ÑÑоÑнени пÑеди ÑазÑабоÑкаÑа: ÑамкиÑе за дÑми изиÑÐºÐ²Ð°Ñ PDFium Component v1.53 или по-нова веÑÑиÑ, а пÑоÑледÑваÑиÑÑ ÐºÑÑÑÐ¾Ñ Ð¸Ð·Ð¸Ñква v1.56. ÐÑлниÑÑ API за ÑеÑене, единиÑиÑе на ниво изÑеÑение и ÑабоÑеÑаÑа демонÑÑÑаÑÐ¸Ñ Ð·Ð° ÑеÑене на Ð³Ð»Ð°Ñ Ñа доÑÑÑпни на пÑодÑкÑоваÑа ÑÑÑаниÑа за PDFium Component.