回答:
PyPdfライブラリは、あなたは、Pythonのビットを書き込むために喜んでいる場合は簡単に物事のこの種になります。以下のコードをpdf-cat-even
(または任意の)と呼ばれるスクリプトに保存し、実行可能にして(chmod +x pdf-cat-even
)、フィルターとして実行します(./pdf-cat-even a.pdf b.pdf >concatenated.pdf
)。addBlankPage
メソッドにはpyPdf≥1.13が必要です。
#!/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)
./pdf-cat-even $(cat list-of-file-names.txt) >concatenated.pdf
<list-of-file-names.txt tr '\n' '\0' | xargs -0 ./pdf-cat-even >concatenated.pdf
最初のステップは、空のページを含むPDFファイルを作成することです。これは多くのプログラム(LibreOffice / OpenOffice、inkscape、(La)TeX、scribusなど)で簡単に実行できます。
次に、この空のページを必要な場所に含めます。
pdftk A.pdf empty_page.pdf B.pdf output result.pdf
スクリプトでこれを自動的に行う場合は、たとえばpdftk file.pdf dump_data | grep NumberOfPages | egrep -o '[0-9]*'
、ページ数を抽出するために使用できます。
pdftk --version
はpdftk 1.44を返します。私は、より上手な知人がこの仕事をするためにさまざまなことを試すために少なくとも15分間費やしてあきらめたことを覚えています。
Gillesの答えは私にとってはうまくいきましたが、私は多くのファイルをマージする必要があるので、テキストファイルからファイルの名前を読み取ることができればより便利です。Gillesのコードを少し修正して、それを行うようにしました。多分それは他の誰かを助けるでしょう:
#!/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)
LaTeXを使用してこれを実行することもできます(ただし、おそらくそれが必要なものではないことは承知しています)。次のようなものが機能するはずです。
\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}
\cleardoublepage
両面印刷(本など)用に作成されたクラスを含む空白ページのみを挿入することに注意してください
CTANでより多くのオプションと情報をpdfpages
見つけることができます。
\includepdf[pages=-]{...}
。
\cleardoublepage
両面印刷用に作成されたクラスを使用している場合にのみ空白ページを挿入します。動かない記事を使っていました。私はそれを修正し、それを反映するように質問を更新しました。
\includepdf
デフォルトでは最初のページのみが含まれます(すべてのページではありません)。\documentclass[twoside]{article}
また働きます。
これがPyPDF2と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"))