🐍

【Python】PDFをいじる

2023/02/22に公開

Summary

pip install PyPDF2

バージョンは3.0.1(2023/02/22現在)

❯ python -c "import PyPDF2; print(PyPDF2.__version__)"
3.0.1

2つのPDFファイルを結合する

import PyPDF2

file1 = "hoge.pdf"
file2 = "foo.pdf"

merger = PyPDF2.PdfMerger()
merger.append(file1)
merger.append(file2)

merger.write("hogefoo.pdf")
merger.close()

ページ途中に挿入する

base.pdfの5ページ目にinsert.pdfを挿入したいとき

import PyPDF2

base_pdf = "base.pdf"
insert_pdf = "insert.pdf"

merger = PyPDF2.PdfMerger()
merger.append(base_pdf)
merger.merge(5, insert_pdf)  # 5ページ目にinsert.pdfを挿入

merger.write("inserted.pdf")
merger.close()

特定のページを削除する

merger.pagesはPDFページのList型になっているので、これをいじって並び替えたり、popで取り除くことで特定のページを削除できる

import PyPDF2

base_pdf = "base.pdf"

merger = PyPDF2.PdfMerger()
merger.append(base_pdf)
merger.pages.pop(5)  # 6ページ目を削除(`pages`は0始まりであることに注意)

merger.write("removed.pdf")
merger.close()

Reference

https://note.nkmk.me/python-pypdf2-pdf-merge-insert-split/

リンク先ではPdfFileMergerを使っているが、PyPDF2のバージョンが3.0.0以上だとDeprecationErrorが出るため、PdfMergerを使う

merger = PyPDF2.PdfFileMerger()
---------------------------------------------------------------------------
DeprecationError                          Traceback (most recent call last)
Cell In[4], line 1
----> 1 PyPDF2.PdfFileMerger()

File D:\10001176326\work_space\tutorials\py_sample\.venv\lib\site-packages\PyPDF2\_merger.py:817, in PdfFileMerger.__init__(self, *args, **kwargs)
    816 def __init__(self, *args: Any, **kwargs: Any) -> None:
--> 817     deprecation_with_replacement("PdfFileMerger", "PdfMerger", "3.0.0")
    819     if "strict" not in kwargs and len(args) < 1:
    820         kwargs["strict"] = True  # maintain the default

File D:\10001176326\work_space\tutorials\py_sample\.venv\lib\site-packages\PyPDF2\_utils.py:369, in deprecation_with_replacement(old_name, new_name, removed_in)
    363 def deprecation_with_replacement(
    364     old_name: str, new_name: str, removed_in: str = "3.0.0"
    365 ) -> None:
    366     """
    367     Raise an exception that a feature was already removed, but has a replacement.
    368     """
--> 369     deprecation(DEPR_MSG_HAPPENED.format(old_name, removed_in, new_name))

File D:\10001176326\work_space\tutorials\py_sample\.venv\lib\site-packages\PyPDF2\_utils.py:351, in deprecation(msg)
    350 def deprecation(msg: str) -> None:
--> 351     raise DeprecationError(msg)

DeprecationError: PdfFileMerger is deprecated and was removed in PyPDF2 3.0.0. Use PdfMerger instead.

Behind

冊子になっている紙データをスキャンしたあと、不要なページを消したり結合したりしたかった

Macだとプレビューから簡単にできるのに…

Discussion