¿Comando de shell para contar páginas en un PDF (que no sea pdftk)?

He estado usando esto para obtener un recuento de páginas de archivos PDF en scripts de shell en OS X:

pdftk "$i" dump_data | grep NumberOfPages | awk '{print $2}' | tr -dc '[0-9]'

(dónde $iestá el nombre del archivo PDF)

Sin embargo, hay momentos en los que eso no parece funcionar, por lo que me gustaría encontrar otra forma de hacerlo.

Respuestas (6)

Otra exiftoolsolución más:

cd /path/to/pdf/directory
exiftool -T -filename -PageCount -s3 -ext pdf .
Este es muy bueno en mi humilde opinión. (1) es simple (2) produce una salida limpia: nombre de archivo [espacios] recuento de páginas (3) puede procesar todos los archivos pdf en un directorio incluso si hay otros archivos (4) probablemente funcionará en una computadora con diferentes configuraciones regionales ( 5) es portable a otros sistemas (usándolo en Linux).
¡Gran solución! Usando esto ahora mismo para contar páginas en miles de archivos recursivamente y canalizar la salida a un archivo. El comando es entonces así:exiftool -T -r -filename -PageCount -s3 -ext pdf . > pages.txt

Debería poder usar mdlspara ver los atributos de metadatos para un PDF:

mdls -n kMDItemNumberOfPages "$i" | cut -c24-

Nota: esta solución solo funciona si el archivo de destino reside en un volumen/ubicación que se está indexando. Personalmente, tengo algunas ubicaciones excluidas, por lo que para mí esto no funcionaría en algunos casos. Dicho esto, es una mejor manera que tener que canalizarlo tantas veces como se muestra en el OP. ¡Sin embargo, vale la pena un +1! :)
Aún más fácil: mdls -raw -name kMDItemNumberOfPagesno me di cuenta de que había un atributo para esto. Todos mis archivos están en dispositivos HFS+ indexados, por lo que funcionará bien.

Puede usar la utilidad de línea de comando qpdf para contar el número de páginas en un documento PDF. qpdfse puede instalar a través de Homebrew ejecutando el siguiente comando:

brew install qpdf

Una vez instalado, para contar el número de páginas ejecutar:

qpdf --show-npages file.pdf

Ya sea que el archivo esté indexado o no, esto funciona; sin embargo, si el archivo de destino no reside en un volumen/ubicación que se está indexando, aquí hay una alternativa a la excelente solución presentada por jordanmerrick.

Acabo de probar esto usando exiftool y si es solo el recuento de páginas que desea como número, entonces esto funciona:

exiftool "$i" | awk -F": " '/Page Count/{print $2}'

mdls tampoco funcionó para mí. Hice esto en una Mac, pero espero que sea lo mismo en cualquier shell bash o similar. Con la Mac, ya tengo homebrew instalado, así que primero escribí el comando "homebrew install exiftool".

Aquí está el script que ejecuté, puede configurarlo para sus propósitos. Tenía una carpeta completa de archivos PDF y quería el recuento de páginas en cada uno de ellos, así que hice que revisara los archivos e imprimiera el nombre del archivo y la página con un , en el medio

#!/bin/sh

FILES=/path/to/files/*
for f in $FILES
do
    fn=$(basename "$f")
    printf "$fn"
    pg=$(exiftool "$f" | grep 'Page Count' | cut -c35-)
    printf ",$pg\n"
done

Otra solución es usar el pdfinfocomando del paquete xpdf . Una vez instalado, puede obtener el número de páginas junto con el nombre del archivo de la siguiente manera:

pdfinfo /path/to/file.pdf | grep -- ^Pages

O como una ejecución por lotes (con el formato de salida que solicitó):

while read pdf; do 
    pages=$(pdfinfo "$pdf" 2>&1 | grep -- ^Pages | tr -dc '[0-9]')
    printf "%s %d\n" "$pdf" "$pages"
done < <(find /path/to/pdfs -name "*.pdf" -noleaf -type f)

pdfinfoen general genera la siguiente información:

Creator:        Microsoft� Office Word 2007
Producer:       Microsoft� Office Word 2007
CreationDate:   Tue Feb 25 14:46:56 2014
ModDate:        Tue Feb 25 14:46:56 2014
Tagged:         yes
Form:           none
Pages:          3
Encrypted:      no
Page size:      595.32 x 841.92 pts (A4) (rotated 0 degrees)
File size:      102155 bytes
Optimized:      no
PDF version:    1.5

Lo uso con frecuencia para verificar si el pdf está "optimizado" o no. En caso de que no esté optimizado, puedo ejecutarlo a través de la siguiente secuencia de comandos para reducir el tamaño del archivo (a menudo de manera significativa):

#!/usr/bin/env bash
#
# makeSmall.sh 

input=$1
output=$2
 
gs \
  -o $output \
  -sDEVICE=pdfwrite \
  -dPDFSETTINGS=/screen \
  -dCompatibilityLevel=1.8 \
  -dDetectDuplicateImages=true \
  -dEmbedAllFonts=false \
  -dSubsetFonts=true \
  -dConvertCMYKImagesToRGB=true \
  -dCompressFonts=true \
  -dNOPAUSE \
  -dQUIET \
  -dBATCH \
  -c '<</AlwaysEmbed [ ]>> setdistillerparams' \
  -c '<</NeverEmbed [/Courier /Courier-Bold /Courier-Oblique /Courier-BoldOblique /Helvetica /Helvetica-Bold /Helvetica-Oblique /Helvetica-BoldOblique /Times-Roman /Times-Bold /Times-Italic /Times-BoldItalic /Symbol /ZapfDingbats /Arial]>> setdistillerparams' \
  -f $input
$ pdfinfo F.pdf | grep -- ^Optimized
Optimized:      no
$ ./makeSmall.sh F.pdf F-reduced.pdf 2>/dev/null
$ gstat --printf "%13n [size=%6s Bytes]\n" F*.pdf
F-reduced.pdf [size= 15983 Bytes]
        F.pdf [size=102155 Bytes]