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)