2012-04-19 31 views
20

tôi cố gắng chia một file PDF nhiều trang với Ghostscript, và tôi thấy cùng một giải pháp trên các trang web hơn và thậm chí trên ghostscript.com, cụ thể là:Splitting một PDF với Ghostscript

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

Nhưng nó dường như không làm việc cho tôi, bởi vì nó tạo một tệp, với tất cả các trang và với tên outname.1.pdf.

Khi tôi thêm trang bắt đầu và trang kết thúc, thì nó hoạt động tốt, nhưng tôi muốn nó hoạt động mà không biết các thông số đó.

Trong kho lưu trữ gs-devel, tôi tìm thấy một giải pháp cho việc này: http://ghostscript.com/pipermail/gs-devel/2009-April/008310.html - nhưng tôi cảm thấy như đang làm điều đó mà không pdf_info.

Khi tôi sử dụng một thiết bị khác nhau, ví dụ pswrite, nhưng cùng thông số, nó hoạt động một cách chính xác, sản xuất như nhiều tác phẩm ps, như input.pdf tôi chứa.

Điều này có bình thường không khi sử dụng pdfwrite? Tôi có làm điều gì sai?

Trả lời

8

Điều bạn thấy là hành vi "bình thường": phiên bản hiện tại của thiết bị đầu ra pdfwrite của Ghostscript không hỗ trợ tính năng này. Đây cũng (phải thừa nhận là, bằng cách nào đó mơ hồ) ghi nhận ở Use.htm là:

"Lưu ý, tuy nhiên rằng một trang mỗi tính năng tập tin có thể không được hỗ trợ bởi tất cả các thiết bị ...."

Tôi dường như nhớ rằng một trong những nhà phát triển Ghostscript được đề cập trên IRC rằng họ có thể thêm tính năng này vào pdfwrite trong một số bản phát hành trong tương lai, nhưng có vẻ như cần phải viết lại một số mã chính, đó là lý do tại sao họ chưa thực hiện ...


Cập nhật: Theo bình luận của Gordon đã ám chỉ, tính đến version 9.06 (phát hành vào ngày 31 tháng 7 năm 2012), Ghostscript bây giờ hỗ trợ dòng lệnh như trích dẫn trong câu hỏi cũng cho pdfwrite. (Gordon phải đã phát hiện ra sự hỗ trợ không chính thức cho điều này đã có trong 9.05, hoặc ông đã biên dịch thực thi của riêng mình từ các nguồn tiền phát hành chưa được gắn thẻ là 9.06).

+0

Yeah, tôi đọc dòng này, nhưng cụm từ tôi "hành vi bình thường" muốn có nghĩa là "là pdfwrite một trong những người có thể không hỗ trợ tính năng này?" Ghi nhớ của bạn về IRC này là ổn cho tôi, Cảm ơn bạn. – zseder

+3

Đối với những người tìm kiếm câu trả lời này trong tìm kiếm: Tính đến ngày 9.05, một trang mỗi tệp hoạt động cho tôi bằng lệnh của OP. – Grod

+1

@Gordon: Hỗ trợ cú pháp '-o out_% d.pdf' (để tách nhiều trang PDF thành từng tệp riêng lẻ trên mỗi trang) trở thành chính thức trong 9,06. Tôi gợi ý điều này đã có trong các câu trả lời khác (f.e. * [Chia nhiều tập tin PDF trang thành các trang đơn] (http://stackoverflow.com/a/12744923/359307) *). Tôi quên cập nhật câu trả lời này. Cảm ơn gợi ý. –

15

Tôi thấy kịch bản này wriiten bởi ông Weimer siêu hữu ích:

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

xứ từ: http://www.cs.virginia.edu/~weimer/pdfsplit/pdfsplit

tiết kiệm nó như pdfsplit.sh, thấy sự kỳ diệu xảy ra.

PDFSAM cũng có thể thực hiện công việc. Có sẵn trên Windows và Mac.

+0

Tuyệt vời. Tôi không có pdftk và psselect sẽ mất một số chất lượng pdf, nhưng không phải điều này. – Wok

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

Dưới đây là một kịch bản python đơn giản mà làm nó:

#!/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)) 
Các vấn đề liên quan