𝗦𝘁𝗼𝗽 𝗣𝗮𝗿𝘀𝗶𝗻𝗴 𝗣𝗗𝗙𝘀 𝗮𝘁 𝗥𝗲𝗻𝗱𝗲𝗿 𝗧𝗶𝗺𝗲
Most developers build PDF extraction tools the wrong way.
They try to guess document structure from the visual output. They render a page to a canvas and look at pixel positions. They use computer vision to find columns or tables.
This approach is backwards.
A PDF already contains the structure you need in the operator stream.
A table is not just a set of pixels. It is a set of path operators like moveTo, lineTo, and rectangle. Zone boundaries are encoded in the CTM stack. You do not need to reconstruct what is already there.
Stop using visual heuristics. Use the source data.
I previously tried using De Casteljau subdivision for bounding boxes. I rejected it during testing.
De Casteljau is a subdivision algorithm. You split curves until the segments are small enough. This works for rendering, but it is bad for bounding boxes.
You have to choose a tolerance. If the tolerance is too loose, the box is wrong. If it is too tight, you waste resources on recursion. There is a better way. An analytical solution using the quadratic formula is exact. It does not recurse. It does not allocate segments.
The same logic applies to zone detection.
Many tools calculate zone boundaries by finding the midpoint between two text groups. This is a visual guess. It is not structural.
If you use midpoints, sub-pixel rounding will place regions in the wrong zones.
The fix is simple. Use the top edge of the bounding box. A region belongs to a zone based on where it starts. Use the actual Y-coordinate of the top edge.
Building a real PDF extractor is harder. You must:
- Read the operator stream instead of just text content.
- Build a CTM stack to track matrix state.
- Classify subpaths geometrically.
- Emit segments with provenance.
This is more work than pixel-based guessing. But it produces deterministic results.
A pixel-based tool gives different results at 100% zoom than it does at 150% zoom. It is pattern-matching visual artifacts, not extracting structure.
If you do not parse the operator stream, you are building a demo. It might work on your test files, but it will fail on real user uploads.
The path through the operator stream is difficult. You must understand the fill and stroke state machines and the PDF specification. But you only have to learn it once. Then it works for every PDF.
از تجزیه PDF در زمان رندر کردن دست بردارید: معماری بهتر برای استخراج ساختاریافته
بسیاری از توسعهدهندگان وقتی با فایلهای PDF کار میکنند، یک اشتباه استراتژیک مرتکب میشوند: آنها سعی میکنند فایل را دقیقاً زمانی که کاربر سوالی میپرسد، تجزیه (parse) کنند. این کار در معماریهای RAG (تولید تقویتشده با بازیابی) بسیار رایج است، اما میتواند باعث کندی شدید و کاهش دقت شود.
مشکل تجزیه در زمان رندر (Render-time Parsing)
در رویکرد سنتی، جریان کار به این صورت است:
- کاربر سوال میپرسد.
- سیستم فایل PDF مرتبط را پیدا میکند.
- سیستم در همان لحظه شروع به تجزیه PDF میکند تا متن را استخراج کند.
- متن استخراج شده به LLM ارسال میشود.
این روش چندین مشکل اساسی دارد:
۱. تأخیر (Latency)
تجزیه PDF، بهویژه اگر شامل جداول یا تصاویر باشد، یک عملیات سنگین و زمانبر است. اگر کاربر منتظر بماند تا سیستم ابتدا فایل را تجزیه کند و سپس پاسخ دهد، تجربه کاربری بسیار بدی خواهد بود.
۲. عدم ثبات و دقت
تجزیه PDF در زمان اجرا (on-the-fly) اغلب غیرقابل پیشبینی است. اگر ساختار فایل کمی تغییر کند یا ابزار تجزیه در آن لحظه با خطا مواجه شود، پاسخ LLM نیز تحت تأثیر قرار میگیرد.
۳. هزینهی بالاتر
پردازشهای تکراری روی همان فایلها در هر بار پرسش، منابع پردازشی (CPU/GPU) زیادی مصرف میکند که مستقیماً به افزایش هزینهها منجر میشود.
راه حل: تجزیه در زمان ورود داده (Ingestion-time Parsing)
به جای اینکه تجزیه را به مرحله پاسخگویی موکول کنید، آن را به مرحله ورود دادهها (Ingestion) منتقل کنید.
در این معماری جدید، جریان کار به این شکل تغییر میکند:
- مرحله ورود (Ingestion): فایل PDF دریافت میشود $\rightarrow$ با استفاده از ابزارهای پیشرفته تجزیه میشود $\rightarrow$ خروجی به صورت Markdown یا JSON ذخیره میشود $\rightarrow$ دادههای ساختاریافته در پایگاه داده برداری (Vector Database) ذخیره میشوند.
- مرحله پرسش (Query): کاربر سوال میپرسد $\rightarrow$ سیستم مستقیماً دادههای ساختاریافته (Markdown) را از پایگاه داده بازیابی میکند $\rightarrow$ دادهها به LLM ارسال میشوند.
چرا این معماری بهتر است؟
ساختار حفظ میشود
تبدیل PDF به Markdown به جای متن خام (Plain Text)، ساختار جداول، تیترها و لیستها را حفظ میکند. LLMها با Markdown بسیار بهتر از متنهای بههمریخته کار میکنند.
سرعت بسیار بالاتر
در زمان پرسش، شما دیگر نیازی به پردازش سنگین PDF ندارید. شما فقط یک متن آماده (Markdown) را از پایگاه داده میخوانید که این کار بسیار سریع است.
دقت و قابلیت اطمینان
شما یک بار فایل را تجزیه میکنید و از کیفیت آن مطمئن میشوید. اگر مشکلی در تجزیه وجود داشته باشد، میتوانید آن را در مرحله Ingestion اصلاح کنید، نه زمانی که کاربر منتظر پاسخ است.
ابزارهای پیشنهادی
برای پیادهسازی این معماری، به ابزارهایی نیاز دارید که بتوانند PDF را به Markdown با کیفیت بالا تبدیل کنند. برخی از بهترین گزینهها عبارتند از:
- Marker: ابزاری بسیار سریع برای تبدیل PDF به Markdown.
- Docling: ابزار جدید و قدرتمند برای استخراج ساختاریافته.
- Unstructured.io: کتابخانهای جامع برای مدیریت انواع دادههای غیرساختاریافته.
نتیجهگیری
اگر میخواهید سیستمهای مبتنی بر LLM مقیاسپذیر، سریع و دقیق داشته باشید، باید از تجزیه PDF در زمان رندر کردن دست بردارید. با انتقال این فرآیند به مرحله ورود دادهها و استفاده از فرمتهای ساختاریافته مانند Markdown، پایداری و کیفیت پاسخهای خود را به طرز چشمگیری افزایش خواهید داد.