• 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/endobj marker के बीच मौजूद होता है
  • object आपस में indirect reference (उदाहरण: 16 0 R) के ज़रिए जुड़े होते हैं
  • फ़ाइल के भीतर object को बाँटने का तरीका लचीला है, लेकिन कुछ object types का indirect reference होना अनिवार्य है

cross-reference offset ढूँढना

  • PDF में संरचना के तौर पर cross-reference (xref) table होती है, जो object locations के index की तरह काम करती है
  • फ़ाइल के अंत में startxref syntax के साथ एक विशेष byte position pointer के रूप में दी जाती है
  • यह pointer xref location बताता है, लेकिन spec और वास्तविक फ़ाइलों में अंतर होता है। उदाहरण के लिए %EOF marker को मूल रूप से आख़िरी पंक्ति में होना चाहिए, लेकिन वास्तविक 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 हो सकती हैं, या वे /Prev entry के ज़रिए एक-दूसरे से जुड़ी हो सकती हैं

trailer dictionary की स्थिति खोजना

  • startxref marker के ऊपर 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 खिसक जाते हैं और startxref position गड़बड़ा जाती है
  • 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 करते समय बनने वाले /Prev pointer में गलत मान (जैसे 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 पर केंद्रित था

अभी कोई टिप्पणी नहीं है.

अभी कोई टिप्पणी नहीं है.