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

FUJITSU ScanSnap S1300 FI-S1300
- 出版社/メーカー: 富士通
- 発売日: 2009/11/21
- メディア: Personal Computers
- 購入: 16人 クリック: 476回
- この商品を含むブログ (80件) を見る
で、数年ぶりに見てみたら、大学の資料とかって講義によっては結構枚数が多くて、下手すると半期分だけでちょっとした書籍くらいの枚数あるんですね。最初のうちは良かったんですけど、回数重ねてくうちにスキャン中にスキャンが失敗したり、講義の順番間違えてたことがわかったりして初めからやり直しとか出てきました。
そこで、分割してスキャンしといてから後で結合することにしたんですが、いちいちアプリケーションを起動するのがあほらしいので前回に引き続き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