Adobe

PythonでPDFを操作する PyPDF2をインストール サンプルコード付き

PDFを分割、結合など操作したい時、フリーソフトや、Adobeのツールで作業することもあります。単純作業の繰り返しを効率化したい場合にPythonでPDFを操作する方法を紹介します。公式のドキュメントはこちらから。

PyPDF2をインストールする

pip install PyPDF2

PDFを分割する

以下の例では1ページをsample_1.pdfとして保存、2ページ目以降をsample_2.pdfとして保存する。pagesは、後述するPDFの挿入のようにrangeでも設定できる。

import PyPDF2

pdf = PyPDF2.PdfFileMerger()
pdf.append('sample.pdf', pages=PyPDF2.pagerange.PageRange(':1'))
pdf.write('sample_1.pdf')
pdf.close()

pdf = PyPDF2.PdfFileMerger()
pdf.append('sample.pdf', pages=PyPDF2.pagerange.PageRange('1:'))
pdf.write('sample_2.pdf')
pdf.close()

PDFを結合する

import PyPDF2

pdf = PyPDF2.PdfFileMerger()
pdf.append('sample_1.pdf')
pdf.append('sample_2.pdf')
pdf.write('sample.pdf')
pdf.close()

PDFを挿入する

ファイルの途中にファイルを挿入する場合は、merge() 関数を使用し、第一引数に挿入するページ番号(0始まり)を渡す。

追加する範囲を指定するには、pages で (start, stop[, step]) でそれぞれページ番号を指定するとstartからstopまでを抽出し、stepは追加しない。

import PyPDF2

pdf = PyPDF2.PdfFileMerger()
pdf.append('sample_1.pdf', pages=(0, 5))
pdf.merge(3, 'sample_2.pdf')
pdf.merge(4, 'sample_3.pdf', pages=(0, 3, 2))
pdf.write('sample.pdf')
pdf.close()

1ページ毎にPDFとして保存する

import PyPDF2

source_pdf_path = "sample.pdf"
source_pdf = PyPDF2.PdfFileReader(source_pdf_path)
pdf_page_size = source_pdf.getNumPages()

for i in range(0, pdf_page_size):
    pdf = PyPDF2.PdfFileMerger()
    pdf.append(source_pdf_path, pages=(i, i+1))
    pdf.write('output/' + str(i) + '.pdf')
    pdf.close()

トラブルシューティング

PDFの分割時に ValueError: Unresolved bookmark ” が出た

Traceback (most recent call last):
  File "test.py", line 10, in <module>
    pdf.append(source_file_path, pages=PyPDF2.pagerange.PageRange('31:'))
    ....
    site-packages\PyPDF2\merger.py", line 460, in _associate_bookmarks_to_pages
    raise ValueError("Unresolved bookmark '%s'" % (b['/Title'],))
ValueError: Unresolved bookmark 'BookMark Title'

実験中に上記のように、PDFの分割時に ValueError: Unresolved bookmark ‘BookMark Title’ が出ることがあった。PDF内のブックマークが解決できなくなるようなので、appendの引数に import_bookmarks=False を設定する。

pdf.append(source_file_path, pages=PyPDF2.pagerange.PageRange(
    '32:'), import_bookmarks=False)