Pythonを使ってPDFを指定したページごとにファイル分割
大きい 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 ファイルから切り取りではなくコピーして出力するので、開始ページと終了ページがかぶっていても、問題なく動作します。