क्या आप PDF को parse करना चाहते हैं?
(eliot-jones.com)- PDF parsing को स्पष्ट क्रम और संरचना के आधार पर काम करना चाहिए, लेकिन वास्तविक फ़ाइलें अक्सर इस विनिर्देश का पालन नहीं करतीं
- cross-reference (xref) pointer और offset खोजने में तरह-तरह की त्रुटियाँ और असंगतियाँ सामने आती हैं
- व्यवहार में PDF header से पहले मौजूद अनावश्यक डेटा या pointer और offset की गलत स्थिति के कारण कई समस्याएँ पैदा होती हैं
- ऐसे कई मामले भी मिलते हैं जहाँ PDF की xref table खुद अस्पष्ट या गलत format में होती है
- इसलिए प्रमुख viewer non-standard PDF files तक को सपोर्ट करने के लिए अतिरिक्त logic implement करते हैं
PDF parsing के लिए आदर्श तरीका
- सिद्धांत रूप में PDF parsing एक निश्चित क्रम में आगे बढ़ती है
- फ़ाइल की शुरुआत में version header comment ढूँढा जाता है
- cross-reference (xref) pointer ढूँढा जाता है
- सभी object offsets इकट्ठे किए जाते हैं
- trailer dictionary खोजकर पूरे catalog structure तक पहुँचा जाता है
PDF object का परिचय
- PDF object वह इकाई है जो number, string, dictionary जैसे कई PDF elements को समेटकर रखती है
- हर object
obj/endobjmarker के बीच मौजूद होता है - object आपस में indirect reference (उदाहरण:
16 0 R) के ज़रिए जुड़े होते हैं - फ़ाइल के भीतर object को बाँटने का तरीका लचीला है, लेकिन कुछ object types का indirect reference होना अनिवार्य है
cross-reference offset ढूँढना
- PDF में संरचना के तौर पर cross-reference (xref) table होती है, जो object locations के index की तरह काम करती है
- फ़ाइल के अंत में
startxrefsyntax के साथ एक विशेष byte position pointer के रूप में दी जाती है - यह pointer xref location बताता है, लेकिन spec और वास्तविक फ़ाइलों में अंतर होता है। उदाहरण के लिए
%EOFmarker को मूल रूप से आख़िरी पंक्ति में होना चाहिए, लेकिन वास्तविक PDF में यह अंतिम 1,024 bytes के भीतर कहीं भी हो सकता है - वास्तविक फ़ाइलों में pointer के format errors (
startrefआदि), line break की कमी, और कई तरह के variations मिलते हैं
object offset ढूँढना
- xref table में
xref, object start number, और object count क्रम से आते हैं, और हर object का offset/generation number/status (nयाf) एक पंक्ति में लिखा होता है - कई xref tables हो सकती हैं, या वे
/Preventry के ज़रिए एक-दूसरे से जुड़ी हो सकती हैं
trailer dictionary की स्थिति खोजना
startxrefmarker के ऊपर trailer dictionary मौजूद होती है, जिसमें root object खोजने के लिए ज़रूरी metadata शामिल होता है- root object के आधार पर पूरी संरचना की व्याख्या शुरू की जा सकती है
वास्तविक दुनिया: अप्रत्याशित समस्याएँ
-
PDF spec का पालन न करने वाली फ़ाइलें बहुत हैं, इसलिए सामान्य parser से उन्हें संभालना मुश्किल होता है
-
cross-reference pointer खोज में अक्सर असफल होने वाले मामले
- pointer फ़ाइल के अंत या अंतिम 1,024 bytes में नहीं है
- typo (
startrefआदि) - असामान्य format
-
3,977 वास्तविक PDF samples की जाँच में लगभग 0.5% में xref declaration errors पाए गए
PDF content 0 के अलावा किसी और offset से शुरू होता है
- अगर header से पहले बेकार डेटा (junk) हो, तो सभी byte offsets खिसक जाते हैं और
startxrefposition गड़बड़ा जाती है - header position के आधार पर offsets को फिर से calculate करना पड़ता है, और दोनों positions की जाँच करनी होती है
- यह कुल errors का लगभग 50% हिस्सा बनाता है
xref pointer xref table के बीच में इशारा करता है
- दिया गया offset कभी-कभी xref table के content के ठीक बीच में जा सकता है
- 3,977 samples में से लगभग 5 मामलों में यह पाया गया
pointer xref के पास है
- कई बार pointer बिल्कुल सही नहीं होता, लेकिन xref के ठीक पहले या बाद की whitespace या newline error जितना ही खिसका होता है
pointer सही है लेकिन xref offset गलत है
- xref table में दर्ज offsets खुद भी गलत हो सकते हैं
- कुछ object ही सही हों और बाकी में offset errors हों, ऐसा भी हो सकता है
पहला pointer सही है लेकिन पिछला offset (/Prev) असामान्य है
- PDF को modify करते समय बनने वाले
/Prevpointer में गलत मान (जैसे0) सेव होने के कई मामले मिले हैं
xref table का format असामान्य है
xrefऔर संख्या बिना line break के जुड़े हों, घोषित object से ज़्यादा entries हों, या table के बीच में garbage data शामिल हो — ऐसे कई रूप मिलते हैं- ऐसे मामलों की PdfPig आदि में issue के रूप में बड़ी संख्या में रिपोर्ट हुई है
निष्कर्ष
- specification के अनुसार PDF parsing को एक standardized क्रम में होना चाहिए, लेकिन वास्तविक फ़ाइलों में अक्सर ऐसा नहीं होता, इसलिए parsing में कई तरह की समस्याएँ आती हैं
- व्यावहारिक PDF viewers आम तौर पर non-standard PDF support को बुनियादी क्षमता के रूप में शामिल करते हैं
- इस बार का सार PDF specification (कुल 1300 pages में से 22 pages) के केवल एक हिस्से की parsing पर केंद्रित था
अभी कोई टिप्पणी नहीं है.