IT技術で仕事を減らしたい!

ITエンジニアのメモ+α

Python PDFファイルの操作

どうも、nippa です。

Python で PDF の操作をしてみようと思いました。目標としては、PDF ファイルにタイム スタンプトークンを付与して、電子帳簿保存法で簡単にタイムスタンプを付与することを 目指します。

今回はその最初のステップとして、Python での PDF の操作を実施してみます。

Python での PDF 操作でよく知られていた PyPDF2 は開発をもとの pypdf で開発を継続 するとなっています。 PyPDF2 プロジェクト

今回は pypdf の操作についてまとめます。

環境

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は非推奨になっているので、PdfReaderPdfWriterを利用して 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 にタイムスタンプトークンを付与する方法をテーマに記事を書きたいと思いま す。

ではでは、また次回。