Làm cách nào tôi có thể hợp nhất các tệp pdf để mỗi tệp bắt đầu trên một số trang lẻ?


11

Tôi cần hợp nhất một vài pdf đã ngủ gật và tôi muốn tất cả các pdf đầu vào bắt đầu trên một trang lẻ trong pdf đầu ra.

Ví dụ: A.pdfcó 3 trang, B.pdfcó 4 trang. Tôi không muốn đầu ra của mình có 7 trang. Những gì tôi muốn là một bản pdf 8 trang trong đó các trang 1-3 đến từ A.pdf, trang 4 trống và các trang 5-8 từ B.pdf. Tôi có thể làm cái này như thế nào?

Tôi biết về pdftk, nhưng tôi đã không tìm thấy một tùy chọn như vậy trong trang người đàn ông.

Câu trả lời:


6

Các thư viện PyPdf làm cho loại này điều dễ dàng nếu bạn sẵn sàng để viết một chút Python. Lưu mã dưới đây trong một tập lệnh có tên pdf-cat-even(hoặc bất cứ điều gì bạn thích), làm cho nó có thể thực thi được ( chmod +x pdf-cat-even) và chạy nó dưới dạng bộ lọc ( ./pdf-cat-even a.pdf b.pdf >concatenated.pdf). Bạn cần pyPdf 1.13 cho addBlankPagephương thức.

#!/usr/bin/env python
import copy, sys
from pyPdf import PdfFileWriter, PdfFileReader
output = PdfFileWriter()
output_page_number = 0
alignment = 2           # to align on even pages
for filename in sys.argv[1:]:
    # This code is executed for every file in turn
    input = PdfFileReader(open(filename))
    for p in [input.getPage(i) for i in range(0,input.getNumPages())]:
        # This code is executed for every input page in turn
        output.addPage(p)
        output_page_number += 1
    while output_page_number % alignment != 0:
        output.addBlankPage()
        output_page_number += 1
output.write(sys.stdout)

Cảm ơn, điều này đã làm việc cho tôi! Vì tôi thích đọc tên của các tệp pdf từ một tệp, tôi đã sửa đổi mã của bạn một chút và đăng nó dưới dạng một câu trả lời riêng .
Jan Warchoł ngày 1 tháng

@JanekWarchol Nếu tên tệp của bạn không chứa các ký tự đặc biệt vỏ như khoảng trắng:./pdf-cat-even $(cat list-of-file-names.txt) >concatenated.pdf
Gilles 'SO- ngừng trở thành ác'

Thật không may, chúng có chứa khoảng trắng. Nhưng dù sao cũng cảm ơn - tôi không nhận ra nó có thể được thực hiện theo cách này.
Jan Warchoł

@JanekWarchol Sau đó, bạn có thể sử dụng<list-of-file-names.txt tr '\n' '\0' | xargs -0 ./pdf-cat-even >concatenated.pdf
Gilles 'SO- ngừng trở thành ác quỷ'

3

Bước đầu tiên là tạo một tệp pdf với một trang trống. Bạn có thể thực hiện việc này một cách dễ dàng với nhiều chương trình (LibreScript / OpenOffice, inkscape, (La) TeX, scribus, v.v.)

Sau đó, chỉ cần bao gồm trang trống này khi cần thiết:

pdftk A.pdf empty_page.pdf B.pdf output result.pdf 

Nếu bạn muốn làm điều này tự động với một tập lệnh, bạn có thể sử dụng ví dụ pdftk file.pdf dump_data | grep NumberOfPages | egrep -o '[0-9]*'để trích xuất số trang.


Điều này cảm thấy như một chút của một hack. Mặc dù nếu nó hoạt động, tôi cho rằng nó hoạt động.
Sam Whited

Cách tiếp cận này gần như hiệu quả với tôi: tôi đã viết một kịch bản tạo ra một danh sách pdf với epmtyPage.pdf được thêm vào khi cần thiết, nhưng tôi không thể lấy pdftk để phân tích chính xác danh sách này nếu tên tệp chứa khoảng trắng. Tôi đã thử thay đổi giá trị IFS, sử dụng dấu ngoặc kép nhưng không có kết quả - có thể đó là lỗi của pdftk. Dù sao, câu trả lời sử dụng pypdf đã làm việc cho tôi.
Jan Warchoł ngày 1 tháng

@JanekWarchol Bạn đã sử dụng phiên bản nào của pdftk? Ít nhất pdftk 1,44 và mới hơn dường như hỗ trợ khoảng trắng trong tên tệp.
jofel

@jofel pdftk --versiontrả về pdftk 1,44. Tôi nhớ rằng những người bạn thông thái hơn của tôi đã dành ít nhất 15 phút để thử những thứ khác nhau để có được công việc này và từ bỏ.
Jan Warchoł

1

Câu trả lời của Gilles làm việc cho tôi, nhưng vì tôi phải hợp nhất nhiều tệp sẽ thuận tiện hơn nếu tôi có thể đọc tên của họ từ một tệp văn bản. Tôi đã sửa đổi một chút mã của Gilles để làm điều đó, có thể nó sẽ giúp người khác:

#!/usr/bin/env python

# requires PyPdf library, version 1.13 or above -
# its homepage is http://pybrary.net/pyPdf/
# running: ./this-script-name file-with-pdf-list > output.pdf

import copy, sys
from pyPdf import PdfFileWriter, PdfFileReader
output = PdfFileWriter()
output_page_number = 0

# every new file should start on (n*alignment + 1)th page
# (with value 2 this means starting always on an odd page)
alignment = 2

listoffiles = open(sys.argv[1]).read().splitlines()
for filename in listoffiles:
    # This code is executed for every file in turn
    input = PdfFileReader(open(filename))
    for p in [input.getPage(i) for i in range(0,input.getNumPages())]:
        # This code is executed for every input page in turn
        output.addPage(p)
        output_page_number += 1
    while output_page_number % alignment != 0:
        output.addBlankPage()
        output_page_number += 1
output.write(sys.stdout)

1

Bạn cũng có thể sử dụng LaTeX để làm điều này (mặc dù tôi biết đó có thể không phải là điều bạn muốn). Một cái gì đó như sau nên hoạt động:

\documentclass{book}

\usepackage{pdfpages}

\begin{document}

\includepdf[pages=-]{A}
\cleardoublepage % Make sure we clear to an odd page
\includepdf[pages=-]{B} % This inserts all pages. Or you can specify specific pages, a range, or `{}` for a blank page

\end{document}

Lưu ý rằng \cleardoublepagechỉ chèn một trang trống với các lớp được tạo cho in hai mặt (ví dụ: sách)

Nhiều tùy chọn và thông tin về pdfpagescó thể được tìm thấy trên CTAN .


2
Để bao gồm tất cả các trang tự động, bạn có thể sử dụng \includepdf[pages=-]{...}.
jofel

@jofel Cảm ơn, đã sửa câu hỏi. Tôi nghĩ nó cũng mặc định cho tất cả các trang, tôi chỉ cần đặt nó vào đó để cho thấy rằng có thể chọn một số trang nhất định.
Sam Whited

@jofel Ngoài ra, \cleardoublepagechỉ chèn một trang trống nếu bạn đang sử dụng một lớp được tạo cho in hai mặt. Tôi đã sử dụng bài viết không hoạt động; Tôi đã sửa nó và cập nhật câu hỏi để phản ánh điều đó.
Sam Whited

\includepdfchỉ bao gồm trang đầu tiên theo mặc định (không phải tất cả các trang). \documentclass[twoside]{article}cũng hoạt động.
jofel

Từ những gì tôi thấy tôi sẽ phải viết rõ ràng tất cả các tệp phải được đưa vào, vì vậy điều đó không đủ tốt cho tôi. Nhưng dù gì cũng cảm ơn.
Jan Warchoł ngày 1 tháng

0

Đây là mã với PyPDF2 và python3

#!/usr/bin/env python


# requires PyPdf2 library, version 1.26 or above -
# its homepage is https://pythonhosted.org/PyPDF2/index.html
# running: ./this-script-name output.pdf file-with-pdf-list

import copy, sys
from PyPDF2 import PdfFileWriter, PdfFileReader
output = PdfFileWriter()
output_page_number = 0

# every new file should start on (n*alignment + 1)th page
# (with value 2 this means starting always on an odd page)
alignment = 2

for filename in sys.argv[2:]:
    # This code is executed for every file in turn
    input = PdfFileReader(open(filename, "rb"))
    output.appendPagesFromReader(input)
    output_page_number += input.getNumPages()

    while output_page_number % alignment != 0:
        output.addBlankPage()
        output_page_number += 1

output.write(open(sys.argv[1], "wb"))
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.