各ファイルが奇数ページ番号で始まるようにPDFファイルをマージするにはどうすればよいですか?


11

いくつかのまとまったPDFをマージする必要があります。すべての入力PDFを出力PDFの奇数ページで開始します。

例:A.pdf3ページあり、B.pdf4ページあります。私はしたくない、私の出力は、7ページを持っています。私が欲しいのは、1〜3ページがA.pdf、4ページが空、5〜8ページがからの8ページのpdf B.pdfです。これどうやってするの?

pdftkについては知っていますが、manページにそのようなオプションはありませんでした。

回答:


6

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の名前を読み取ることを好むので、コードを少し変更して、別の回答として投稿しました。
JanWarchoł2013年

@JanekWarcholファイル名に空白などのシェル特殊文字が含まれていない場合:./pdf-cat-even $(cat list-of-file-names.txt) >concatenated.pdf
Gilles 'SO- stop

残念ながら、空白は含まれています。しかし、それにもかかわらず、この方法で実現できるとは思いませんでした。
JanWarchoł2013年

@JanekWarchol次に使用できます<list-of-file-names.txt tr '\n' '\0' | xargs -0 ./pdf-cat-even >concatenated.pdf
Gilles「SO-邪悪なことをやめ

3

最初のステップは、空のページを含む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]*'、ページ数を抽出するために使用できます。


これは少しハックのように感じます。うまくいけばうまくいくと思います。
Sam Whited 2013

このアプローチはほとんど私にとってはうまくいきました:必要に応じてepmtyPage.pdfを追加してPDFのリストを生成するスクリプトを書きましたが、ファイル名にスペースが含まれている場合、pdftkでこのリストを正しく解析できませんでした。私は引用符を使用してIFS値を変更しようとしましたが、役に立ちません-多分それはpdftkのせいです。とにかく、pypdfを使用した答えがうまくいきました。
JanWarchoł2013年

@JanekWarcholどのバージョンのpdftkを使用しましたか?少なくともpdftk 1.44以降では、ファイル名の空白をサポートしているようです。
jofel 2013年

@jofel pdftk --versionはpdftk 1.44を返します。私は、より上手な知人がこの仕事をするためにさまざまなことを試すために少なくとも15分間費やしてあきらめたことを覚えています。
JanWarchoł2013年

1

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)

1

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見つけることができます。


2
すべてのページを自動的に含めるには、を使用できます\includepdf[pages=-]{...}
jofel 2013

@jofelありがとう、質問を修正しました。私はそれがすべてのページにもデフォルトであると思います、私は特定のページを選択することが可能であったことを示すためにそこに単に入れました。
Sam Whited 2013

@jofelまた、\cleardoublepage両面印刷用に作成されたクラスを使用している場合にのみ空白ページを挿入します。動かない記事を使っていました。私はそれを修正し、それを反映するように質問を更新しました。
Sam Whited 2013

\includepdfデフォルトでは最初のページのみが含まれます(すべてのページではありません)。\documentclass[twoside]{article}また働きます。
jofel

私が見るところから、含める必要があるすべてのファイルを明示的に書き込む必要があるので、それでは十分ではありません。どっちにしても、ありがとうね。
JanWarchoł2013年

0

これが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"))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.