Tách PDF thành tài liệu với mỗi trang


7

Có một số tài nguyên trên web giải thích cách người ta có thể chia PDF thành nhiều tệp với trên trang trên mỗi tệp.

Nhưng làm thế nào bạn có thể chia chúng thành nhiều phần của mỗi trang? Tôi đã xem xét các công cụ tiêu chuẩn như pdftknhưng không thể tìm thấy một tùy chọn làm những gì tôi muốn.

Câu trả lời:


12

pdftkcó thể cắt ra một tập hợp các trang cố định một cách hiệu quả. Với một chút keo dán kịch bản, đây là điều tôi muốn:

number=$(pdfinfo -- "$file" 2> /dev/null | awk '$1 == "Pages:" {print $2}')
count=$((number / pagesper))
filename=${file%.pdf}

counter=0
while [ "$count" -gt "$counter" ]; do 
  start=$((counter*pagesper + 1));
  end=$((start + pagesper - 1));

  counterstring=$(printf %04d "$counter")
  pdftk "$file" cat "${start}-${end}" output "${filename}_${counterstring}.pdf"

  counter=$((counter + 1))
done

Điều này giả định rằng bạn có số lượng trang trên mỗi đoạn $pagespervà tên tệp của tệp PDF nguồn $file.

Nếu bạn đã acroreadcài đặt, bạn cũng có thể sử dụng

acroread -size a4 -start "$start" -end "$end" -pairs "$file" "${filename}_${counterstring}.ps"

acroreadcung cấp tùy chọn -toPostScriptcó thể hữu ích.


Xem ở đây để thực hiện đầy đủ hơn.
Raphael

9

Xem thêm pdfseparatepdfunitetừ poppler-utils. pdfseparatechia tập tin thành một tập tin trên mỗi trang, điều này giúp bạn có thể dễ dàng lắp ráp lại sau này với pdfunite, thủ công hoặc (bán) tự động.

Giống như với zsh:

autoload zargs

reunite() pdfunite "$@" file-$1-$argv[-1].pdf

pdfseparate file.pdf p%d
zargs -n 5 p<->(n) -- reunite
rm -f p<->

sẽ chia file.pdfthành file-p1-p5.pdf, file-p6-p10.pdf...


Đẹp. Nó tạo ra rất nhiều tập tin tạm thời, mặc dù.
Raphael

1
Kịch bản này hoạt động hoàn hảo với tôi, sau khi nhận ra rằng tôi nên thêm #!/bin/zshvào như một dòng đầu tiên. Và cài đặt Z Shell, tất nhiên ... Những chi tiết đó có thể không rõ ràng đối với người mới bắt đầu.
Leonardo Castro

3

Tôi thấy Python với thư viện PyPdf thuận tiện cho những công việc mà pdftk không làm thuận tiện (hoặc hoàn toàn).

#!/usr/bin/env python
import sys
from pyPdf import PdfFileWriter, PdfFileReader

# Command line parsing
if len(sys.argv) < 2 or sys.argv[1][-4:] != '.pdf':
    sys.stderr.writeln('Usage: ' + sys.argv[0] + ''' FILE.pdf N
Split FILE.pdf into chunks of N pages each.''')
    exit(3)
pages_per_file = int(sys.argv[2])

base_name = sys.argv[1][:-4] + '-'
input_pdf = PdfFileReader(open(sys.argv[1]))
output_pdf = PdfFileWriter()
num_pages = input_pdf.getNumPages()
for i in xrange(num_pages):
    output_pdf.addPage(input_pdf.getPage(i))
    if (i + 1) % pages_per_file == 0 or i + 1 == num_pages:
        output_file = open(base_name + str(i / pages_per_file + 1) + '.pdf', "wb")
        output_pdf.write(output_file)
        output_file.close()
        output_pdf = PdfFileWriter()

Tôi đang gặp phải lỗi này: Traceback (most recent call last): File "./dividePDF.py", line 23, in <module> if (i + 1) % pages_per_file == 0: flush() File "./dividePDF.py", line 18, in flush output_pdf.write(output_file) UnboundLocalError: local variable 'output_pdf' referenced before assignment
Leonardo Castro

Trước đó, tôi đã nhận được lỗi này: Traceback (most recent call last): File "./dividePDF.py", line 20, in <module> for i in xrange(input_pdf.getNumPages(input_pdf)): TypeError: getNumPages() takes exactly 1 argument (2 given) Vì vậy, tôi đã thay đổi input_pdf.getNumPages(input_pdf)đến input_pdf.getNumPages()và có những lỗi khác.
Leonardo Castro

1
@LeonardoCastro Cảm ơn báo cáo lỗi, tôi đã sửa tập lệnh.
Gilles 'SO- ngừng trở nên xấu xa'

Tôi chỉ sử dụng tập lệnh này với N = 4, nhưng "đoạn" đầu tiên luôn có 3 trang thay vì 4. Các đoạn sau đây là OK. Tôi đã thay đổi thứ tự các dòng "if (i + 1)% Pages_per_file == 0: flush ()" và "output_pdf.addPage (input_pdf.getPage (i))" và nó hoạt động đúng.
Leonardo Castro

1
@LeonardoCastro Cảm ơn một lần nữa, tôi đã sửa nó theo một cách hơi khác và sửa một lỗi khi tệp cuối cùng ngắn hơn vì số lượng trang không phải là bội số của kích thước khối.
Gilles 'SO- ngừng trở nên xấu xa'

2

Giải pháp được đăng bởi Raphael là thiếu sót: nếu bạn có số lượng trang không đồng đều, những trang cuối cùng sẽ bị bỏ qua. Đó là một giải pháp cải tiến hoạt động với số lượng trang không đồng đều. Một lần nữa, giả sử rằng bạn có số lượng trang trên mỗi đoạn $pagespervà tên tệp của tệp PDF nguồn $file.

number=$(pdfinfo -- "$file" 2> /dev/null | awk '$1 == "Pages:" {print $2}')

count=$((($number+$pagesper-1)/$pagesper))
filename=${file%.pdf}

counter=0
while [ "$count" -gt "$counter" ]; do
  start=$((counter*pagesper + 1));
  end=$((start + pagesper - 1));
  if [ $end -gt $number ]; then
    end=$number
  fi

  counterstring=$(printf %04d "$counter")
  pdftk "$file" cat "${start}-${end}" output "${filename}_${counterstring}.pdf"
  counter=$((counter + 1))
done

Bắt tốt, cảm ơn! Bạn chỉ có thể chỉnh sửa nó vào câu trả lời của tôi, mặc dù.
Raphael

Ôi xin lỗi, tôi nghĩ tôi không thể chỉnh sửa câu trả lời của người khác với uy tín thấp.
hủy liên kết

Bạn có thể, loại; chỉnh sửa sẽ được xem xét bởi các đại diện cao. Cho rằng bạn đã sửa một lỗi thực tế, tôi cho rằng họ sẽ chấp nhận nó! (Bạn cũng nhận được +2 đại diện cho các chỉnh sửa được chấp nhận.)
Raphael
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.