Подтвердить что ты не робот

Разделение PDF с помощью Ghostscript

Я пытаюсь разделить многостраничный PDF с Ghostscript, и я нашел то же самое решение на других сайтах и ​​даже на ghostscript.com, а именно:

gs -sDEVICE=pdfwrite -dSAFER -o outname.%d.pdf input.pdf

Но мне кажется, что это не работает для меня, потому что он создает один файл, с все страницы и имя outname.1.pdf.

Когда я добавляю начальную и конечную страницы, тогда он работает нормально, но я хотите, чтобы он работал, не зная этих параметров.

В архиве gs-devel я нашел решение для этого: http://ghostscript.com/pipermail/gs-devel/2009-April/008310.html - но я чувствую, что делаю это без pdf_info.

Когда я использую другое устройство, например pswrite, но такое же параметры, он работает правильно, создавая как можно больше файлов ps, так как мой input.pdf содержит.

Это нормально при использовании pdfwrite? Я что-то делаю неправильно?

4b9b3361

Ответ 1

То, что вы видите, является "нормальным" поведением: текущая версия устройства вывода Ghostscript pdfwrite не поддерживает эту функцию. Это также (по общему признанию, каким-то неопределенным образом) документировано в Use.htm:

"Обратите внимание, однако, что одна страница для каждого файла может не поддерживаться всеми устройствами..."

Кажется, я помню, что один из разработчиков Ghostscript упоминал в IRC, что они могут добавить эту функцию в pdfwrite в какой-то будущей версии, но, похоже, для этого требуется серьезная переработка кода, поэтому они еще этого не сделали...


Обновление: Как уже упоминал комментарий Гордона, начиная с версия 9.06 (выпущена 31 июля 2012 г.), Ghostscript теперь поддерживает командную строку, указанную в вопросе также для pdfwrite. (Гордон, должно быть, обнаружил неофициальную поддержку для этого уже в 9.05, или он составил свой собственный исполняемый файл из исходных источников, которые еще не были отмечены как 9.06).

Ответ 2

Я нашел этот script wriiten мистером Веймером супер полезным:

#!/bin/sh
#
# pdfsplit [input.pdf] [first_page] [last_page] [output.pdf] 
#
# Example: pdfsplit big_file.pdf 10 20 pages_ten_to_twenty.pdf
#
# written by: Westley Weimer, Wed Mar 19 17:58:09 EDT 2008
#
# The trick: ghostscript (gs) will do PDF splitting for you, it just not
# obvious and the required defines are not listed in the manual page. 

if [ $# -lt 4 ] 
then
        echo "Usage: pdfsplit input.pdf first_page last_page output.pdf"
        exit 1
fi
yes | gs -dBATCH -sOutputFile="$4" -dFirstPage=$2 -dLastPage=$3 -sDEVICE=pdfwrite "$1" >& /dev/null

Происхождение от: http://www.cs.virginia.edu/~weimer/pdfsplit/pdfsplit

сохраните его как pdfsplit.sh, см. волшебство.

PDFSAM также мог выполнить эту работу. Доступно в Windows и Mac.

Ответ 3

 #!/bin/bash
#where $1 is the input filename

ournum=`gs -q -dNODISPLAY -c "("$1") (r) file runpdfbegin pdfpagecount = quit" 2>/dev/null`
echo "Processing $ournum pages"
counter=1
while [ $counter -le $ournum ] ; do
    newname=`echo $1 | sed -e s/\.pdf//g`
    reallynewname=$newname-$counter.pdf
    counterplus=$((counter+1))
    # make the individual pdf page
    yes | gs -dBATCH -sOutputFile="$reallynewname" -dFirstPage=$counter -dLastPage=$counter -sDEVICE=pdfwrite "$1" >& /dev/null
    counter=$counterplus
done

Ответ 4

Вот простой python script, который делает это:

#!/usr/bin/python3

import os

number_of_pages = 68
input_pdf = "abstracts_rev09.pdf"

for i in range(1, number_of_pages +1):
    os.system("gs -q -dBATCH -dNOPAUSE -sOutputFile=page{page:04d}.pdf"
              " -dFirstPage={page} -dLastPage={page}"
              " -sDEVICE=pdfwrite {input_pdf}"
              .format(page=i, input_pdf=input_pdf))