pdf2text5 / app.py
suprimedev's picture
Update app.py
4193c04 verified
import gradio as gr
import fitz # PyMuPDF
import arabic_reshaper
from bidi.algorithm import get_display
import pytesseract
from PIL import Image
import io
import numpy as np
import tempfile
import os
def extract_text_from_pdf(pdf_file):
try:
# ایجاد فایل موقت برای PDF
with tempfile.NamedTemporaryFile(delete=False, suffix='.pdf') as tmp_file:
if hasattr(pdf_file, 'read'):
# اگر فایل قابل خواندن است
tmp_file.write(pdf_file.read())
else:
# اگر از Gradio File component است
tmp_file.write(pdf_file)
tmp_path = tmp_file.name
# باز کردن فایل PDF از مسیر
doc = fitz.open(tmp_path)
full_text = ""
has_ocr_processed = False
# استخراج متن از تمام صفحات
for page_num in range(len(doc)):
page = doc.load_page(page_num)
# ابتدا سعی می‌کنیم متن را مستقیماً استخراج کنیم
text = page.get_text()
# اگر متن کمی استخراج شده (صفحه احتمالاً تصویری است)
if len(text.strip()) < 100:
# تبدیل صفحه به تصویر با وضوح بالا
mat = fitz.Matrix(300/72, 300/72) # وضوح 300 DPI
pix = page.get_pixmap(matrix=mat)
img_data = pix.tobytes("png")
# استفاده از OCR برای استخراج متن از تصویر
image = Image.open(io.BytesIO(img_data))
# تنظیمات OCR برای زبان‌های مختلف
custom_config = r'--oem 3 --psm 6'
ocr_text = pytesseract.image_to_string(
image,
lang='fas+ara+eng',
config=custom_config
)
text = ocr_text
has_ocr_processed = True
full_text += f"--- صفحه {page_num + 1} ---\n"
full_text += text + "\n\n"
doc.close()
# حذف فایل موقت
os.unlink(tmp_path)
# پردازش متن برای زبان‌های راست‌به‌چپ
try:
reshaped_text = arabic_reshaper.reshape(full_text)
bidi_text = get_display(reshaped_text)
if has_ocr_processed:
bidi_text = "[⚠️ برخی صفحات با OCR پردازش شدند]\n\n" + bidi_text
return bidi_text
except Exception as proc_error:
print(f"خطا در پردازش متن: {proc_error}")
return full_text
except Exception as e:
# حذف فایل موقت در صورت خطا
try:
if 'tmp_path' in locals():
os.unlink(tmp_path)
except:
pass
return f"خطا در پردازش فایل: {str(e)}"
# ایجاد رابط Gradio
with gr.Blocks(title="PDF Text Extractor with OCR") as demo:
gr.Markdown("# 📄 استخراج متن از فایل PDF")
gr.Markdown("با قابلیت پردازش OCR برای PDFهای تصویری")
with gr.Row():
pdf_input = gr.File(
label="فایل PDF را انتخاب کنید",
file_types=[".pdf"],
type="bytes" # استفاده از bytes به جای file path
)
extract_btn = gr.Button("🔄 استخراج متن")
with gr.Row():
text_output = gr.Textbox(
label="متن استخراج شده",
lines=20,
interactive=False,
show_copy_button=True
)
gr.Markdown("""
**⚠️ توجه:**
- برای PDFهای متنی، متن مستقیماً استخراج می‌شود
- برای PDFهای تصویری، از OCR استفاده می‌شود
- پشتیبانی از زبان‌های فارسی، عربی و انگلیسی
- پردازش ممکن است برای فایل‌های بزرگ کمی زمان‌بر باشد
""")
extract_btn.click(
fn=extract_text_from_pdf,
inputs=pdf_input,
outputs=text_output
)
if __name__ == "__main__":
demo.launch(server_name="0.0.0.0", server_port=7860)