تحويل (Tahweel)
تحويل ملفات PDF والصور إلى نصوص باستخدام التعرف الضوئي من Google Drive
المميزات • التثبيت • المتطلبات • المصادقة • الاستخدام • واجهة البرمجة • المساهمة
تحويل (بالإنجليزية: Tahweel، وتعني "التحويل") هي أداة Ruby قوية لتحويل ملفات PDF والصور إلى نصوص قابلة للتحرير باستخدام تقنية التعرف الضوئي من Google Drive. تم تحسينها بشكل خاص للنصوص العربية، لكنها تعمل بامتياز مع جميع اللغات التي يدعمها محرك Google.
المميزات
- 🔤 تعرف ضوئي عالي الجودة — يستخدم محرك Google Drive القوي لاستخراج النصوص بدقة
- 📄 صيغ إدخال متعددة — يدعم ملفات PDF و JPG و JPEG و PNG
- 📝 صيغ إخراج متعددة — تصدير إلى TXT أو DOCX أو JSON
- 🌐 دعم النصوص العربية — اكتشاف تلقائي لاتجاه النص من اليمين لليسار
- ⚡ معالجة متزامنة — معالجة متعددة الخيوط على مستوى الملفات والصفحات
- 📊 تتبع التقدم اللحظي — واجهة طرفية جميلة مع تتبع التقدم لكل خيط
- 🖥️ واجهة رسومية — واجهة سطح مكتب عبر المنصات بالعربية والإنجليزية
- 🔄 تخطي ذكي — يتخطى الملفات تلقائياً عندما يكون الإخراج موجوداً
- 📁 الحفاظ على هيكل المجلدات — يحافظ على التسلسل الهرمي للمجلدات في الإخراج
- 🛡️ معالجة أخطاء قوية — إعادة المحاولة بتأخير تصاعدي لحدود واجهة البرمجة
التثبيت
من RubyGems
gem install tahweelباستخدام Bundler
أضف هذا السطر إلى ملف Gemfile الخاص بتطبيقك:
gem 'tahweel'ثم نفّذ:
bundle installمن المصدر
git clone https://github.com/ieasybooks/tahweel.rb.git
cd tahweel.rb
bundle installالمتطلبات
إصدار Ruby
يتطلب تحويل Ruby 3.2.0 أو أحدث.
أدوات Poppler
يستخدم تحويل أدوات Poppler (pdftoppm و pdfinfo) لتقسيم ملفات PDF إلى صور.
macOS:
brew install popplerUbuntu/Debian:
sudo apt install poppler-utilsWindows:
يقوم تحويل بتنزيل وتثبيت Poppler تلقائياً على Windows عند التشغيل لأول مرة.
حساب Google
ستحتاج إلى حساب 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,jsonمجلد إخراج مخصص
tahweel 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 8إعدادات DPI
DPI أعلى ينتج جودة أفضل لكن معالجة أبطأ:
tahweel document.pdf --dpi 300فاصل صفحات مخصص (إخراج TXT)
tahweel 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)
صيغ الإخراج
TXT (نص عادي)
إخراج نصي بسيط مع فواصل صفحات قابلة للتخصيص:
محتوى الصفحة 1 هنا...
PAGE_SEPARATOR
محتوى الصفحة 2 هنا...
DOCX (Microsoft Word)
مستندات Word منسقة مع:
- صفحة محتوى واحدة لكل صفحة مستند
- اتجاه نص تلقائي (RTL للعربية، LTR لغيرها)
- فواصل أسطر متوافقة مع جميع المنصات
- دمج ذكي للأسطر لقراءة أفضل
JSON (بيانات منظمة)
إخراج منظم صفحة بصفحة:
[
{
"page": 1,
"content": "محتوى الصفحة 1 هنا..."
},
{
"page": 2,
"content": "محتوى الصفحة 2 هنا..."
}
]واجهة البرمجة
تحويل ملفات PDF
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]}"
endاستخراج النص من الصور
require '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]}%"
endجمع الملفات من مجلد
require '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 6Poppler غير موجود
تأكد من تثبيت 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
