Pythonを使ってPDFを指定したページごとにファイル分割

記事内に商品プロモーションを含む場合があります。
2017.11.26 23 views

大きい PDF ファイルを分割したい。

https://github.com/mstamy2/PyPDF2

pypdf2 をインストール。

py -m pip install pypdf2

python を使って PDF を分割する方法。

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

from PyPDF2 import PdfFileWriter, PdfFileReader

pdfFileObj = open("pdf_file_name.pdf", "rb")
source = PdfFileReader(pdfFileObj, strict=False)

output = PdfFileWriter()
output.addPage(source.getPage(0))
output.addPage(source.getPage(1))

outputStream = open("pdf_file_name_1.pdf", "wb")
output.write(outputStream)
outputStream.close()

これは最低限のコードで、pypdf2 の動作を確認するためのコードです。

output.addPage(source.getPage(0))
output.addPage(source.getPage(1))

このコードで元 PDF の 1 ページ目、2 ページ目を新しい PDF ファイルに追加しています。

outputStream = open("pdf_file_name_1.pdf", "wb")
output.write(outputStream)
outputStream.close()

指定したファイルに追加された元 PDF のページを出力する形になります。

json ファイルにページ割を書いて汎用的にする

設定ファイルの形式は何でもいいですが、今回はなんとなく json ファイルの読み込みも試したかったので、json にページ割の設定を書くことにしました。

python ソース

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

from PyPDF2 import PdfFileWriter, PdfFileReader
import json

f = open("splitPDF.json", 'r', encoding='utf-8')
conf = json.load(f)
f.close()

print('input file = ' + conf[0]['inputfile'])

source_pdf = open(conf[0]['inputfile'], "rb")
source_pdf_obj = PdfFileReader(source_pdf, strict=False)

for pages in conf[0]['pagenate']:
    startpage = pages['start'] - 1
    endpage = pages['end']
    output_pdf_obj = PdfFileWriter()
    for i in range(startpage, endpage):
        output_pdf_obj.addPage(source_pdf_obj.getPage(i))

    output_pdf = open(pages['outputfile'], "wb")
    output_pdf_obj.write(output_pdf)
    output_pdf.close()
    print(pages['outputfile'])

source_pdf.close()

json に書いた設定

[
	{
		"inputfile": "source.pdf",
		"pagenate":[
			{
				"outputfile": "テスト1.pdf",
				"start": 1,
				"end": 3
			},
			{
				"outputfile": "テスト2.pdf",
				"start": 4,
				"end": 7
			},
			{
				"outputfile": "テスト3.pdf",
				"start": 7,
				"end": 8
			}
		]
	}
]

※動作は相対パスを想定しています。

"inputfile": "source.pdf",

この部分に元の PDF ファイルを指定しまします。

"pagenate":[
	{
		"outputfile": "テスト1.pdf",
		"start": 1,
		"end": 3
	},

元の PDF ファイルから「start」に書いたページ番号から「end」に書いたページ番号までのページを outputfile に書いたファイル名で出力します。

動作は、元の PDF ファイルから切り取りではなくコピーして出力するので、開始ページと終了ページがかぶっていても、問題なく動作します。

関連記事