3 पॉइंट द्वारा GN⁺ 2024-02-01 | 1 टिप्पणियां | WhatsApp पर शेयर करें
  • इंटरनेट पर फैला “PDF का अधिकतम आकार 381km × 381km” PDF format की अपनी सीमा नहीं है, बल्कि Adobe Acrobat 7.0 की implementation limit से निकला मान है
  • PDF 1.6 से /UserUnit के ज़रिए basic unit 1/72 inch को बड़ा किया जा सकता है, और Acrobat 7.0 का maximum value 75,000 15,000,000 inch की ऊपरी सीमा बनाता है
  • हाथ से बनाया गया PDF %PDF-1.6, object list, xref, trailer, startxref, %%EOF से बना होता है, और page size /MediaBox और /UserUnit के combination से तय होता है
  • Acrobat /MediaBox 14,400 या /UserUnit 75,000 से ऊपर होने पर भी 15,000,000 inch दिखाता है, और /UserUnit से ज़्यादा value को बिना warning के ignore कर देता है
  • macOS Preview.app /UserUnit को ignore करता है, लेकिन /MediaBox पर Acrobat जैसी upper limit नहीं लगाता, इसलिए ब्रह्मांड से भी बड़ा PDF जैसा दिखने वाली file भी बनाई जा सकती है

381km की सीमा कहाँ से आई

  • PDF document का अधिकतम आकार 381km × 381km होने का दावा लंबे समय से इंटरनेट पर बार-बार फैलता रहा है
  • यह संख्या PDF format की सीमा नहीं, बल्कि Adobe Acrobat की implementation limit से आई है
  • PDF 1.7 specification के अनुसार page size limit इस तरह समझी जाती है
    • PDF 1.6 से पहले default user space unit 1/72 inch पर fixed था
    • Acrobat 5.0 के बाद default page size का maximum 14,400 × 14,400 units, यानी 200 × 200 inch है
    • PDF 1.6 से page dictionary के /UserUnit से default user space unit का size set किया जा सकता है
    • Acrobat 7.0 /UserUnit का maximum value 75,000 support करता है, जिससे maximum page dimension 15,000,000 inch बन सकता है
  • 15,000,000 inch करीब 381km है, और “PDF version 7” वाली अभिव्यक्ति PDF version नहीं, बल्कि Adobe Acrobat 7.0 से निकली लगती है

हाथ से बनाए गए PDF की basic structure

  • PDF file में शुरुआत में version number और अंत में EOF marker होता है
    • उदाहरण: %PDF-1.6
    • end marker: %%EOF
  • version number के बाद page, text, graphics आदि दिखाने वाली object list आती है
  • xref objects की location बताने वाली cross-reference table है
    • PDF reader जाँचता है कि हर object file की शुरुआत से कितने bytes दूर है
  • trailer पूरे document की metadata रखता है
    • page count
    • encryption status
    • document root object
  • startxref xref table की start position की ओर इशारा करता है
    • PDF reader file के अंत से startxref value ढूँढकर xref table पर जाता है
  • simple PDF file बनाने पर लेख देखें तो लाल rectangle वाला PDF हाथ से बनाया जा सकता है

Objects और page definition

  • example PDF चार core objects से बना है
    • object 1: लाल rectangle draw करने वाला stream object
    • object 2: single page define करने वाला Page object
    • object 3: कई pages की जानकारी रखने वाला Pages object
    • object 4: document की main structure देने वाला Catalog object
  • Page object page contents को दूसरे object references से जोड़ता है
    • 1 0 R object number 1, generation number 0 को reference करता है
    • 3 0 R page collection यानी Pages object को reference करता है
  • हाथ से PDF लिखने पर हर बार object location बदलने पर xref table values फिर से मिलानी पड़ती हैं, इसलिए यह बहुत झंझट भरा है
  • 16 अप्रैल 2025 के update में example code के xref 0 4 को गलत value के रूप में सुधारा गया
    • असली cross-reference table में 5 entries हैं, इसलिए xref 0 5 सही है

/MediaBox और /UserUnit से page बड़ा करना

  • PDF का page size हर Page object में set किया जाता है
  • /MediaBox [0 0 300 300] width और height दोनों 300 units वाला page बनाता है
    • default unit 1/72 inch है
    • 300 units करीब 4.17 inch हैं
  • /MediaBox को 600 600 में बदलने पर Acrobat page को 8.33 x 8.33 in दिखाता है
  • Acrobat में allowed /MediaBox maximum value 14400 14400 200 × 200 inch के रूप में दिखती है
    • इस value से ऊपर जाने पर Acrobat में warning आती है
  • /UserUnit जोड़ने से default user space unit को बड़ा किया जा सकता है
    • /UserUnit 2 page के दोनों dimensions को दोगुना कर देता है
    • /MediaBox [0 0 14400 14400] और /UserUnit 2 साथ में इस्तेमाल करने पर Acrobat इसे 400.00 x 400.00 in दिखाता है
  • /UserUnit 75000 लागू करने पर Acrobat page को 15,000,000.00 × 15,000,000.00 inch दिखाता है
    • यह करीब 381km × 381km है और मूल दावे से मेल खाता है
    • example file: biggest.pdf

Acrobat और Preview के handling में अंतर

  • Acrobat /MediaBox या /UserUnit को और बड़ा set करने पर भी page size को लगातार 15,000,000 inch ही दिखाता है
  • /UserUnit value को 75000 से बड़ा set करने पर value बिना warning या error के limit कर दी जाती है
  • /UserUnit के real-world use cases ज़्यादा नहीं लगते
    • Stack Overflow answer भी कहता है कि यह value व्यापक रूप से इस्तेमाल नहीं होती
    • online examples ढूँढना मुश्किल था
  • macOS Preview.app /UserUnit support नहीं करता
    • सभी PDFs को default unit 1/72 inch में process करता है
  • इसके बजाय Preview.app, Acrobat के विपरीत, /MediaBox पर बड़ी upper limit नहीं लगाता
    • 1 के बाद 12 zeros वाली width भी accept कर लेता है
    • यह width मोटे तौर पर Earth और Moon के बीच की दूरी के स्तर की है
  • और बड़ा /MediaBox value डालने पर ऐसी file भी बनाई जा सकती है जिसे Preview लगभग 37 trillion light-years squared size के PDF के रूप में दिखाता है
    • example file: universe.pdf
    • document का अधिकतर हिस्सा खाली space है, और इसे print न करने की warning लगी है

1 टिप्पणियां

 
GN⁺ 2024-02-01
Hacker News की राय
  • PDF तकनीकी रूप से कई मायनों में भयावह है, लेकिन यह मेरे हाथ में रखी जा सकने वाली self-contained static file है—यह बात उन user-hostile dynamic/SaaS websites के मुकाबले शानदार है जो कभी भी गायब हो सकती हैं
    PDF/A असली PDF के ज़्यादा करीब है, और खतरनाक फालतू चीज़ों का बड़ा हिस्सा हटा देता है
    अगर आपको अजीब PDF शरारतें पसंद हैं, तो एक polyglot file है जो PDF/A भी है, CSV भी है और साथ ही Amiga soundtracker mod soundtrack भी: https://www.lab6.com/6

    • जब Amazon खाते से किताबें वापस खींचना शुरू करता है, तो मेरे हाथ में रखना वाला हिस्सा अहम हो जाता है
      https://www.nytimes.com/2009/07/18/technology/companies/18am...
    • PDF एक executable file है
      कई लोग JavaScript execution को लेकर तो चिंता करते हैं, लेकिन PDF files बिना ज़्यादा सवाल के इस्तेमाल करते हैं
    • हाल तक PDF/A के लिए भी यह आसानी से जाँचने का तरीका नहीं था कि कोई file सच में PDF/A है या नहीं, और अब veraPDF है, लेकिन वह काफ़ी जटिल software है
      किसी भी PDF को open source software से PDF/A में बदलना हो तो लगता है Ghostscript से PostScript में जाकर फिर वापस आने का ही तरीका है, लेकिन Ghostscript Affero license में है, जिससे कई समस्याएँ आ सकती हैं
      पुराना GPL version भी है और ज़्यादातर PDF पर चलता है, लेकिन वह करीब 15 साल पुरानी चीज़ है
      पिछली नौकरी में मुझे PDF/A से निपटना पड़ा था, और वह बिल्कुल मज़ेदार नहीं था
    • कई sources से आए लाखों PDFs parse करने वाले project में जो दर्द झेला, उसके बाद “PDF एक शानदार format है” वाली बात माफ़ करना मुश्किल है
      सिर्फ paragraphs को reconstruct करने में भी बहुत मेहनत लगी, tables parsing की तो बात ही छोड़िए
      de facto standard होने के हिसाब से इसे बेहतर होना चाहिए, और PDF manual भी सच में बहुत खराब है
    • graphics industry में काम करने के नाते, मेरे हिसाब से असली PDF PDF/X है
  • तुलना के लिए PNG का analysis करें, तो maximum width और height 2147483647, यानी 2^31 - 1 है
    pHYs chunk से specify की जा सकने वाली minimum density 1 pixel per meter है, इसलिए 2 अरब meter सूरज के diameter 1.39 gigameter से भी बड़ा है: https://en.wikipedia.org/wiki/Orders_of_magnitude_(length)#g...
    sCAL chunk ASCII floating-point इस्तेमाल करता है, इसलिए उससे उससे भी कहीं बड़े physical sizes represent किए जा सकते हैं

    • sCAL image खुद से ज़्यादा उस object के size के बारे में है जिसे image represent करती है
      1:10,000,000 scale वाला world map pHYs के हिसाब से 10m से कम चौड़ा होगा, लेकिन sCAL के हिसाब से करीब 40,000km चौड़ा होगा
  • जिस पल आप PDF की width kilometers में नापने लगते हैं, समझ आ जाता है कि आप अच्छा technical article पढ़ रहे हैं

    • microSD card बहुत छोटी जगह में करोड़ों miles समा सकता है
  • 10 साल से भी ज़्यादा पहले Game of Life के PostScript implementation से बनाए गए PDF की याद आई
    लगता है अभी भी चलता है, लेकिन macOS Preview को crash कर देता है: https://andrewcutler.net/docs/joke/life.pdf

    • Sonoma में Preview crash नहीं करता
      हालांकि animation नहीं दिखता, सिर्फ final state दिखती है, और Firefox के PDF viewer में थोड़ी animation दिखती है
      Skim भी Preview जैसा है, लेकिन grid नहीं दिखाता
    • Monterey के Mac OS में crash नहीं करता और सिर्फ static Game of Life rendering दिखाता है
  • यह लेख Umberto Eco की intellectual playfulness की याद दिलाता है
    खासकर “On the Impossibility of Drawing a Map of the Empire on a Scale of 1 to 1” याद आता है: https://s3.amazonaws.com/arena-attachments/881694/cb6119367b...

  • Preview में MediaBox में डाली जा सकने वाली value की upper limit Acrobat जैसी नहीं है, और यह 1 के बाद 12 zero वाली width भी accept कर लेता है
    document inspector में page size 352777777777.78 x 10.59cm दिखता है, और यह width लगभग पृथ्वी और चंद्रमा के बीच की दूरी जितनी है
    solar system के सभी planets को बगल-बगल रख दें तो भी वे इस document में आराम से समा जाएंगे

    • calculation करें तो वह document करीब 373km² है, इसलिए Germany से बहुत छोटा है
      आखिरकार ruler की ज़रूरत थी
    • एक 7 ज़्यादा है
      352777777777.78cm 3,527,777.7777778km है
    • अगर खाली space नहीं, बल्कि असली content से भरा जाए, तो ऐसे PDF का file size कितना होगा, यह जानने की उत्सुकता है
  • दिलचस्प experiment है, alexwlchan
    लेख में दो छोटी गलतियाँ हैं: “15,000,000,000.00 in” और “page size 15 billion inches” लिखी जगह 15 million inches सही है
    आपने कहा कि text formatting मुश्किल है, लेकिन सिर्फ “Hello World” दो शब्दों वाला PDF example बनाना हो तो font object define करें, stream में Tf से font इस्तेमाल करें, Td से position set करें और Tj से text लिख दें

    • मुझे पता था कि कहीं न कहीं numbers में गलती करूँगा, और जल्द ही ठीक करूँगा
      text example के लिए भी धन्यवाद; यह मेरे किए attempt जैसा ही दिखता है, लेकिन ज़रूर कहीं कोई गलती रही होगी
    • PDF के अंत में xref ज़रूरी है या नहीं, यह जानना चाहता हूँ
      spec के हिसाब से तो ज़रूरी लगता है
    • क्या आप zeroes गिनने में मदद कर सकते हैं कि “15,000,000,000.00 in” 15 billion क्यों नहीं बल्कि 15 million है?
    • अगर आप कहते हैं “print मत कीजिए”, तो कैसे पता चलेगा कि इसे 7 बार से ज़्यादा fold किया जा सकता है या नहीं?
  • इस मोड़ पर Steven Wright को थोड़ा बदलकर कहने का मन करता है
    “मेरे पास अमेरिका का नक्शा है। वह असली आकार का है”

    • मेरे फोन में अमेरिका का नक्शा है, लेकिन रास्ता बताने में थोड़ा कन्फ्यूजन होता है
      समझ नहीं आता कि नक्शे का ऊपर वाला हिस्सा मेरी चलने की दिशा है या उत्तर, और पुराने नक्शों में हमेशा उत्तर ऊपर होता था, लेकिन Google Maps ऐसा नहीं दिखता, इसलिए भ्रम होता है
      90 डिग्री घूमने पर नक्शा भी घूमता है, तो यह भी समझ नहीं आता कि घूमा नक्शा है या मैं
      अगर रुके हुए हों तो नक्शा कैसे जाने कि मैं किस तरफ जा रहा हूं, इसलिए दिशा जानने के लिए शायद पहले चलना पड़ता है
      स्मार्टफोन को आंखों के सामने पकड़ूं तो नक्शे का ऊपर वाला हिस्सा आसमान की तरफ होता है, और समझ नहीं आता कि नक्शे को ऊपर से नीचे देखते हुए पढ़ना चाहिए या नहीं
      फोन पर Google Maps ठीक से इस्तेमाल करने की तरकीब जानना चाहता हूं
    • Umberto Eco ने भी इसी विषय पर “On the Impossibility of Drawing a Map of the Empire on a Scale of 1 to 1” लिखा था
      https://s3.amazonaws.com/arena-attachments/881694/cb6119367b...
    • इस तरह के मजाकों में मुझे “मैं अपने पूरे शरीर पर अपना ही टैटू बनवाना चाहता हूं। बस 2 इंच बड़ा” हमेशा पसंद रहा है
      https://scomedy.com/quotes/10779
  • “प्रिंट मत कीजिए” सुनकर ऐसा लगता है जैसे यह प्रिंट बम बनने के लिए तैयार वाक्य हो
    आखिरी बार जब मैंने प्रिंटर इस्तेमाल किया था, Windows में print job cancel करना लगभग असंभव था
    वे दिन मजेदार थे जब Wi‑Fi printer खुले होते थे या उनकी security कमजोर होती थी

    • Windows में print job cancel करना अब भी असंभव है
      मुझे जो इकलौता भरोसेमंद तरीका मिला है, वह है printer बंद करना और queue से print job हटाना
      अगर printer बिल्कुल पास में न हो तो यह नहीं हो सकता, और समझ नहीं आता कि यह इतना मुश्किल क्यों है
    • थोड़ा और पक्का तरीका है printer का plug निकालना और computer को खिड़की से बाहर फेंक देना
    • “प्रिंट मत कीजिए” पढ़ते ही मेरी पहली प्रतिक्रिया थी, “आप मेरी मां नहीं हैं”
  • करीब 30 साल पहले Microsoft के summer intern interview में, interviewer ने Excel को लेकर इससे बहुत मिलता-जुलता सवाल पूछा था
    ऐसे विषय किसी व्यक्ति की जिज्ञासा और संभावित समस्याओं को तोड़कर समझने की क्षमता देखने के लिए हमेशा अच्छे होते हैं