تحويل ملفات PDF والصور إلى نصوص باستخدام التعرف الضوئي من Google Drive
المميزات • التثبيت • المتطلبات • المصادقة • الاستخدام • واجهة البرمجة • المساهمة
تحويل (بالإنجليزية: Tahweel، وتعني "التحويل") هي أداة Ruby قوية لتحويل ملفات PDF والصور إلى نصوص قابلة للتحرير باستخدام تقنية التعرف الضوئي من Google Drive. تم تحسينها بشكل خاص للنصوص العربية، لكنها تعمل بامتياز مع جميع اللغات التي يدعمها محرك Google.
- 🔤 تعرف ضوئي عالي الجودة — يستخدم محرك Google Drive القوي لاستخراج النصوص بدقة
- 📄 صيغ إدخال متعددة — يدعم ملفات PDF و JPG و JPEG و PNG
- 📝 صيغ إخراج متعددة — تصدير إلى TXT أو DOCX أو JSON
- 🌐 دعم النصوص العربية — اكتشاف تلقائي لاتجاه النص من اليمين لليسار
- ⚡ معالجة متزامنة — معالجة متعددة الخيوط على مستوى الملفات والصفحات
- 📊 تتبع التقدم اللحظي — واجهة طرفية جميلة مع تتبع التقدم لكل خيط
- 🖥️ واجهة رسومية — واجهة سطح مكتب عبر المنصات بالعربية والإنجليزية
- 🔄 تخطي ذكي — يتخطى الملفات تلقائياً عندما يكون الإخراج موجوداً
- 📁 الحفاظ على هيكل المجلدات — يحافظ على التسلسل الهرمي للمجلدات في الإخراج
- 🛡️ معالجة أخطاء قوية — إعادة المحاولة بتأخير تصاعدي لحدود واجهة البرمجة
gem install tahweelأضف هذا السطر إلى ملف Gemfile الخاص بتطبيقك:
gem 'tahweel'ثم نفّذ:
bundle installgit clone https://github.com/ieasybooks/tahweel.rb.git
cd tahweel.rb
bundle installيتطلب تحويل Ruby 3.2.0 أو أحدث.
يستخدم تحويل أدوات Poppler (pdftoppm و pdfinfo) لتقسيم ملفات PDF إلى صور.
macOS:
brew install popplerUbuntu/Debian:
sudo apt install poppler-utilsWindows:
يقوم تحويل بتنزيل وتثبيت Poppler تلقائياً على Windows عند التشغيل لأول مرة.
ستحتاج إلى حساب Google للمصادقة مع خدمة التعرف الضوئي في Google Drive. في أول تشغيل لتحويل، سيفتح نافذة متصفح للمصادقة عبر OAuth.
يستخدم تحويل OAuth 2.0 للمصادقة مع Google Drive. عند التشغيل لأول مرة:
- ستفتح نافذة متصفح تلقائياً
- سجّل الدخول بحسابك في Google
- امنح تحويل صلاحية إنشاء وإدارة الملفات في Google Drive الخاص بك
- بعد المصادقة، سترى صفحة نجاح ويمكنك إغلاق المتصفح
ملاحظة: يقوم تحويل فقط بإنشاء ملفات مؤقتة لمعالجة التعرف الضوئي ويحذفها فوراً بعد الاستخراج. يستخدم نطاق drive.file الذي يسمح فقط بالوصول إلى الملفات التي أنشأها التطبيق.
يتم تخزين بيانات الاعتماد بشكل آمن في:
- Linux/macOS:
~/.cache/tahweel/token.yaml - Windows:
%LOCALAPPDATA%\tahweel\token.yaml
لإزالة بيانات الاعتماد المخزنة وإعادة المصادقة:
tahweel-clearتحويل ملف PDF واحد:
tahweel document.pdfتحويل جميع ملفات PDF في مجلد:
tahweel /path/to/documents/تحديد صيغ الإخراج (الافتراضي: txt,docx):
# Text only
tahweel document.pdf -f txt
# DOCX only
tahweel document.pdf -f docx
# JSON only
tahweel document.pdf -f json
# Multiple formats
tahweel document.pdf -f txt,docx,jsontahweel document.pdf -o /path/to/output/# Process only PDF files
tahweel /path/to/documents/ -e pdf
# Process only images
tahweel /path/to/documents/ -e jpg,jpeg,png# Process 4 files concurrently
tahweel /path/to/documents/ -F 4
# Use 8 concurrent OCR operations per file
tahweel /path/to/documents/ -O 8DPI أعلى ينتج جودة أفضل لكن معالجة أبطأ:
tahweel document.pdf --dpi 300tahweel document.pdf --page-separator "\\n---PAGE BREAK---\\n"| الخيار | المختصر | الوصف | الافتراضي |
|---|---|---|---|
--extensions |
-e |
امتدادات الملفات للمعالجة | pdf,jpg,jpeg,png |
--dpi |
DPI لتحويل PDF إلى صورة | 150 |
|
--processor |
-p |
معالج OCR المستخدم | google_drive |
--file-concurrency |
-F |
أقصى عدد ملفات للمعالجة المتزامنة | المعالجات - 2 |
--ocr-concurrency |
-O |
أقصى عمليات OCR متزامنة | 12 |
--formats |
-f |
صيغ الإخراج (مفصولة بفواصل) | txt,docx |
--page-separator |
فاصل الصفحات لإخراج TXT | \n\nPAGE_SEPARATOR\n\n |
|
--output |
-o |
مجلد الإخراج | مجلد ملف الإدخال |
--version |
-v |
عرض الإصدار |
لتشغيل واجهة سطح المكتب:
tahweel-uiتوفر الواجهة الرسومية:
- تحويل ملف واحد أو مجلد كامل
- واجهة بالعربية والإنجليزية
- تتبع التقدم للمستوى العام ولكل ملف
- فتح مجلد الإخراج تلقائياً عند الانتهاء
تعرض واجهة سطر الأوامر لوحة تقدم لحظية:
Total Progress: [3/10] 30.0% | Time: 45s
[Worker 1] document1.pdf | Ocr | 75.0% (6/8)
[Worker 2] document2.pdf | Splitting | 50.0% (5/10)
[Worker 3] Idle
[Worker 4] document4.pdf | Ocr | 25.0% (2/8)
إخراج نصي بسيط مع فواصل صفحات قابلة للتخصيص:
محتوى الصفحة 1 هنا...
PAGE_SEPARATOR
محتوى الصفحة 2 هنا...
مستندات Word منسقة مع:
- صفحة محتوى واحدة لكل صفحة مستند
- اتجاه نص تلقائي (RTL للعربية، LTR لغيرها)
- فواصل أسطر متوافقة مع جميع المنصات
- دمج ذكي للأسطر لقراءة أفضل
إخراج منظم صفحة بصفحة:
[
{
"page": 1,
"content": "محتوى الصفحة 1 هنا..."
},
{
"page": 2,
"content": "محتوى الصفحة 2 هنا..."
}
]require 'tahweel'
# Convert a PDF to text (returns array of page texts)
pages = Tahweel.convert('document.pdf')
# With options
pages = Tahweel.convert(
'document.pdf',
dpi: 300, # Higher quality
processor: :google_drive,
concurrency: 8
)
# With progress tracking
pages = Tahweel.convert('document.pdf') do |progress|
puts "Stage: #{progress[:stage]}"
puts "Progress: #{progress[:percentage]}%"
puts "Current page: #{progress[:current_page]}"
endrequire 'tahweel'
# Extract text from a single image
text = Tahweel.extract('image.png')
text = Tahweel.extract('photo.jpg', processor: :google_drive)require 'tahweel'
pages = Tahweel.convert('document.pdf')
# Write to multiple formats
Tahweel::Writer.write(pages, 'output', formats: [:txt, :docx, :json])
# Write to a single format with options
Tahweel::Writer.write(
pages,
'output',
formats: [:txt],
page_separator: "\n---\n"
)require 'tahweel'
# Using the CLI FileProcessor for complete workflow
Tahweel::CLI::FileProcessor.process('document.pdf', {
dpi: 150,
processor: :google_drive,
ocr_concurrency: 12,
formats: [:txt, :docx],
output: '/path/to/output'
}) do |progress|
puts "#{progress[:stage]}: #{progress[:percentage]}%"
endrequire 'tahweel'
# Get all supported files in a directory
files = Tahweel::CLI::FileCollector.collect('/path/to/documents/')
# Filter by specific extensions
files = Tahweel::CLI::FileCollector.collect(
'/path/to/documents/',
extensions: ['pdf']
)# Convert all PDFs in an Arabic books directory with high quality
tahweel ~/arabic-books/ -f txt,docx --dpi 200 -o ~/converted-books/# Convert scanned images to searchable text
tahweel ~/scanned-docs/ -e jpg,png -f txt -o ~/ocr-output/require 'tahweel'
# Convert and process in your application
def process_document(pdf_path)
pages = Tahweel.convert(pdf_path) do |progress|
update_progress_bar(progress[:percentage])
end
# Process the extracted text
full_text = pages.join("\n\n")
word_count = full_text.split.size
{
pages: pages.size,
words: word_count,
text: full_text
}
endإذا واجهت أخطاء اتصال أو تجمد مع دفعات كبيرة:
ulimit -n 4096يتعامل تحويل تلقائياً مع حدود معدل Google API بتأخير تصاعدي. إذا استمرت المشاكل، جرّب تقليل التزامن:
tahweel documents/ -F 2 -O 6تأكد من تثبيت Poppler وأنه في مسار PATH:
which pdftoppm # Should return a pathتقارير الأخطاء وطلبات السحب مرحب بها على GitHub في https://github.com/ieasybooks/tahweel.rb.
- انسخ المستودع (Fork)
- أنشئ فرع الميزة (
git checkout -b feature/amazing-feature) - ثبّت تغييراتك (
git commit -am 'Add amazing feature') - ادفع إلى الفرع (
git push origin feature/amazing-feature) - افتح طلب سحب (Pull Request)
بعد استنساخ المستودع:
bin/setup # Install dependencies
rake spec # Run tests
bin/console # Interactive promptهذه الأداة متاحة كمصدر مفتوح بموجب شروط رخصة MIT.
يُتوقع من جميع المتفاعلين في مشروع تحويل اتباع قواعد السلوك.
صُنع بـ ❤️ بواسطة iEasyBooks
