مهايئات Tesseract OCR
يوفر HPDFTesseractRecognition محركات Windows اختيارية تنفّذ IHPDFOCREngine من أجل طبقات نص OCR القابلة للبحث
مصنع مكتبة DLL الأصلية
function HPDFCreateTesseractDLLOCREngine(const LibraryPath,
TessDataDirectory, Language: string): IHPDFOCREngine; overload;
function HPDFCreateTesseractDLLOCREngine(const LibraryPath,
TessDataDirectory, Language: string;
const Options: THPDFTesseractOptions): IHPDFOCREngine; overload;
وفّر مكتبة Tesseract DLL قائمة تكشف واجهة C المتوافقة مع Tesseract 5، ودليل tessdata، ومعرّف لغة ASCII أو تركيبة مثل eng وchi_sim وchi_sim+eng
يجب أن تطابق بنية المكتبة بنية التطبيق: فتطبيق Win32 يحمّل مكتبة DLL ذات 32 بت، بينما يحمّل تطبيق Win64 مكتبة ذات 64 بت
أبقِ مكتبات DLL التابعة المطلوبة بجوار المكتبة المختارة أو في أدلّة محمّل Windows القياسية؛ ويحمّل المهايئ مسار المكتبة الصريح دون تغيير الدليل الحالي أو مسار بحث العملية
يتحقق المصنع من كل ملف .traineddata مطلوب، ويحمّل المكتبة، ويستوضح الـexports المطلوبة قبل العودة؛ والمسارات أو النماذج أو الخيارات غير الصالحة، والـexports المفقودة، وعدم تطابق البنية، والتبعيات غير المتاحة ترفع استثناء
لا تأتي بيئة تشغيل OCR أو النماذج مضمّنة، ولا شيء يُنزَّل تلقائيًا
كلا المصنعين متاح في حزمة FPC/Lazarus على Windows وكذلك في بنيات Delphi و C++Builder؛ وأعد بناء Lib/FPC/HotPDFLaz.lpk للبنية الهدف قبل استخدام HPDFTesseractRecognition
يقرأ مهايئ FPC الأصلي صورة LCL الخام الحالية، بما فيها البكسلات المكتوبة عبر scanlines، ويحافظ على كلمات Unicode بمعزل عن صفحة أكواد ANSI للنظام
الخيارات
THPDFTesseractOptions = record
PageSegMode: THPDFTesseractPageSegMode;
EngineMode: THPDFTesseractEngineMode;
TimeoutMilliseconds: Cardinal;
MaxPixels: Integer;
class function Default: THPDFTesseractOptions; static;
end;
استدعِ THPDFTesseractOptions.Default قبل تعديل الحقول؛ ويصلح السجل نفسه لضبط مصنع مكتبة DLL الأصلية أو نسخة خيارات CLI المحلية
| الحقل | الافتراضي | المعنى |
|---|---|---|
PageSegMode | tpsAuto | تقسيم صفحات تلقائي دون كشف الاتجاه |
EngineMode | temDefault | وضع المحرك الذي تدعمه نماذج اللغة المختارة |
TimeoutMilliseconds | 60000 | موعد نهائي للطلبية من 1 إلى 3,600,000 ميلي ثانية؛ ويتعاون DLL مع الإلغاء، بينما يُنهى عامل CLI عند انتهاء المهلة |
MaxPixels | 16777216 | ميزانية بكسلات المُدخل، قابلة للضبط من 1 إلى 67,108,864 بكسلًا |
THPDFTesseractPageSegMode = (
tpsOSDOnly, tpsAutoOSD, tpsAutoOnly, tpsAuto, tpsSingleColumn,
tpsSingleBlockVertical, tpsSingleBlock, tpsSingleLine, tpsSingleWord,
tpsCircleWord, tpsSingleCharacter, tpsSparseText, tpsSparseTextOSD,
tpsRawLine);
THPDFTesseractEngineMode = (
temLegacyOnly, temLSTMOnly, temLegacyAndLSTM, temDefault);
لا يجري tpsOSDOnly ولا tpsAutoOnly أي تعرف على الكلمات فيرفضهما المهايئ؛ وtpsAutoOSD وtpsSparseTextOSD يشترطان أيضًا osd.traineddata
استخدم tpsSingleLine لسطر نص واحد وtpsSingleBlock لكتلة متجانسة أو tpsSparseText لنص متناثر؛ وهذه الأوضاع لا تصلح منظور المسح ولا تقدم ضمان تخطيط عام
يشترط temLSTMOnly نماذج LSTM، بينما تشترط الأوضاع القديمة مكونات نماذج قديمة مقابلة؛ والتركيبات غير المدعومة تفشل أثناء التهيئة الأصلية
مثال PDF قابل للبحث
يجب أن يكون PDF محمّلًا مسبقًا، وأن تكون المكتبة والتبعيات ونماذج اللغة مثبتة في المسارات المعروضة
uses SysUtils, HPDFDoc, HPDFTesseractRecognition;
procedure AddNativeOCRText(PDF: THotPDF);
var
Engine: IHPDFOCREngine;
NativeOptions: THPDFTesseractOptions;
LayerOptions: THPDFOCRTextLayerOptions;
Info: THPDFOCRTextLayerInfo;
begin
NativeOptions := THPDFTesseractOptions.Default;
NativeOptions.EngineMode := temLSTMOnly;
NativeOptions.PageSegMode := tpsAuto;
Engine := HPDFCreateTesseractDLLOCREngine(
'C:\OCR\libtesseract-5.dll', 'C:\OCR\tessdata',
'chi_sim+eng', NativeOptions);
LayerOptions := THPDFOCRTextLayerOptions.Default;
if not PDF.ApplyLoadedOCRTextLayer([0], Engine, LayerOptions, Info) then
raise Exception.Create(string(Info.Diagnostic));
end;
النتائج والملكية
ينسخ المهايئ الـbitmap المُستعار إلى مخزن تدرّج رمادي من الأعلى إلى الأسفل، ويمرّر DPI الطلبية، ويعرف عبر نسخة واجهة API أصلية خاصة بالطلبية
تحافظ الكلمات على ترتيب القراءة الأصلي ونص Unicode بترميز UTF-8 متحقق منه وحدود ببكسلات أعلى-اليسار وثقة مُحوَّلة من المدى 0 إلى 100 إلى المدى 0 إلى 1؛ وتستهلك المحارف التكميلية وحدتي UTF-16
تُمرَّر خطوط أساس الكلمات المتاحة مع طرفيها؛ وعندما لا يتوفر خط أساس يُطبَّق بديل هندسة طبقة النص القائم
بالنسبة لخط أساس غالبًا ما يكون رأسيًا، يستخدم المهايئ الأصلي عرض صندوق الكلمة كـ TextHeightPixels؛ أما خطوط الأساس الأفقية فتستخدم ارتفاع الصندوق، بما في ذلك اتجاهات القراءة المعكوسة، حتى لا يصير طول الكلمة الرأسية حجم خطها
هذا تقدير للمحور السائد: فصندوق كلمة موازٍ للمحاور وخط أساس وحدهما لا يكفيان لاستعادة ارتفاع النص الدقيق عند زوايا مائلة اعتباطية
تنجح الصفحة الفارغة بمصفوفة كلمات فارغة؛ وUTF-8 المشوه ومحارف التحكم المضمّنة والهندسة أو الثقة غير الصالحة والميزانيات المستنفَدة للكلمات أو النص والإلغاء وإخفاقات التعرف تعيد False وتمسح كل الكلمات الجزئية وتملأ التشخيص
يحرّر كل طلبية المكرّر الخاص به والسلاسل الأصلية المخصصة والمراقب ونسخة الـAPI؛ وتحرير المهايئ يلغي الإشارة إلى مكتبته
الحدود والإلغاء
يجب ألا يتجاوز أي بُعد من أبعاد المُدخل 32,767 بكسلًا وأن يستوعبه MaxPixels؛ ويجب أن يستوعب النص المعترف به ميزانية MaxTextCodeUnits للطلبية وحد المهايئ البالغ 1,048,576 وحدة UTF-16، وأن يستوعب عدد الكلمات MaxWords
يتحقق المهايئ من الإلغاء والوقت المنقضي أثناء تحويل الـbitmap وأثناء تكرار النتائج، ويوفّر مراقبًا أصليًا بالموعد النهائي المتبقي ونداء إلغاء أثناء التعرف
الإلغاء الأصلي تعاوني: مراقب Tesseract يغطي تعرف الكلمات ولا يقاطع كل خطوة تهيئة أو تحليل تخطيط؛ وقد تكتمل هذه الاستدعاءات قبل تبليغ إلغاء مطلوب أو موعد نهائي منته
لا تفرض ميزانيات البكسلات والمخرجات حدًا صارمًا على استهلاك ذاكرة النموذج أو التعرف في المكتبة الأصلية؛ واستخدم مهايئ العمليات عندما يحتاج التطبيق عاملًا قابلًا للإنهاء بشكل منفصل
تتحقق ApplyLoadedOCRTextLayer من كل النتائج وتنشر كل صفحة مختارة ذريًا، فيبقى المستند المحمّل دون تغيير عند فشل المهايئ
يرفض مهايئ DLL ترميز UTF-8 غير الصالح ويقتطع فراغات طرف نص الكلمة المفكوك ويرفض محارف التحكم C0 و DEL و C1 المتبقية قبل إعادة النتائج، فيُخفق النص المشوه في الطلبية بدلًا من أن يتجاهله طبقة نص PDF بصمت
مصنع CLI المحلي
function HPDFCreateTesseractOCREngine(const ExecutablePath,
TessDataDirectory, Language: string;
TimeoutMilliseconds: Cardinal = 60000): IHPDFOCREngine; overload;
function HPDFCreateTesseractOCREngine(const ExecutablePath,
TessDataDirectory, Language: string;
const Options: THPDFTesseractOptions): IHPDFOCREngine; overload;
تمرّر نسخة الخيارات PageSegMode كـ --psm وEngineMode كـ --oem، وتستخدم المهلة المهيأة، وتفحص MaxPixels قبل حفظ الـbitmap المستعار أو بدء عامل
تحفظ نسخة المهلة القائمة التقسيم التلقائي للصفحات ووضع المحرك الذي يختاره الملف التنفيذي دون فرض حد بكسلات جديد للمهايئ؛ واستخدم نسخة الخيارات عندما يتطلب الأمر حد مُدخل صريحًا
تحتفظ كلتا النسختين بـ DPI المطلوب وخرج TSV والمقابض الموروثة المقيَّدة واستطلاع الإلغاء وإنهاء العامل عند الفشل؛ وليس لدى CLI معلومات خط أساس أصلية، ويحدّ خرج TSV بـ 64 MiB وخرج الملف التشخيصي بـ 1 MiB
ترفع أوضاع التقسيم وأوضاع المحرك والمهل وحدود البكسلات غير الصالحة استثناء EArgumentException عند إنشاء المحرك المهيأ؛ أما توفّر النماذج، بما فيها osd.traineddata لأوضاع الاتجاه، وتوافق النموذج مع المحرك فيفحصهما الملف التنفيذي أثناء التعرف
var
CLIOptions: THPDFTesseractOptions;
Engine: IHPDFOCREngine;
begin
CLIOptions := THPDFTesseractOptions.Default;
CLIOptions.PageSegMode := tpsSingleLine;
CLIOptions.EngineMode := temLSTMOnly;
CLIOptions.MaxPixels := 8000000;
Engine := HPDFCreateTesseractOCREngine(
'C:\OCR\tesseract.exe', 'C:\OCR\tessdata', 'eng', CLIOptions);
end;
استخدم tpsSingleWord لكلمة معزولة، أو tpsSparseText لنص متناثر، أو tpsSingleBlockVertical مع نموذج نص عمودي مناسب لكتلة رأسية واحدة؛ فالمصنع لا يقص الصفحات ولا يختار النماذج تلقائيًا
يتحقق مهايئ CLI بدقة من ترميز UTF-8، ويرفض بايتات NUL ومحارف التحكم C0/C1 داخل الكلمات المعترف بها، ويمسح كل النتائج إذا تبعه خرج مشوه بعد كلمة صالحة
راجع طبقات نص OCR القابلة للبحث لمثال CLI وخيارات الرسم وتجميع المحتوى الاختياري وحدود المطابقة