2012-04-19 120 views
20

一個PDF我儘量拆分使用Ghostscript多頁PDF,我發現同樣的解決方案上更多的網站,甚至ghostscript.com,即:分割使用Ghostscript

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時是否正常?難道我做錯了什麼?

回答

8

您看到的是「正常」行爲:當前版本的Ghostscript的pdfwrite輸出設備不支持此功能。這也是(無可否認,不知何故隱約)記錄在Use.htm

「但請注意,每個文件功能的一個頁面可能並非所有設備的支持......」

我似乎記得,在IRC上提到的Ghostscript開發者之一,他們可能將此功能添加到pdfwrite在未來的版本中,但它似乎需要一些主要的代碼重寫,這就是爲什麼他們還沒有做到這一點...


更新:作爲戈登的評論已經暗示,作爲version 9.06(於2012年7月31日發佈),Ghostscript的現在支持命令行中的問題也引述了pdfwrite。 (Gordon必須在9.05中已經發現了非官方的支持,或者他從尚未被標記爲9.06的預發佈源編譯自己的可執行文件)。

+0

呀,我讀這條線,但我的那句「正常行爲」希望意味着「是pdfwrite那些誰可能不支持的一個此功能?」你對這個IRC的記憶對我來說沒問題,謝謝。 – zseder 2012-04-19 15:42:22

+3

對於在搜索中找到此答案的人:從9.05開始,每個文件一頁就可以使用OP的命令工作。 – Grod 2012-07-04 19:05:51

+1

@Gordon:支持'-o out_%d.pdf'語法(將多頁PDF分成單個文件每頁)在9.06中正式發佈。我在其他答案中已經暗示了這一點(f.e. * [將多頁PDF文件分割爲單頁](http://stackoverflow.com/a/12744923/359307)*)。我忘了更新這個答案。感謝提示。 – 2012-11-26 14:21:18

15

我發現這個劇本由魏瑪先生超好用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's 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上可用。

+0

令人驚歎。我沒有pdftk和psselect會失去一些pdf質量,但不是這樣。 – Wok 2013-01-04 13:01:07

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

這裏有一個簡單的Python腳本,做它:

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