suprimedev commited on
Commit
74c2902
·
verified ·
1 Parent(s): bea0406

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +21 -12
app.py CHANGED
@@ -5,13 +5,13 @@ import os
5
  def extract_text_from_pdf(pdf_file):
6
  """
7
  این تابع یک فایل PDF را دریافت کرده و متن آن را استخراج می کند.
8
- با توجه به پشتیبانی pypdf از یونیکد، فارسی و عربی نیز به خوبی پشتیبانی می شوند.
9
 
10
  Args:
11
  pdf_file (dict): شیء فایل آپلود شده توسط Gradio.
12
 
13
  Returns:
14
- tuple: (متن استخراج شده, فایل متنی قابل دانلود)
15
  """
16
  if pdf_file is None:
17
  return "لطفاً یک فایل PDF آپلود کنید.", None
@@ -20,33 +20,42 @@ def extract_text_from_pdf(pdf_file):
20
  # pypdf نیاز به مسیر فایل دارد، Gradio فایل را به صورت موقت ذخیره می کند
21
  pdf_path = pdf_file.name
22
  reader = PdfReader(pdf_path)
23
- text = ""
24
  for page in reader.pages:
25
- text += page.extract_text() or "" # یا "" برای مدیریت صفحات خالی
 
 
 
26
 
27
- # ایجاد فایل متنی برای دانلود
28
  txt_filename = "extracted_text.txt"
29
  with open(txt_filename, "w", encoding="utf-8") as f:
30
- f.write(text)
31
 
32
- return text, txt_filename
 
 
 
 
 
33
  except Exception as e:
34
- return f"خطا در پردازش فایل PDF: {e}", None
 
35
 
36
  # تعریف رابط کاربری Gradio
37
  interface = gr.Interface(
38
  fn=extract_text_from_pdf,
39
  inputs=gr.File(label="فایل PDF را اینجا آپلود کنید (فارسی/عربی/انگلیسی)"),
40
  outputs=[
41
- gr.Textbox(label="متن استخراج شده", lines=15),
 
42
  gr.File(label="دانلود متن به صورت فایل TXT", file_count="single", interactive=False)
43
  ],
44
- title="استخراج متن فارسی/عربی از PDF",
45
- description="یک فایل PDF را برای استخراج متن آن آپلود کنید. سپس متن استخراج شده نمایش داده شده و قابل دانلود خواهد بود.",
46
  allow_flagging="never" # غیرفعال کردن دکمه flagging
47
  )
48
 
49
  # برای اجرا در سرور
50
  if __name__ == "__main__":
51
- # اینجا هیچ نمونه ای تعریف نشده است، فقط برنامه اجرا می شود
52
  interface.launch()
 
5
  def extract_text_from_pdf(pdf_file):
6
  """
7
  این تابع یک فایل PDF را دریافت کرده و متن آن را استخراج می کند.
8
+ با توجه به پشتیبانی pypdf از یونیکد، فارسی، انگلیسی و عربی نیز به خوبی پشتیبانی می شوند.
9
 
10
  Args:
11
  pdf_file (dict): شیء فایل آپلود شده توسط Gradio.
12
 
13
  Returns:
14
+ tuple: (متن استخراج شده برای نمایش, فایل متنی قابل دانلود)
15
  """
16
  if pdf_file is None:
17
  return "لطفاً یک فایل PDF آپلود کنید.", None
 
20
  # pypdf نیاز به مسیر فایل دارد، Gradio فایل را به صورت موقت ذخیره می کند
21
  pdf_path = pdf_file.name
22
  reader = PdfReader(pdf_path)
23
+ text_content = ""
24
  for page in reader.pages:
25
+ # اطمینان از اینکه extract_text() مقدار None برنمی گرداند
26
+ page_text = page.extract_text()
27
+ if page_text:
28
+ text_content += page_text + "\n" # اضافه کردن خط جدید بین صفحات
29
 
30
+ # ایجاد فایل متنی برای دانلود با انکدینگ UTF-8
31
  txt_filename = "extracted_text.txt"
32
  with open(txt_filename, "w", encoding="utf-8") as f:
33
+ f.write(text_content)
34
 
35
+ # برای نمایش صحیح در Gradio، متن استخراج شده را برمی گردانیم.
36
+ # استفاده از Markdown برای نمایش بهتر زبان های راست به چپ
37
+ return f"<div dir='rtl'>{gr.Markdown.update(value=text_content)}</div>", txt_filename
38
+
39
+ except FileNotFoundError:
40
+ return "خطا: فایل PDF پیدا نشد.", None
41
  except Exception as e:
42
+ # خطای عمومی تر را برای موارد دیگر برمی گردانیم
43
+ return f"خطا در پردازش فایل PDF: {str(e)}", None
44
 
45
  # تعریف رابط کاربری Gradio
46
  interface = gr.Interface(
47
  fn=extract_text_from_pdf,
48
  inputs=gr.File(label="فایل PDF را اینجا آپلود کنید (فارسی/عربی/انگلیسی)"),
49
  outputs=[
50
+ # استفاده از gr.Markdown برای خروجی متنی
51
+ gr.HTML(label="متن استخراج شده"),
52
  gr.File(label="دانلود متن به صورت فایل TXT", file_count="single", interactive=False)
53
  ],
54
+ title="استخراج متن چندزبانه (فارسی/عربی/انگلیسی) از PDF",
55
+ description="یک فایل PDF را برای استخراج متن آن آپلود کنید. متن استخراج شده به صورت خوانا نمایش داده شده و قابل دانلود خواهد بود.",
56
  allow_flagging="never" # غیرفعال کردن دکمه flagging
57
  )
58
 
59
  # برای اجرا در سرور
60
  if __name__ == "__main__":
 
61
  interface.launch()