2013-02-05 8 views
14

Sto generando un PDF dinamicamente. Come posso controllare il numero di pagine nel PDF usando uno script di shell?Come scrivere script di shell per trovare il numero di pagine in PDF?

+1

Utilizzare solo comandi shell incorporati? O "permetti" strumenti esterni come ad es. pdftk o pdfinfo? –

+0

ok ok con qualsiasi mezzo, ma ho bisogno di numero di pagina in una variabile (script di shell) in modo che io possa passare questo parametro ad un'altra funzione. – Manish

+0

Questa domanda potrebbe essere utile: (http://stackoverflow.com/questions/36655478/bash-routine-to-return-the-page-number-of-a-given-line-number-from-text-file) – Lacobus

risposta

22

senza alcun pacchetto aggiuntivo:

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

Uso pdfinfo:

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

Utilizzando pdftk:

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

+1 su un mac l'ultimo modo, con pdftk, ha funzionato subito – gg349

+1

Ho scoperto che il metodo solo shell non è sempre affidabile. Ho file PDF con una sola pagina che ne ha diversi/contali con numeri diversi.Suggerisco di usare uno o due altri metodi. – Crami

+0

@Crami grazie per le informazioni! È possibile condividere almeno uno di questi PDF? –

5

La libreria ImageMagick fornisce uno strumento chiamato identificare quale in combinazione con il conteggio delle linee di output che si ottiene che cosa siete dopo ... ImageMagick è una facile installazione su OSX con birra.

Ecco uno script bash funzionale, in grado di catturare ad una variabile shell e discariche si torna alla schermata ...

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

E l'uscita di eseguirlo ...

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

BTW: si dovrebbe usare '$()' invece di backticks '\' \ '' vedere [BashFAQ/082] (http://mywiki.wooledge.org/BashFAQ/082) –

+2

fresco, script aggiornato come suggerito. – np0x

1

appena scavato fuori un vecchio copione (in ksh) ho trovato:

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

L'utilità pdftotext converte un file PDF in formato testo di pagina inserendo pause tra le pagine. (Aka: caratteri di avanzamento del modulo $'\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. 

Ci sono molte combinazioni per risolvere il problema, scegliere uno di loro:

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

Speranza che aiuta!

Problemi correlati