2013-02-05 4 views
14

Ich erzeuge ein PDF dynamisch. Wie kann ich die Anzahl der Seiten in der PDF mit einem Shell-Skript überprüfen?Wie schreibe ich ein Shell-Skript, um die Anzahl der Seiten in PDF zu finden?

+1

Nur eingebaute Shell-Befehle verwenden? Oder "erlauben" Sie externe Tools wie z. pdftk oder pdfinfo? –

+0

ich bin ok, aber ich brauche Seitenzahl in einer Variablen (Shell-Skript), so dass ich diesen Parameter an eine andere Funktion übergeben kann. – Manish

+0

Diese Frage könnte nützlich sein: (http://stackoverflow.com/questions/36655478/bash-routine-to-return-the-page-number-of-a-iven-line-number-from-text-file) – Lacobus

Antwort

22

ohne extra Paket:

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

Mit pdfinfo:

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

Mit pdftk:

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

+1 auf einem Mac der letzte Weg, mit pdftk, arbeitete sofort – gg349

+1

Ich fand, dass die Shell-Methode ist nicht immer zuverlässig. Ich habe PDF-Dateien mit nur einer Seite mit mehreren/Zähle sie mit unterschiedlichen Zahlen.Ich schlage vor, eine andere zwei Methoden zu verwenden. – Crami

+0

@Crami danke für die Info! Ist es möglich, dass Sie mindestens eine dieser PDFs teilen? –

5

Die imagemagick-Bibliothek stellt ein Tool namens identity zur Verfügung, das Ihnen in Verbindung mit dem Zählen der Ausgabezeilen das bringt, wonach Sie suchen ... imagemagick ist eine einfache Installation auf osx mit brew.

ist hier einen funktionellen Bash-Skript, das es auf ein Shell-Variable erfaßt und gibt sie zurück auf den Bildschirm ...

#/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" 

Und die Ausgabe, die es läuft ...

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

BTW: Sie sollten '$()' anstelle von Backticks '\' \ '' sehen [BashFAQ/082] ( –

+2

) kühlen, aktualisierten Skript wie vorgeschlagen. – np0x

1

gegraben nur ein altes Skript aus (in KSH) gefunden:

#!/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

Das pdftotext Dienstprogramm wandelt eine PDF-Datei in Textformat Einfügen von Seitenumbrüchen zwischen die Seiten. (Aka: form-feed Zeichen $'\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. 

Es gibt viele Kombinationen Ihr Problem zu lösen, wählen Sie eine von ihnen:

1) pdftotext + grep:

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

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 }'

hoffe, es hilft!

Verwandte Themen