استخراج تمیز متن از PDF با پایتون؛ راهنمای جامع و اسکریپت رایگان

با یک اسکریپت پایتون آفلاین و رایگان، متن فایل‌های PDF را بدون به‌هم‌ریختگی فاصله‌ها و کاراکترها استخراج و پردازش کنید.

🎧 خلاصه صوتی مقاله (پادکست ۲ دقیقه‌ای):

فرصت مطالعه ندارید؟ چکیده این مطلب را همین‌جا گوش دهید:

استخراج متن از فایل‌های PDF یکی از چالش‌های همیشگی پژوهشگران، دانشجویان و توسعه‌دهندگان نرم‌افزار است. وقتی می‌خواهید متن یک مقاله علمی، کتاب الکترونیکی یا سند اداری را کپی کنید، اغلب با مشکلاتی مثل به‌هم‌ریختگی کلمات، فاصله‌های اضافی بین حروف، شکسته‌شدن خطوط در وسط جمله و وارونه شدن ترتیب کلمات در متن‌های چندزبانه مواجه می‌شوید. این مشکل به ساختار داخلی اسناد PDF برمی‌گردد که متن را نه به عنوان کلمات پیوسته، بلکه به صورت کاراکترهای مختصات‌دار ذخیره می‌کنند. برای حل این مشکل، نوشتن یک اسکریپت خودکار بهترین راهکار است. در همین رابطه، اگر به ابزارهای متن‌باز و کاربردی علاقه‌مند هستید، مطالعه‌ی معرفی HelloGitHub؛ مرجع جذاب و رایگان برای کشف پروژه‌های متن‌باز خالی از لطف نخواهد بود. در این مقاله قصد داریم یک اسکریپت کامل و کاملاً آفلاین پایتون برای پاکسازی و استخراج ساختاریافته متن از PDF ارائه دهیم که تمامی نیازهای پردازش متن شما را برطرف می‌کند.

مسئله: چرا کپی کردن دستی از PDF فاجعه‌بار است؟

فرمت PDF برای چاپ دقیق طراحی شده است، نه برای ویرایش یا خواندن متن توسط ماشین. هنگامی که یک فایل PDF را باز می‌کنید و متنی را با ماوس انتخاب و کپی می‌کنید، موتور رندرینگ نرم‌افزار سعی می‌کند مختصات گرافیکی کاراکترها را به متن تبدیل کند. این فرآیند چند ایراد بزرگ دارد: اول اینکه فاصله‌های بین‌کلمه‌ای به هم می‌ریزند و ممکن است کلمات به هم بچسبند یا بین حروف فاصله‌های بی‌مورد (مثل ف ا ص ل ه) ایجاد شود. دوم اینکه خطوط با رسیدن به انتهای صفحه شکسته می‌شوند و کاراکترهای نیم‌فاصله یا کاراکترهای راست‌به‌چپ (مخصوص زبان فارسی) معکوس یا جدا از هم استخراج می‌شوند. برای مهندسان داده و پژوهشگرانی که قصد دارند روی متون تحلیل انجام دهند، این ناهنجاری‌ها داده‌های ورودی را بی‌ارزش می‌کند. خوشبختانه با استفاده از زبان پایتون و کتابخانه‌های قدرتمند آن، می‌توان این هرج‌ومرج را به یک متن تمیز، ساختاریافته و پاراگراف‌بندی‌شده تبدیل کرد بدون اینکه نیاز به اتصال به اینترنت یا ابزارهای آنلاین پولی داشته باشیم.

نصب کتابخانه‌ها و آماده‌سازی محیط

برای پردازش فایل‌های PDF در پایتون، پکیج‌های مختلفی وجود دارد. برای اینکه کار ما کاملاً پایدار، سریع و بدون نیاز به ابزارهای سنگین C++ پیش برود، از کتابخانه‌ی سبک و محبوب pypdf استفاده می‌کنیم. این کتابخانه به طور کامل رایگان و متن‌باز است و به راحتی روی تمام سیستم‌عامل‌ها نصب می‌شود. پیش از اجرای اسکریپت اصلی، باید این کتابخانه را در محیط پایتون خود نصب کنید.

برای نصب کتابخانه pypdf، دستور زیر را در ترمینال یا خط فرمان سیستم خود اجرا کنید:

pip install pypdf

این دستور کتابخانه را به همراه تمام وابستگی‌های ضروری دانلود و نصب می‌کند. پس از اتمام نصب، پکیج آماده‌ی ایمپورت شدن در فایل پایتون شماست. نیازی به تنظیمات پیچیده یا کلیدهای دسترسی نیست و تمام عملیات به صورت محلی روی سیستم شما پردازش می‌شود.

کد کامل پایتون برای استخراج و پاکسازی متن PDF

اسکریپت زیر یک فایل PDF مشخص را صفحه به صفحه می‌خواند، متن هر صفحه را استخراج می‌کند، فاصله‌های اضافی، خطوط شکسته‌ی بی‌مورد و کاراکترهای کنترلی نامطلوب را حذف می‌کند و در نهایت یک خروجی متنی تمیز و پاراگراف‌بندی‌شده تحویل می‌دهد. این کد به صورت یکپارچه نوشته شده است و می‌توانید آن را مستقیماً در فایل pdf_cleaner.py کپی و اجرا کنید.

import re
import sys
from pypdf import PdfReader

def clean_persian_english_text(text):
    """
    تابع برای پاکسازی و استانداردسازی متن استخراج شده از PDF
    """
    if not text:
        return ""
    
    # اصلاح فاصله‌های اضافی و کاراکترهای کنترلی ناخواسته
    text = re.sub(r'[ \t]+', ' ', text)
    
    # حذف خطوط خالی مکرر و ایجاد یکپارچگی در پاراگراف‌ها
    lines = text.split('\n')
    cleaned_lines = []
    
    for line in lines:
        stripped_line = line.strip()
        if stripped_line:
            cleaned_lines.append(stripped_Line if 'stripped_Line' in locals() else stripped_line)
            
    # پیوست دادن خطوط با یک فاصله استاندارد برای جلوگیری از شکستگی جملات
    joined_text = ' '.join(cleaned_lines)
    
    # حذف فاصله‌های قبل از علائم نگارشی رایج
    joined_text = re.sub(r'\s+([،؛.!؟,.:;])', r'\1', joined_text)
    
    return joined_text

def extract_and_clean_pdf(pdf_path, output_txt_path):
    """
    تابع اصلی برای خواندن فایل PDF، استخراج متن و ذخیره در فایل خروجی
    """
    try:
        reader = PdfReader(pdf_path)
        total_pages = len(reader.pages)
        print(f"تعداد کل صفحات سند: {total_pages}")
        
        full_extracted_content = []
        
        for index, page in enumerate(reader.pages):
            print(f"در حال پردازش صفحه {index + 1} از {total_pages}...")
            raw_text = page.extract_text()
            
            if raw_text:
                cleaned_page_text = clean_persian_english_text(raw_text)
                full_extracted_content.append(f"--- صفحه {index + 1} ---\n{cleaned_page_text}\n")
            else:
                full_extracted_content.append(f"--- صفحه {index + 1} (بدون متن قابل استخراج) ---\n")
                
        # ذخیره متن نهایی در فایل خروجی
        with open(output_txt_path, 'w', encoding='utf-8') as output_file:
            output_file.write('\n'.join(full_extracted_content))
            
        print(f"عملیات با موفقیت انجام شد! متن تمیز در مسیر زیر ذخیره شد:\n{output_txt_path}")
        
    except FileNotFoundError:
        print(f"خطا: فایل PDF در مسير '{pdf_path}' پیدا نشد.")
    except Exception as e:
        print(f"خطای غیرمنتظره‌ای رخ داد: {str(e)}")

if __name__ == "__main__":
    # نام فایل PDF ورودی و فایل متنی خروجی را اینجا مشخص کنید
    input_pdf_file = "sample_document.pdf"
    output_text_file = "cleaned_output.txt"
    
    # اجرای تابع استخراج
    extract_and_clean_pdf(input_pdf_file, output_text_file)

توضیح بخش‌به‌بخش کد

برای اینکه بدانید این اسکریپت دقیقاً چه کارهایی انجام می‌دهد، اجازه بدهید بخش‌های کلیدی آن را بررسی کنیم:

  • تابع clean_persian_english_text: این بخش وظیفه‌ی اصلی پاکسازی را بر عهده دارد. با استفاده از عبارات باقاعده (Regex)، فاصله‌های افقی اضافی (مانند تب‌ها و چند فاصله پشت سر هم) را به یک فاصله واحد تبدیل می‌کند. همچنین فاصله‌های اشتباه قبل از علائم نگارشی مثل نقطه و کاما را اصلاح می‌کند تا متن ظاهر حرفه‌ای‌تری داشته باشد.
  • کلاس PdfReader: این ابزار از کتابخانه pypdf است که فایل PDF را به صورت باینری اسکن کرده و به اشئی قابل مدیریت تبدیل می‌کند که می‌توانیم به صفحات آن دسترسی داشته باشیم.
  • حلقه پردازش صفحات: کد به صورت ترتیبی تک‌تک صفحات را پیمایش کرده، متد extract_text() را روی هر صفحه اعمال می‌کند و متن خام را برای پاکسازی به تابع کمکی می‌فرستد. اگر صفحه‌ای فاقد متن قابل استخراج باشد (مثلاً حاوی تصویر اسکن‌شده بدون لایه متن)، برنامه به طور هوشمند آن را مدیریت کرده و متوقف نمی‌شود.
  • مدیریت فایل خروجی: متن نهایی با کدگذاری استاندارد utf-8 در یک فایل متنی ذخیره می‌شود تا پشتیبانی کامل از زبان‌های فارسی، عربی و انگلیسی تضمین شود.

نحوه اجرا و تست اسکریپت

برای اجرای این اسکریپت، مراحل زیر را به ترتیب انجام دهید:

  1. پایتون (نسخه ۳.۷ یا بالاتر) را روی سیستم خود نصب داشته باشید.
  2. کتابخانه مورد نیاز را با دستور pip install pypdf نصب کنید.
  3. کد بالا را در یک فایل با نام دلخواه مثلاً pdf_processor.py ذخیره کنید.
  4. یک فایل PDF نمونه (مثلاً با نام sample_document.pdf) را دقیقاً در همان پوشه‌ای که اسکریپت قرار دارد کپی کنید (یا مسیر کامل فایل را در متغیر input_pdf_file وارد کنید).
  5. ترمینال را در همان پوشه باز کرده و دستور زیر را اجرا کنید:
python pdf_processor.py

پس از چند ثانیه (بسته به حجم فایل PDF)، پیام موفقیت‌آمیز بودن عملیات در ترمینال چاپ می‌شود و فایل cleaned_output.txt در کنار اسکریپت ظاهر خواهد شد.

خروجی نمونه

فرض کنید یک فایل PDF با خطوط به‌هم‌ریخته و فاصله‌های نامنظم دارید. پس از اجرای اسکریپت، محتوای فایل متنی خروجی به شکل ساختاریافته و تمیز زیر درخواهد آمد:

--- صفحه 1 ---
این یک متن نمونه است که از فایل پی‌دی‌اف استخراج و پاکسازی شده است. تمامی فاصله‌های اضافی حذف شده و متن آماده پردازش توسط مدل‌های هوش مصنوعی یا ابزارهای تحلیلی است.

--- صفحه 2 ---
در این بخش پاراگراف‌های بعدی سند قرار دارند. شکستگی‌های خطوط غیرضروری برداشته شده تا جملات به صورت پیوسته خوانده شوند.

ایده‌های توسعه و بهینه‌سازی بیشتر

این اسکریپت پایه‌ی بسیار محکمی برای پروژه‌های بزرگ‌تر است. اگر خواستید آن را ارتقا دهید، می‌توانید ایده‌های زیر را به کد اضافه کنید:

  • پردازش دسته‌ای (Batch Processing): اسکریپت را طوری تغییر دهید که تمام فایل‌های PDF موجود در یک پوشه خاص را به طور خودکار پیدا کرده و تبدیل کند.
  • استخراج جدول‌ها: با استفاده از کتابخانه‌های تکمیلی مثل pdfplumber می‌توانید علاوه بر متن ساده، داده‌های درون جدول‌ها را نیز شناسایی و به فرمت CSV تبدیل کنید.
  • در پروژه‌های توسعه نرم‌افزار، مدیریت بهینه‌ی پنجره‌ها و محیط کاربری هم اهمیت دارد؛ مشابه آنچه در مدیریت پنجره‌ها در ویندوز با FancyZones؛ راهنمای حرفه‌ای چیدمان برای بهینه‌سازی فضای کاری دسکتاپ معرفی شده است.

  • اتصال به ابزارهای تحلیل متن: خروجی متنی تمیز این اسکریپت را مستقیماً به کتابخانه‌های پردازش زبان طبیعی (NLP) مثل Hazm یا SpaCy بدهید تا تحلیل کلمات، ریشه‌یابی و خلاصه‌سازی خودکار روی آن‌ها انجام شود.

خطاهای رایج و راه‌حل‌ها

در هنگام کار با فایل‌های PDF ممکن است با چند خطای پرتکرار مواجه شوید که در اینجا راه‌حل آن‌ها را بررسی می‌کنیم:

  • خطای PdfReadError یا فایل رمزگذاری شده: اگر فایل PDF شما دارای رمز عبور (Password-Protected) باشد، کتابخانه نمی‌تواند آن را بخواند. قبل از اجرای اسکریپت، باید قفل فایل را با ابزارهای مجاز باز کنید.
  • خروجی متن نامفهوم یا کاراکترهای عجیب (Mojibake): برخی از فایل‌های PDF قدیمی از فونت‌های غیراستاندارد استفاده می‌کنند که جدول نگاشت کاراکتر آن‌ها به هم ریخته است. در این حالت کتابخانه‌های استخراج متن معمولاً کاراکترهای تصادفی برمی‌گردانند که نیازمند استفاده از ابزارهای نویسه‌خوان نوری (OCR) است.
  • نبود متن در فایل‌های اسکن‌شده: اگر سند PDF شما در حقیقت مجموعه‌ای از تصاویر اسکن‌شده است (که لایه متنی ندارند)، متد extract_text() خروجی خالی می‌دهد. در چنین مواردی باید از ابزارهای OCR مبتنی بر تصویر استفاده کنید.
مشخصات فنی اسکریپت استخراج متن PDF

زبان برنامه‌نویسیپایتون (Python 3.7+)
کتابخانه اصلیpypdf (نسخه متن‌باز و سبک)
وضعیت اینترنتکاملاً آفلاین (بدون نیاز به اتصال اینترنت)
فرمت ورودیفایل‌های استاندارد PDF
فرمت خروجیمتن ساده (TXT) با کدگذاری UTF-8
وضعیت دسترسی ایرانکاملاً آزاد و بدون محدودیت

پرسش‌های متداول

آیا این اسکریپت روی فایل‌های PDF فارسی به خوبی کار می‌کند؟

بله، کتابخانه pypdf ساختار متن‌های راست‌به‌چپ را پشتیبانی می‌کند و این اسکریپت با اصلاح فاصله‌ها و حذف کاراکترهای کنترلی، خروجی بسیار تمیزی به شما می‌دهد، مشروط بر اینکه فایل PDF اصلی دارای لایه متنی استاندارد باشد.

آیا برای اجرای این کد نیاز به اتصال اینترنت است؟

خیر. پس از اینکه یک‌بار کتابخانه pypdf را با دستور pip نصب کردید، کل فرآیند خواندن و پردازش فایل‌های PDF به صورت کاملاً آفلاین روی سیستم شما انجام می‌شود.

چگونه می‌توانم این اسکریپت را برای پوشه‌ای پر از فایل PDF اجرا کنم؟

می‌توانید از ماژول داخلی os در پایتون استفاده کنید تا تمام فایل‌های با پسوند pdf را در یک دایرکتوری مشخص اسکن کرده و این تابع را به صورت حلقه‌وار روی تک‌تک آن‌ها اعمال کنید.

اگر فایل PDF اسکن‌شده باشد (تصویر متن)، این کد کار می‌کند؟

خیر. اسناد اسکن‌شده فاقد لایه متنی هستند و به صورت عکس ذخیره شده‌اند. برای آن دسته از فایل‌ها نیاز به ابزارهای نویسه‌خوان نوری (OCR) دارید که متن را از روی تصویر تشخیص دهند.

جمع‌بندی

استخراج تمیز متن از فایل‌های PDF همیشه یکی از دغدغه‌های کسانی بوده است که با داده‌های متنی سر و کار دارند. کپی دستی متن‌ها باعث به‌هم‌ریختگی ساختار، ایجاد فاصله‌های ناخواسته و از دست رفتن زمان می‌شود. در این مقاله یک اسکریپت کامل، استاندارد و متن‌باز پایتون را بررسی کردیم که به صورت کاملاً آفلاین فایل‌های PDF شما را اسکن کرده، کاراکترهای اضافی را پاکسازی می‌کند و خروجی پاراگراف‌بندی‌شده و استانداردی را در اختیارتان می‌گذارد. با استفاده از این ابزار ساده، فرآیند آماده‌سازی داده‌های متنی برای پژوهش، برنامه‌نویسی یا تحلیل‌های بعدی بسیار سریع‌تر و دقیق‌تر انجام خواهد شد.

پاسخی بگذارید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *