2013-07-17 14 views

Odpowiedz

51

Korzystanie z operacji cat i określanie zakresu stron.

pdftk infile.pdf cat 1-r2 output outfile.pdf 
+1

Jeśli chcesz usunąć więcej niż jedną stronę, można zmienić zakres, na przykład '1-r3' robi wszystko, ale ostatnie dwie strony. – mlissner

5

Musisz dowiedzieć się liczbę stron, a następnie użyć tego z funkcją pdftk kotów, ponieważ (AFAICT) pdftk nie pozwala, aby określić „offset od ostatniego”.

Narzędzie takie jak "pdfinfo" z Poppler (http://poppler.freedesktop.org/) może to zapewnić.

Opakowanie to w trochę bash scripting można łatwo zautomatyzować ten proces:

page_count=`pdfinfo "$INFILE" | grep 'Pages:' | awk '{print $2}'` 
page_count=$(($page_count - 1)) 
pdftk A="$INFILE" cat A1-$page_count output "$OUTFILE" 

Oczywiście Dodawanie parametrów, sprawdzanie błędów i co-nie też mogą być umieszczone we wspomnianym skrypcie:

#! /bin/sh 

### Path to the PDF Toolkit executable 'pdftk' 
pdftk='/usr/bin/pdftk' 
pdfinfo='/usr/bin/pdfinfo' 


#################################################################### 
script=`basename "$0"` 


### Script help 
if [ "$1" = "" ] || [ "$1" = "-h" ] || [ "$1" = "--help" ] || [ "$1" = "-?" ] || [ "$1" = "/?" ]; then 
    echo "$script: <input-file.PDF> [<output-file.PDF>]" 
    echo " Removes the last page from the PDF, overwriting the source" 
    echo " if no output filename is given" 
    exit 1 
fi 

### Check we have pdftk available 
if [ ! -x "$pdftk" ] || [ ! -x "$pdfinfo" ]; then 
    echo "$script: The PDF Toolkit and/or Poppler doesn't seem to be installed" 
    echo " (was looking for the [$pdftk] and [$pdfinfo] executables)" 
    exit 2 
fi 

### Check our input is OK 
INFILE="$1" 
if [ ! -r "$INFILE" ]; then 
    echo "$script: Failed to read [$INFILE]" 
    exit 2 
fi 

OUTFILE="$2" 
if [ "$OUTFILE" = "" ]; then 
    echo "$script: Will overwrite [$INFILE] if processing is ok" 
fi 

timestamp=`date +"%Y%m%d-%H%M%S"` 
tmpfile="/tmp/$script.$timestamp" 

page_count=`$pdfinfo "$INFILE" | grep 'Pages:' | awk '{print $2}'` 
page_count=$(($page_count - 1)) 

### Do the deed! 
$pdftk A="$INFILE" cat A1-$page_count output "$tmpfile" 

### Was it good for you? 
if [ $? -eq 0 ]; then 
    echo "$script: PDF Toolkit says all is good" 
    if [ "$OUTFILE" = "" ]; then 
     echo "$script: Overwriting [$INFILE]" 
     cp -f "$tmpfile" "$INFILE" 
    else 
     echo "$script: Creating [$OUTFILE]" 
     cp -f "$tmpfile" "$OUTFILE" 
    fi 
fi 


### Clean Up 
if [ -f "$tmpfile" ]; then 
    rm -f "$tmpfile" 
fi 
+0

To polecenie awk można zmodyfikować w celu zmniejszenia, nieco upraszczając skrypt: grep Pages | awk '{printf ("% d", 2 $ - 1); } "To sprawia, że ​​$ (($ page_count - 1)) jest zbędna. – Kingsley

+0

Nie ma potrzeby, aby 'pdfinfo' faktycznie,' pdftk' dostarcza liczbę stron z podkomendą 'dump_data': tworzy linię' NumberOfPages: 8' – kebs

+1

Pamiętaj też, że nie musisz znać strony liczyć, aby usunąć ostatnią stronę (przynajmniej dla wersji pdftk 1.45 i nowszych). Możesz użyć '1-r2' do wskazania pierwszej do drugiej strony. Zobacz dokumentację 'pdftk', która mówi: Możesz odwoływać się do numerów stron w odwrotnej kolejności, poprzedzając je literą r. Na przykład strona r1 jest ostatnią stroną dokumentu, r2 jest następną stroną dokumentu, a rend jest pierwszą stroną dokumentu. Możesz również użyć tego prefiksu w zakresach, na przykład r3-r1 to ostatnie trzy strony pliku PDF. – Six

3

Dzięki cpdf możesz odwoływać się do strony, określając odległość od końca dokumentu, używając tyldy i początku.

więc możemy zrobić

cpdf in.pdf 1-~2 -o out.pdf 
+0

Dziękujemy za stworzenie takiego narzędzia. Działa jak magia. Jedyne, czego bym sobie życzył: pliku wyjściowego nie określono, plik "in.pdf" ma automatycznie zmienioną nazwę (np. "In_1--2.pdf") – lanenok

+0

Chcę również powtórzyć, co za niesamowity kawałek zestawu to jest! Wyjątkowo łatwo jest przyciąć pierwszą lub kilka ostatnich stron (lub cokolwiek innego). Nawet dystrybucja oprogramowania jest perfekcyjna, co składa się z pojedynczego statycznego pliku binarnego (dla systemów Linux 32, Linux 64, OSX i Windows). Zawiera również świetną dokumentację PDF. Jestem zaskoczony, że nigdy wcześniej nie spotkałem się z oprogramowaniem, być może dlatego, że nie jest to open source (tylko darmowe do niekomercyjnego użytku z tego, co rozumiem). – Six

Powiązane problemy