どうも、nippa です。
Python で PDF の操作をしてみようと思いました。目標としては、PDF ファイルにタイム スタンプトークンを付与して、電子帳簿保存法で簡単にタイムスタンプを付与することを 目指します。
今回はその最初のステップとして、Python での PDF の操作を実施してみます。
Python での PDF 操作でよく知られていた PyPDF2 は開発をもとの pypdf で開発を継続 するとなっています。 PyPDF2 プロジェクト
今回は pypdf の操作についてまとめます。
環境
- macOS 13.4
- pypdf 3.16
pypdf のインストール
パッケージ管理ツールを利用して、pypdf をインストールします。
- pip
pip install pypdf
- poetry
poetry add pypdf
pypdf での PDF の操作
PDF の読み込みとページ数の取得
PDF を読み込み、メタ情報の確認を行ってみます。
from pypdf import PdfReader file = "sample.pdf" reader = pypdf.PdfFileReader(file) metadata = reader.metadata if metadata is None: raise Exception("Error: No metadata") print(metadata) creation_date = metadata.get('/CreationDate', '不明') mod_date = metadata.get('/ModDate', '不明') print(f"作成日: {creation_date}") print(f"修正日: {mod_date}") print(f"ページ数: {len(reader.pages)}")
reader.metadata
では dict 形式で、PDF のメタ情報を取得することができます。
len(reader.pages)
で PDF のページ数を取得できます。
ページ数の取得と特定ページのテキスト抽出
ページ数を指定して、そのページテキストを以下のコードで抽出します。
from pypdf import PdfReader file = "sample.pdf" reader = pypdf.PdfFileReader(file) page = reader.pages[0] text = page.extract_text() print(text)
特定ページの切り出し
特定のページを切り出す場合、以下のようなコードで切り出す事ができます。
from pypdf import PdfReader, PdfWriter file = "sample.pdf" reader = PdfReader(file) writer = PdfWriter() page_numebr = 1 writer.add_page(reader.pages[page_numebr-1]) writer.write(f"page{page_numebr}.pdf")
PDF を結合する
PdfMerger
は非推奨になっているので、PdfReader
とPdfWriter
を利用して PDF を結
合します。
PDF を読み込んで、新たな PDF に結合していく形になります。
from pypdf import PdfReader, PdfWriter pdf_files = ["sample.pdf", "sample1.pdf"] writer = PdfWriter() for file in pdf_files: reader = PdfReader(file) for page in reader.pages: writer.add_page(page) writer.write("test.pdf")
特定ページの回転させる
特定の page に対してrotate([回転角度])
を指定することで、回転させることができま
す。
from pypdf import PdfReader, PdfWriter file = "sample.pdf" reader = PdfReader(file) writer = PdfWriter() page_numebr = 1 writer.add_page(reader.pages[page_numebr-1]) writer.pages[-1].rotate(90) writer.write(f"page{page_numebr}.pdf")
PDF にパスワードを設定して暗号化する
from pypdf import PdfReader, PdfWriter password = "test" pdf_files = ["sample.pdf"] writer = PdfWriter() for file in pdf_files: reader = PdfReader(file) for page in reader.pages: writer.add_page(page) writer.encrypt(user_password=password, owner_password=None, use_128bit=True) writer.write("test.pdf")
暗号化された PDF を復号する
上記で暗号化された PDF の復号は以下の通りです。
from pypdf import PdfReader password = "test" reader = PdfReader("test_password.pdf") if reader.is_encrypted: reader.decrypt("test") for page in reader.pages: print(page)
感想
今回 pypdf を利用して、Python で PDF を扱う方法について簡単にまとめてみました。
pypdf では簡単な操作はできるもののコンテンツを修正する等は難しく、あくまでも PDF の操作だけになります。コンテンツを修正する場合は、他のライブラリの検討が必要にな ります。
次は、PDF にタイムスタンプトークンを付与する方法をテーマに記事を書きたいと思いま す。
ではでは、また次回。