Python
 Computer >> コンピューター >  >> プログラミング >> Python

PythonでPDFを操作しよう!PyPDF2ライブラリの使い方を徹底解説


Pythonは多彩なライブラリを備えた非常に汎用性の高いプログラミング言語です。日常業務でよく扱うPDF(Portable Document Format)ファイルについても、Pythonにはさまざまな操作手段が用意されています。本記事では、その中でも「PyPDF2」というライブラリを使ってPDFファイルを操作する方法を解説します。

PyPDF2は純粋なPythonで実装されたPDFライブラリで、PDFページの分割・結合・切り抜き・変換が可能です。さらに、カスタムデータや表示オプション、パスワードの追加、テキストやメタデータの取得、ファイル全体のマージといった機能も備えています。

PyPDF2ひとつでPDFへの多彩な操作が行えることから、「スイスアーミーナイフ(十徳ナイフ)」のような万能ツールと呼ばれています。

1. PyPDF2のインストール

PyPDF2は標準的なPythonパッケージのため、最初にインストールが必要です。pipを使えば非常に簡単に導入できます。コマンドターミナルで以下のコマンドを実行してください。

C:\Users\rajesh>pip install pypdf2
Collecting pypdf2
Downloading https://files.pythonhosted.org/packages/b4/01/68fcc0d43daf4c6bdbc6b33cc3f77bda531c86b174cac56ef0ffdb96faab/PyPDF2-1.26.0.tar.gz (77kB)
100% |████████████████████████████████| 81kB 83kB/s
Building wheels for collected packages: pypdf2
Building wheel for pypdf2 (setup.py) ... done
Stored in directory: C:\Users\rajesh\AppData\Local\pip\Cache\wheels\53\84\19\35bc977c8bf5f0c23a8a011aa958acd4da4bbd7a229315c1b7
Successfully built pypdf2
Installing collected packages: pypdf2
Successfully installed pypdf2-1.26.0

正しくインストールされたかどうかは、Pythonシェルからimportして確認できます。

>>> import PyPDF2
>>>

エラーが発生せずにimportできれば、インストールは成功です。

2. メタデータの抽出

PDFファイルを開かずとも、作成者名、タイトル、件名、ページ数といった有用な情報を抽出できます。以下は、PyPDF2を使ってPDFのメタデータを取得するサンプルプログラムです。

from PyPDF2 import PdfFileReader

def extract_pdfMeta(path):
    with open(path, 'rb') as f:
        pdf = PdfFileReader(f)
        info = pdf.getDocumentInfo()       # ドキュメント情報を取得
        number_of_pages = pdf.getNumPages()  # 総ページ数を取得
    print("Author: \t", info.author)
    print()
    print("Creator: \t", info.creator)
    print()
    print("Producer: \t", info.producer)
    print()
    print("Subject: \t", info.subject)
    print()
    print("title: \t", info.title)
    print()
    print("Number of Pages in pdf: \t", number_of_pages)

if __name__ == '__main__':
    path = 'DeepLearning.pdf'
    extract_pdfMeta(path)

実行結果

Author: Nikhil Buduma,Nicholas Locascio

Creator: AH CSS Formatter V6.2 MR4 for Linux64 : 6.2.6.18551 (2014/09/24 15:00JST)

Producer: Antenna House PDF Output Library 6.2.609 (Linux64)

Subject: None

title: Fundamentals of Deep Learning

Number of Pages in pdf: 298

このように、PDFビューアでファイルを開かなくても、必要な情報だけをプログラムから手軽に取得できます。

3. PDFからテキストを抽出する

PyPDF2ではPDF内のテキストを抽出することも可能です(画像の抽出にも組み込みで対応しています)。ここでは例として、対象PDFの50ページ目からテキストを取り出してみましょう。

# PyPDF2をインポート
from PyPDF2 import PdfFileReader

def extract_pdfText(path):
    with open(path, 'rb') as f:
        pdf = PdfFileReader(f)
        # 50ページ目(インデックスは0始まり)を取得
        page = pdf.getPage(50)
        print(page)
        print('Page type: {}'.format(str(type(page))))
        # 50ページ目からテキストを抽出
        text = page.extractText()
        print(text)

if __name__ == '__main__':
    path = 'DeepLearning.pdf'
    extract_pdfText(path)

実行結果

{'/Annots': IndirectObject(1421, 0),
'/Contents': IndirectObject(179, 0),
'/CropBox': [0, 0, 595.3, 841.9],
'/MediaBox': [0, 0, 504, 661.5],
'/Rotate': 0,
'/Type': '/Page'
}

Page type: <class 'PyPDF2.pdf.PageObject'>
time. In inverted dropout, any neuron whose activation hasn't been silenced has its
output divided by p before the value is propagated to the next layer. ...
Summary | 37

50ページ目からテキストを取得すること自体はできていますが、出力はあまり整形されていません。残念ながら、PyPDF2のテキスト抽出機能は非常に限定的で、複雑なレイアウトや特殊なフォントを使用したPDFではうまく動作しないことがあります。より高精度なテキスト抽出が必要な場合は、pdfminer.sixやPyMuPDF(fitz)、スキャン画像にはTesseractなどのOCRエンジンの利用を検討するとよいでしょう。

4. PDFの特定ページを回転する

最後に、PDFの特定のページを回転させる方法を紹介します。rotateClockwise()メソッドに角度(90度単位)を指定してページを回転させ、新しいPDFファイルとして保存します。

>>> import PyPDF2
>>> deeplearningFile = open('DeepLearning.pdf', 'rb')
>>> pdfReader = PyPDF2.PdfFileReader(deeplearningFile)
>>> page = pdfReader.getPage(0)
>>> page.rotateClockwise(90)   # 1ページ目を時計回りに90度回転
{
'/Contents': [IndirectObject(4870, 0), IndirectObject(4871, 0), ...],
'/CropBox': [0, 0, 595.3, 841.9],
'/MediaBox': [0, 0, 504, 661.5],
'/Parent': IndirectObject(4862, 0),
'/Resources': IndirectObject(4889, 0),
'/Rotate': 90,
'/Type': '/Page'
}
>>> pdfWriter = PyPDF2.PdfFileWriter()
>>> pdfWriter.addPage(page)   # 回転したページをライターに追加
>>> resultPdfFile = open('rotatedPage.pdf', 'wb')
>>> pdfWriter.write(resultPdfFile)
>>> resultPdfFile.close()
>>> deeplearningFile.close()

実行すると、元のPDFの1ページ目が時計回りに90度回転した状態で「rotatedPage.pdf」として保存されます。

PythonでPDFを操作しよう!PyPDF2ライブラリの使い方を徹底解説

まとめ

本記事では、PyPDF2ライブラリを使ったPDF操作の基本として、メタデータの抽出テキストの抽出ページの回転の3つを紹介しました。PyPDF2を活用すれば、これら以外にも複数PDFの結合や分割など、日々のドキュメント処理を効率よく自動化できます。なお、PyPDF2の開発はすでに終了しており、現在は後継ライブラリ「pypdf」がメンテナンスされています。新規プロジェクトでは pip install pypdf による導入を検討するとよいでしょう。

  1. Pythonの内部動作を解説:インタプリタとメモリ上のオブジェクト配置の仕組み

    本記事では、Pythonの内部動作について詳しく解説し、Pythonインタプリタがさまざまなオブジェクトに対してどのようにメモリ上の領域を割り当てているのかを見ていきます。 Pythonはどのような言語か Pythonは、Javaと同じくオブジェクト指向のプログラミング言語です。インタプリタを使ってコードを実行するため、「インタプリタ型言語」と呼ばれています。Pythonはミニマリズムとモジュール性を重視する設計思想を持っており、コードの可読性を高めながら、処理時間とメモリ使用量(時間計算量・空間計算量)を最小限に抑えることを目指しています。 また、Pythonの標準的な実装は「CPytho

  2. Pythonで画像を操作する方法|Pillowライブラリの基本から実践まで

    Pythonで画像処理を行う際に、最も人気があり事実上の標準とされているライブラリがPillowです。Pillowは旧Python Image Library(PIL)の後継バージョンであり、シンプルな操作から高度な画像加工まで幅広い機能を提供しています。また、SciPyやMatplotlibなど他のPythonライブラリにおける簡易的な画像サポートの基盤としても利用されています。Pillowのインストール方法作業を始める前に、PythonとPillowが必要です。Linux環境では、Fedora、Debian/Ubuntu、ArchLinuxなどの主要ディストリビューションにおいて、以前はP