2012-10-16 22 views
8

पर पीडीएफ पृष्ठ लेबल निर्यात करें मैं आसान पार्सिंग के लिए कुछ पीडीएफ दस्तावेजों में संग्रहीत पृष्ठ-लेबल निर्यात करना चाहता हूं। मुझे पता है कि यह qpdf के साथ परिवर्तित होने के बाद पीडीएफ दस्तावेज़ में खोद सकता है, लेकिन यह ओवरकिल जैसा लगता है।कमांड लाइन

क्या कोई कमांडलाइन उपकरण नहीं है जो प्रत्येक पृष्ठ के लिए पृष्ठ लेबल मुद्रित करेगा (या अन्य मेटा-डेटा के साथ)? मुझे पता है कि पीडीएफएसपी लेबल निर्यात करेगा, लेकिन $ 300 एक विकल्प नहीं है, अधिमानतः समाधान मुक्त होना चाहिए।

उत्तर

10

लघु जवाब:
मैं किसी भी (मुक्त) उपकरण है जो प्रत्येक पृष्ठ के लिए 'आसानी से प्रिंट' कर सकते हैं पेज लेबल के बारे में पता नहीं कर रहा हूँ।

इसके अलावा, आप qpdf या समकक्ष क्षमताओं वाले टूल का उपयोग करके विस्तारित संपीड़ित ऑब्जेक्ट्स और ऑब्जेक्ट स्ट्रीम का विस्तार करने में सक्षम नहीं होंगे।

लांग जवाब:
ऐसा कोई उपकरण क्योंकि ये केवल कुछ चीजें आप सुरक्षित रूप से जब यह पेज लेबल के लिए आता है पर भरोसा कर सकते हैं।

  1. प्रत्येक पीडीएफ दस्तावेज़ एक रूट वस्तु शामिल होना चाहिए: ये निम्नलिखित हैं।
  2. वह रूट ऑब्जेक्ट /Type /Catalog का होना चाहिए।
  3. दस्तावेज़ का ट्रेलर दिखाएगा कि अप्रत्यक्ष ऑब्जेक्ट नंबर संदर्भ के बाद कुंजी /Root का उपयोग करके ऑब्जेक्ट कहां ढूंढें।
  4. यदि एक पीडीएफ दस्तावेज़ अमानक पेज लेबल, तो दस्तावेज़ जड़ वस्तु चाहिए का उपयोग करता /PageLabels नामक एक प्रविष्टि है।

यहां यह अपेक्षाकृत आसान है जहां यह अपेक्षाकृत आसान हो जाता है। चूंकि ऑब्जेक्ट /PageLabels कुंजी को संपीड़ित ऑब्जेक्ट स्ट्रीम में निहित किया जा सकता है। इसका मतलब है कि आपको उस ऑब्जेक्ट स्ट्रीम का विस्तार करना होगा।

तुम सच में ASCII के रूप में पेज लेबल के विवरण प्राप्त करने के लिए सफल रहा, तो आप पता चल जाएगा कि यह एक आसानी से parseable फ्लैट सूची (एक dictionary की तरह है) नहीं है: यह एक संख्या पेड़ है।

मैं इन जटिलताओं के विवरण में नहीं जाऊंगा, क्योंकि यह सभी संभावित विविधताओं का वर्णन करने के लिए एक बहुत लंबा लेख लेगा। आप इसे सीधे official ISO PDF-1.7 specification में सीधे पढ़ते हैं।

लेकिन बजाय मैं तुम्हें ASCII पीडीएफ कोड में एक उदाहरण देता हूँ:

213 0 obj 
    << /Type /Catalog 
    /PageLabels 
     << 
      /Nums 
       [ 
        0 <<   % start labeling from page no. 1 
         /S /r  % label with lowercase roman numbers 
        >> 
        7 <<   % start new labeling from page no. 8 
         /S /D  % label with standard decimal numbers 
        >> 
        11 <<   % start labeling page no. 12 
         /S /D  % label with decimal numbers... 
         /P (ABCD-) % ...but using label prefix 'ABCD-'... 
         /St 3  % ...followed by '3' as the start decimal. 
        >> 
        ] 
     >> 
    %%........................... 
    %%...more root object keys... 
    %%........................... 
    >> 
endobj 

ऊपर के उदाहरण पृष्ठों संख्या 1, 2, 3, ... (अंतिम) वर्गीकृत करेगी इस तरह:

i 
ii 
iii 
iv 
v 
vi 
1 
2 
3 
4 
ABCD-3 
ABCD-4 
ABCD-5 
ABCD-6 
...and so on until last page... 

जैसा कि आप देख सकते हैं, पृष्ठों को लेबल करने की पीडीएफ विधि (पेज नामों के लिए पेज नंबर मैपिंग) पूरी तरह से अंतर्ज्ञानी नहीं है।आप केवल पीडीएफ विनिर्देश का अध्ययन करके इसे समझ सकते हैं।

+0

स्थिति के इस उत्कृष्ट सारांश के लिए धन्यवाद। मैं इससे पहले के बारे में अधिक पता चला था। मुझे एहसास हुआ कि यह मेरा स्वयं का मिनी-पार्सर होगा, या किसी और ने इसे पहले लिखा था (जिसे मैं उम्मीद कर रहा था)। मुझे रूट-ऑब्जेक्ट में जानकारी से स्वयं की गणना करने में खुशी होगी, लेकिन दुर्भाग्यवश, रूट-ऑब्जेक्ट को सरल जेस्क्रिप्ट कार्यान्वयन (जिसे मैं उपयोग करना चाहता था) में हमेशा ढूंढना आसान नहीं होता। क्यूपीडीएफ आसानी से मुझे पेज-ऑब्जेक्ट्स तक पहुंच प्रदान करता है, लेकिन ट्रेलर या रूट-ऑब्जेक्ट को सीधे वापस करने के लिए कहने का कोई तरीका नहीं है, इसलिए पता लगाने का कोई तरीका नहीं है कि कैटलॉग – grovel

+1

ठीक है, और खुदाई के बाद, मेरे पास है वास्तव में एक साधारण समाधान मिला: पीडीएफटीके (जिसे मैंने पहले देखा था, लेकिन यह सुविधा खराब दस्तावेज है)। – grovel

+8

'pdftk.exe document.pdf dump_data आउटपुट report.txt' परिणामस्वरूप एक txt-file होगा जिसमें न केवल मेटा-डेटा जैसे बुकमार्क, बल्कि पृष्ठ लेबल भी सूचीबद्ध होंगे। यह इस तरह दिखेगा: 'PageLabelNewIndex: 1 PageLabelStart: 1 PageLabelPrefix: सी PageLabelNumStyle: DecimalArabicNumberals PageLabelNewIndex: 3 PageLabelStart: 1 PageLabelNumStyle: LowercaseRomanNumerals PageLabelNewIndex: 15 PageLabelStart: 1 PageLabelNumStyle: DecimalArabicNumerals' यानी सी 1, सी 2, i, ii, ..., xiii, 1,2, ... पार्स करने में आसान, बिल्कुल मुझे क्या चाहिए। @ कर्ट, वैसे भी, बहुत सराहना की! – grovel