Shell-Befehl zum Zählen von Seiten in einem PDF (außer pdftk)?

Ich habe dies verwendet, um eine Seitenzahl von PDFs in Shell-Skripten in OS X zu erhalten:

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

(wo $iist der PDF-Dateiname)

Es gibt jedoch Zeiten, in denen das nicht zu funktionieren scheint, daher würde ich gerne einen anderen Weg finden, dies zu tun.

Antworten (6)

Noch eine andere exiftoolLösung:

cd /path/to/pdf/directory
exiftool -T -filename -PageCount -s3 -ext pdf .
Dieser ist IMHO sehr gut. Es (1) ist einfach (2) erzeugt eine saubere Ausgabe: Dateiname [Leerzeichen] Seitenzahl (3) kann alle PDF-Dateien in einem Verzeichnis verarbeiten, auch wenn es andere Dateien gibt (4) funktioniert wahrscheinlich auf Computern mit anderen Gebietsschemas ( 5) ist auf andere Systeme portierbar (unter Linux).
Tolle Lösung! Verwenden Sie dies jetzt, um Seiten in Tausenden von Dateien rekursiv zu zählen und die Ausgabe an eine Datei weiterzuleiten. Der Befehl lautet dann wie folgt:exiftool -T -r -filename -PageCount -s3 -ext pdf . > pages.txt

Sie sollten in der Lage sein, mdlsdie Metadatenattribute für ein PDF anzuzeigen:

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

Hinweis: Diese Lösung funktioniert nur, wenn sich die Zieldatei auf einem Volume/Speicherort befindet, der indiziert wird. Ich persönlich habe einige Orte ausgeschlossen, daher würde dies für mich in einigen Fällen nicht funktionieren. Das heißt, es ist ein besserer Weg, als es so oft leiten zu müssen, wie im OP gezeigt. Es ist jedoch +1 wert! :)
Noch einfacher: mdls -raw -name kMDItemNumberOfPagesIch wusste nicht, dass es dafür ein Attribut gibt. Alle meine Dateien befinden sich auf indizierten HFS+-Geräten, das wird also gut funktionieren.

Sie können das Befehlszeilendienstprogramm qpdf verwenden , um die Anzahl der Seiten in einem PDF-Dokument zu zählen. qpdfkann über Homebrew installiert werden, indem der folgende Befehl ausgeführt wird:

brew install qpdf

Führen Sie nach der Installation Folgendes aus, um die Anzahl der Seiten zu zählen:

qpdf --show-npages file.pdf

Unabhängig davon, ob die Datei indiziert ist oder nicht, funktioniert dies jedoch, wenn sich die Zieldatei nicht auf einem Volume/Speicherort befindet, der indiziert wird, dann ist hier eine Alternative zu der hervorragenden Lösung von jordanmerrick.

Ich habe das gerade mit exiftool ausprobiert und wenn es nur die Seitenzahl ist, die Sie als Zahl wollen, dann funktioniert das:

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

mdls hat bei mir auch nicht funktioniert. Ich habe das auf einem Mac gemacht, aber ich gehe davon aus, dass es auf jeder Bash oder ähnlichen Shell genauso sein wird. Auf dem Mac habe ich Homebrew bereits installiert, also habe ich zuerst den Befehl "homebrew install exiftool" eingegeben.

Hier ist das Skript, das ich ausgeführt habe. Sie können es für Ihre Zwecke einrichten. Ich hatte einen ganzen Ordner mit PDF-Dateien und wollte Seitenzahlen auf jeder von ihnen, also ließ ich die Dateien durchsehen und den Dateinamen und die Seite mit einem dazwischen liegenden ausdrucken

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

Eine andere Lösung ist die Verwendung des pdfinfoBefehls aus dem xpdf- Paket. Nach der Installation können Sie die Anzahl der Seiten neben dem Dateinamen wie folgt abrufen:

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

Oder als Stapellauf (mit dem gewünschten Ausgabeformat):

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)

pdfinfogibt im Allgemeinen die folgenden Informationen aus:

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

Ich verwende es häufig, um zu überprüfen, ob das PDF "optimiert" ist oder nicht. Falls es nicht optimiert ist, kann ich es dann durch das folgende Skript laufen lassen, um seine Dateigröße (oft erheblich) zu reduzieren:

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