2013-02-05 22 views
14

मैं गतिशील रूप से एक पीडीएफ उत्पन्न कर रहा हूं। मैं शैल स्क्रिप्ट का उपयोग कर पीडीएफ में पृष्ठों की संख्या कैसे देख सकता हूं?पीडीएफ में पृष्ठों की संख्या खोजने के लिए खोल स्क्रिप्ट कैसे लिखें?

+1

केवल बिल्टिन खोल कमांड का उपयोग कर? या आप बाहरी उपकरण जैसे "अनुमति" देते हैं उदा। पीडीएफटीके या पीडीएफइन्फो? –

+0

मैं किसी भी माध्यम से ठीक हूं लेकिन मुझे एक चर (शेल स्क्रिप्ट) में पृष्ठ संख्या की आवश्यकता है ताकि मैं इस पैरामीटर को किसी अन्य फ़ंक्शन में पास कर सकूं। – Manish

+0

यह प्रश्न उपयोगी हो सकता है: (http://stackoverflow.com/questions/36655478/bash-routine-to-return-the-page-number-of-a-given-line-number-from-text-file) – Lacobus

उत्तर

22

किसी भी अतिरिक्त पैकेज के बिना:

foo=$(strings < pdffile.pdf | sed -n 's|.*/Count -\{0,1\}\([0-9]\{1,\}\).*|\1|p' | sort -rn | head -n 1) 

का उपयोग pdfinfo:

foo=$(pdfinfo pdffile.pdf | grep Pages | awk '{print $2}') 

का उपयोग pdftk:

foo=$(pdftk pdffile.pdf dump_data|grep NumberOfPages| awk '{print $2}') 
+0

+1 मैक पर आखिरी तरफ, पीडीएफटीके के साथ, सीधे – gg349

+1

पर काम किया, मैंने पाया कि खोल केवल विधि हमेशा विश्वसनीय नहीं है। मेरे पास पीडीएफ फाइलें हैं जिनमें केवल एक पृष्ठ है जिसमें कई/संख्याएं हैं जो अलग-अलग संख्याओं में बुद्धिमान हैं।मैं एक और दो तरीकों का उपयोग करने का सुझाव देता हूं। – Crami

+0

@ क्रमी जानकारी के लिए धन्यवाद! क्या यह संभव है कि आप इनमें से कम से कम एक पीडीएफ साझा करें? –

5

इमेजमैजिक लाइब्रेरी एक उपकरण प्रदान करती है जिसे पहचानने के लिए कहा जाता है जो आउटपुट की लाइनों की गिनती के संयोजन के साथ आपको प्राप्त करता है ... imagemagick ब्रू के साथ ओएसएक्स पर एक आसान इंस्टॉल है।

यहाँ एक कार्यात्मक बैश स्क्रिप्ट है कि यह एक खोल चर को कैप्चर करता है और इसे वापस स्क्रीन पर उदासीनता ...

#/bin/bash 
pdfFile=$1 
echo "Processing $pdfFile" 
numberOfPages=$(/usr/local/bin/identify "$pdfFile" 2>/dev/null | wc -l | tr -d ' ') 
#Identify gets info for each page, dump stderr to dev null 
#count the lines of output 
#trim the whitespace from the wc -l outout 
echo "The number of pages is: $numberOfPages" 

और यह चलाने का उत्पादन ... है

$ ./countPages.sh aSampleFile.pdf 
Processing aSampleFile.pdf 
The number of pages is: 2 
$ 
+1

बीटीडब्लू: आपको बैकटिक्स के बजाय '$() 'का उपयोग करना चाहिए \' \ '' [BashFAQ/082] (http://mywiki.wooledge.org/BashFAQ/082) –

+2

कूल, अपडेटेड स्क्रिप्ट सुझाए गए अनुसार। – np0x

1

बस एक पुरानी स्क्रिप्ट खोद (ksh में) मैंने पाया:

#!/usr/bin/env ksh 
# Usage: pdfcount.sh file.pdf 
# 
# Optimally, this would be a mere: 
#  pdfinfo file.pdf | grep Pages | sed 's/[^0-9]*//' 

[[ "$#" != "1" ]] && { 
    printf "ERROR: No file specified\n" 
    exit 1 
} 

numpages=0 
while read line; do 
    num=${line/*([[:print:]])+(Count)?(-)+({1,4}(\d))*([[:print:]])/\4} 
    ((num > numpages)) && numpages=$num 
done < <(strings "[email protected]" | grep "/Count") 
print $numpages 
4

pdftotext उपयोगिता के बीच पाठ स्वरूप डालने पृष्ठ विराम के लिए एक pdf फ़ाइल धर्मान्तरित पेज (उर्फ: फार्म फ़ीड पात्रों $'\f'):

1) pdftotext + ग्रेप:

$ pdftotext file.pdf - | grep -c $'\f'

NAME 
     pdftotext - Portable Document Format (PDF) to text converter. 

SYNOPSIS 
     pdftotext [options] [PDF-file [text-file]] 

DESCRIPTION 
     Pdftotext converts Portable Document Format (PDF) files to plain text. 

     Pdftotext reads the PDF file, PDF-file, and writes a text file, text-file. If text-file is 
     not specified, pdftotext converts file.pdf to file.txt. If text-file is ´-', the text is 
     sent to stdout. 

, आपकी समस्या का समाधान करने के लिए उनमें से एक का चयन कई संयोजनों रहे हैं 2) pdftotext + awk (v1):

$ pdftotext file.pdf - | awk 'BEGIN{n=0} {if(index($0,"\f")){n++}} END{print n}'

3) pdftotext + awk (v2):

$ pdftotext sample.pdf - | awk 'BEGIN{ RS="\f" } END{ print NR }'

4) pdftotext + awk (v3):

$ pdftotext sample.pdf - | awk -v RS="\f" 'END{ print NR }'

आशा है कि यह मदद करता है!