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

2017.11.26

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

Related.