Bagaimana saya bisa menggabungkan file pdf sehingga setiap file dimulai pada nomor halaman ganjil?

11

Saya perlu menggabungkan beberapa pdf tertidur, dan saya ingin semua pdf input dimulai pada halaman ganjil dalam output pdf.

Contoh: A.pdfmemiliki 3 halaman, B.pdfmemiliki 4 halaman. Saya tidak ingin output saya memiliki 7 halaman. Yang saya inginkan adalah pdf 8 halaman dari mana halaman 1-3 berasal A.pdf, halaman 4 kosong, dan halaman 5-8 berasal B.pdf. Bagaimana saya bisa melakukan ini?

Saya tahu tentang pdftk, tetapi saya tidak menemukan opsi seperti itu di halaman manual.

Jan Warchoł
sumber

Jawaban:

6

The perpustakaan PyPdf membuat semacam ini hal yang mudah jika Anda bersedia untuk menulis sedikit Python. Simpan kode di bawah ini dalam skrip bernama pdf-cat-even(atau apa pun yang Anda suka), jadikan itu executable ( chmod +x pdf-cat-even), dan jalankan sebagai filter ( ./pdf-cat-even a.pdf b.pdf >concatenated.pdf). Anda membutuhkan pyPdf ≥1.13 untuk addBlankPagemetode ini.

#!/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)
Gilles 'SANGAT berhenti menjadi jahat'
sumber
Terima kasih, ini berhasil untuk saya! Karena saya lebih suka membaca nama-nama pdf dari file, saya telah sedikit memodifikasi kode Anda dan mempostingnya sebagai jawaban terpisah .
Jan Warchoł
@JanekWarchol Jika nama file Anda tidak mengandung karakter khusus shell seperti spasi:./pdf-cat-even $(cat list-of-file-names.txt) >concatenated.pdf
Gilles 'SO- stop being evil'
Sayangnya mereka mengandung spasi putih. Tetapi terima kasih - saya tidak sadar itu bisa dilakukan dengan cara ini.
Jan Warchoł
@JanekWarchol Kemudian Anda bisa menggunakan<list-of-file-names.txt tr '\n' '\0' | xargs -0 ./pdf-cat-even >concatenated.pdf
Gilles 'SO- stop being evil'
3

Langkah pertama adalah menghasilkan file pdf dengan halaman kosong. Anda dapat melakukan ini dengan mudah dengan banyak program (LibreOffice / OpenOffice, inkscape, (La) TeX, scribus, dll.)

Kemudian sertakan halaman kosong ini di tempat yang dibutuhkan:

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

Jika Anda ingin melakukan ini secara otomatis dengan skrip, Anda dapat menggunakan mis pdftk file.pdf dump_data | grep NumberOfPages | egrep -o '[0-9]*'untuk mengekstraksi jumlah halaman.

Jofel
sumber
Ini terasa seperti retasan. Meskipun jika itu berhasil, kurasa itu berhasil.
Sam Whited
Pendekatan ini hampir berhasil bagi saya: saya menulis sebuah skrip yang menghasilkan daftar pdf dengan epmtyPage.pdf ditambahkan jika perlu, tetapi saya tidak bisa meminta pdftk untuk menguraikan daftar ini dengan benar jika nama file mengandung spasi. Saya sudah mencoba mengubah nilai IFS, menggunakan tanda kutip tetapi tidak berhasil - mungkin itu kesalahan pdftk. Bagaimanapun, jawaban menggunakan pypdf bekerja untuk saya.
Jan Warchoł
@ JanekWarchol Versi pdftk apa yang Anda gunakan? Setidaknya pdftk 1.44 dan yang lebih baru tampaknya mendukung spasi putih dalam nama file.
jofel
@ jofel pdftk --versionmengembalikan pdftk 1.44. Saya ingat bahwa teman-teman saya yang lebih pintar-bash menghabiskan setidaknya 15 menit mencoba hal-hal yang berbeda untuk mendapatkan pekerjaan ini dan menyerah.
Jan Warchoł
1

Jawaban Gilles bekerja untuk saya, tetapi karena saya harus menggabungkan banyak file, lebih mudah jika saya dapat membaca nama mereka dari file teks. Saya sedikit memodifikasi kode Gilles untuk melakukan hal itu, mungkin itu akan membantu orang lain:

#!/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)
Jan Warchoł
sumber
1

Anda juga dapat menggunakan LaTeX untuk melakukan ini (meskipun saya sadar itu mungkin bukan yang Anda inginkan). Sesuatu seperti yang berikut ini seharusnya berfungsi:

\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}

Perhatikan bahwa \cleardoublepagehanya menyisipkan halaman kosong dengan kelas yang dibuat untuk pencetakan dua sisi (mis. Buku)

Opsi dan info lebih lanjut pdfpagesdapat ditemukan di CTAN .

Sam Whited
sumber
2
Untuk memasukkan semua halaman secara otomatis, Anda dapat menggunakan \includepdf[pages=-]{...}.
jofel
@ jofel Terima kasih, perbaiki pertanyaannya. Saya pikir ini default untuk semua halaman juga, saya hanya meletakkannya di sana untuk menunjukkan bahwa mungkin untuk memilih halaman tertentu.
Sam Whited
@ jofel Juga, \cleardoublepagehanya menyisipkan halaman kosong jika Anda menggunakan kelas yang dibuat untuk pencetakan dua sisi. Saya menggunakan artikel yang tidak berfungsi; Saya memperbaikinya dan memperbarui pertanyaan untuk mencerminkan itu.
Sam Whited
\includepdfhanya menyertakan halaman pertama secara default (tidak semua halaman). \documentclass[twoside]{article}bekerja juga.
jofel
Dari apa yang saya lihat saya harus secara eksplisit menulis semua file yang harus disertakan, jadi itu tidak cukup baik untuk saya. Tapi Terimakasih.
Jan Warchoł
0

Berikut kode dengan PyPDF2 dan 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"))
Loren
sumber