برای توسعهدهندگانی که پایگاههای دانش یا خطوط لوله داده میسازند، PDFها اغلب آزاردهندهترین قالب برای پردازش هستند. برخلاف HTML یا JSON، PDF یک زبان نشانهگذاری نیست؛ بلکه یک ظرف برای دستورالعملهای نمایش است. این به این معنی است که «متن» در یک PDF یک جریان خطی از کاراکترها نیست، بلکه مجموعهای از گلیفهای قرار دادهشده است. درک این تفاوت برای هر توسعهدهندهای که قصد استخراج دادههای معنادار از اسناد برای موتورهای جستجو، سیستمهای RAG (تولید تقویتشده با بازیابی) یا پایگاههای داده سنتی را دارد، حیاتی است.
درک ساختار PDF
قبل از ورود به کد، درک آنچه در زیر کاپوت رخ میدهد ضروری است. یک فایل PDF از آبجکتهایی تشکیل شده است که بسیاری از آنها فشرده شدهاند. جریان محتوا حاوی دستورالعملهایی مانند «کرسر را به X,Y ببر و کاراکتر C را بکش» است. به همین دلیل است که یک استخراج ساده متن ممکن است منجر به بیمعنیها شود یا به طور کامل از محتوا غافل شود، به ویژه در چیدمانهای چندستونه یا صفحات چرخیده.
اکثر کتابخانههای تجزیه و تحلیل مدرن، فشردهسازی و تفسیر جریان را برای شما انجام میدهند، اما در نحوه بازسازی چیدمان بصری به یک جریان متن خطی با یکدیگر تفاوت دارند. این بازسازی جایی است که جادو - و همچنین پتانسیل خطا - رخ میدهد.
انتخاب ابزار مناسب
پایتون چندین کتابخانه قوی برای تجزیه و تحلیل PDF ارائه میدهد، هر کدام با نقاط قوت متمایز:
- PyPDF2 / pypdf: سبک و سریع. بهترین گزینه برای استخراج متن خام و متادیتا از اسناد ساده و تکستونه. فاقد تحلیل پیشرفته چیدمان است.
- pdfplumber: عالی برای تحلیل اسناد. از
pdfminerدر زیر کاپوت استفاده میکند اما یک API تمیزتر برای شناسایی متن بر اساس جعبههای محصور (bounding boxes) ارائه میدهد، که به شما امکان میدهد محتوا را بر اساس موقعیت فیلتر کنید. - Camelot / Tabula: تخصصی برای استخراج جداول. این ابزارها از تشخیص مبتنی بر خطوط برای بازسازی جداول به فرمتهای CSV یا DataFrame استفاده میکنند.
پیادهسازی عملی: استخراج متن و متادیتا
برای اکثر کاربردهای پایگاه دانش، شما نیاز دارید متن را استخراج کنید و در عین حال بخشی از ساختار را حفظ کنید. در زیر یک مثال با استفاده از pdfplumber برای استخراج متن صفحه به صفحه آورده شده است، که به حفظ زمینه برای تکهتکه کردن (chunking) در پایگاههای داده برداری کمک میکند.
import pdfplumber
import json
def extract_pdf_data(pdf_path: str) -> list:
"""
Extracts text and metadata from a PDF file.
Args:
pdf_path: Path to the PDF file.
Returns:
A list of dictionaries, each representing a page's content.
"""
pages_data = []
with pdfplumber.open(pdf_path) as pdf:
for i, page in enumerate(pdf.pages):
# Extract text
text = page.extract_text() or ""
# Extract tables (if any)
tables = page.extract_tables()
pages_data.append({
"page_number": i + 1,
"text": text,
"tables": tables
})
return pages_data
# Example Usage
if __name__ == "__main__":
data = extract_pdf_data("sample_document.pdf")
print(json.dumps(data[0], indent=2))
مدیریت چیدمانهای پیچیده و جداول
هنگام کار با گزارشهای مالی یا راهنماهای فنی، جداول حیاتی هستند. pdfplumber میتواند جداول را با جستجوی خطوط افقی و عمودی شناسایی کند. با این حال، جداول بدون حاشیه به هوریستیکهای پیچیدهتری نیاز دارند.
برای خطوط لوله RAG، نباید فقط متن را به هم متصل کنید. به جای آن، جداول را به صورت جداگانه پردازش کنید. هر جدول را به یک رشته Markdown یا CSV تبدیل کنید، سپس آن رشته را در کنار زمینه اطراف آن جایگذاری کنید. این تضمین میکند که وقتی کاربر میپرسد «درآمد در سهماهه سوم چقدر بود؟»، سیستم بازیابی میتواند دادههای ساختاریافته را پیدا کند، نه یک لیست درهمریخته از اعداد.
نکات بهینهسازی برای تولید
- نتایج خود را کش کنید: تجزیه و تحلیل PDF از نظر محاسباتی پرهزینه است. پس از تجزیه و تحلیل یک PDF، تکههای متن حاصل را در یک پایگاه داده یا انبار برداری همراه با هش (hash) فایل اصلی ذخیره کنید تا از تجزیه و تحلیل مجدد جلوگیری شود.
- مدیریت PDFهای رمزگذاریشده: همیشه قبل از تجزیه و تحلیل بررسی کنید که آیا PDF رمزگذاری شده است یا خیر. از خاصیت
is_encryptedدرpdfplumberبرای ایجاد خطاهای کاربرپسند استفاده کنید. - راهحل جایگزین OCR: اگر
extract_text()یک رشته خالی برگرداند، احتمالاً PDF اسکن شده است. یک موتور OCR مانند Tesseract یا یک سرویس ابری مانند AWS Textract را یکپارچه کنید تا تصاویر را به متن تبدیل کند.
نتیجهگیری
تجزیه و تحلیل PDF یک مسئله «یک اندازه برای همه» نیست. با درک ساختار زیربنایی این قالب و انتخاب ابزارهای مناسب برای انواع محتوای خاص (متن در مقابل جداول)، میتوانید خطوط لوله دادهای قوی بسازید. برای پایگاههای دانش، هدف فقط استخراج متن نیست، بلکه استخراج دادههای زمینهدار است که معنای معنایی سند اصلی را حفظ میکند. با استخراج متن خطی ساده شروع کنید و فقط زمانی که پیچیدگی دادههای شما مستلزم آن است، تشخیص جداول و OCR را اضافه کنید.