読者です 読者をやめる 読者になる 読者になる

YAMAGUCHI::weblog

土足で窓から失礼いたします。今日からあなたの息子になります。 当年とって92歳、下町の発明王、エジソンです。

Pythonで複数のPDFファイルを一つに結合する

はじめに

こんにちは、Python界の情弱です。ちょっと前にScanSnap S1300を買いました。用途はたまった資料の電子化です。

FUJITSU ScanSnap S1300 FI-S1300

FUJITSU ScanSnap S1300 FI-S1300


で、数年ぶりに見てみたら、大学の資料とかって講義によっては結構枚数が多くて、下手すると半期分だけでちょっとした書籍くらいの枚数あるんですね。最初のうちは良かったんですけど、回数重ねてくうちにスキャン中にスキャンが失敗したり、講義の順番間違えてたことがわかったりして初めからやり直しとか出てきました。
そこで、分割してスキャンしといてから後で結合することにしたんですが、いちいちアプリケーションを起動するのがあほらしいので前回に引き続きpyPdfを使ってみたら、それはそれは簡単でした。

こんな感じ

# -*- coding: utf-8 -*-

from pyPdf import PdfFileWriter, PdfFileReader

def main(output_file, input_files):
  print "concat all files:"

  output = PdfFileWriter()
  total_pages = 0

  for f in input_files:
    # expect filename as "*.pdf"
    if f[-4:] != ".pdf":
      print "skipped file: ", f
      continue
    else:
      input = PdfFileReader(file(f, 'rb'))
      num_pages = input.getNumPages()
      total_pages += num_pages
      print f, "->", str(num_pages) + "pages"
      for i in xrange(0, num_pages):
        output.addPage(input.getPage(i))

  outputStream = file(output_file, 'wb')
  output.write(outputStream)
  print total_pages, "pages written"
  outputStream.close()
  

if __name__ == '__main__':
  import argparse
  description = "concatinate input PDF files"
  parser = argparse.ArgumentParser(description=description)
  parser.add_argument("-o", "--output", default="output.pdf")
  parser.add_argument("-i", "--input", nargs='*', required=True)
  parser.add_argument("-v", "--version", action='version',
                      version="%(prog)s 1.0")
  args = vars(parser.parse_args())
  
  print "****** start concatination ******"
  main(args['output'], args['input'])

実際に使ってみる

コード見れば使い方わかると思いますが、一応こんな感じ。-iの後に分割しておいたPDFをたくさん指定すればいいだけ。出力用のファイル名を指定するときは-oオプションです。

% python concat_pdf.py -h
usage: concat_pdf.py [-h] [-o OUTPUT] -i [INPUT [INPUT ...]] [-v]

concatinate input PDF files

optional arguments:
  -h, --help            show this help message and exit
  -o OUTPUT, --output OUTPUT
  -i [INPUT [INPUT ...]], --input [INPUT [INPUT ...]]
  -v, --version         show program's version number and exit

実行してみます。

% ls
concat_pdf.py	software02.pdf	software04.pdf	software06.pdf	software08.pdf	software10.pdf
software01.pdf	software03.pdf	software05.pdf	software07.pdf	software09.pdf	software11.pdf

% python concat_pdf.py -i software*.pdf
****** start concatination ******
concat all files:
software01.pdf -> 14pages
software02.pdf -> 19pages
software03.pdf -> 31pages
software04.pdf -> 31pages
software05.pdf -> 28pages
software06.pdf -> 40pages
software07.pdf -> 24pages
software08.pdf -> 24pages
software09.pdf -> 24pages
software10.pdf -> 16pages
software11.pdf -> 24pages
275pages written

できたoutput.pdfを開いてみよう。
f:id:ymotongpoo:20110830020020p:image
やったー、出来たー。