はじめに
PythonでPDF処理するライブラリはいくつかありますが、今回はその中でも主要なライブラリを紹介したいと思います。
そもそもPDFとは、Portable Document Formatの略であり、デバイスに依存しないで文章やイメージを表示が崩れることなしで表示させることができる形式です。
今回紹介するものは現時点でも開発が続いているものとなります。
紹介しないものも含め、下記のようなライブラリがあります。
ライブラリ | 入力 | 出力 | 本記事で紹介 |
---|---|---|---|
IronPDF | ◯ | ◯ | ◯ |
PyPDF | ◯ | ◯ | ◯ |
PyMuPDF | ◯ | ◯ | ◯ |
pyxpdf | ◯ | × | × (2020年で開発がストップ) |
PDFMiner | ◯ | × | × (2020年で開発がストップ) |
pdfplumber | ◯ | × | ◯ |
PDFQuery | ◯ | × | × (2014年で開発がストップ) |
Tabula-Py | ◯ | × | ◯ |
Camelot | ◯ | × | ◯ |
入力はPDFデータを読み込み、テキストや画像を解析して利用できる機能を備えているかどうかを表し、出力はPDF形式でファイル出力できる機能が備わっているかどうかを表しています。
こう見ると、PDF出力の機能を有するライブラリはそこまで多くないのかなぁという印象です。
\自身のスキルを向上するには技術書で!!/
月額¥980で技術書が読み放題!!
- ビジネススキルとマインド向上したい!!
- 決断や行動を先送りにしてしまう方!!
PDF処理ライブラリ
IronPDF
PythonでPDFコンテンツを作成、編集、抽出するためのライブラリで、Iron Softwareによって開発されたライブラリです。
HTMLなど多くの形式からPDFを生成することが可能です。
また、ヘッダー/フッターの追加、署名、添付ファイル、パスワードとセキュリティの追加など、多くの機能を提供しています。
利用要件
IronPDFは基盤として.NET 6.0を利用しているので下記の要件を満たす必要があります。
Python バージョン | Python 3.7以上 |
---|---|
対応プラットフォーム | WindowsやLinuxなど数多くのプラットフォームで動作 |
.NETランタイム | 動作環境に.NET 6.0 ランタイムがインストールされていること |
インストール方法
インストール方法はシンプルでpipコマンドを利用してインストールすることができます。
% pip install ironpdf
使用例
IronPDFを利用する場合は「from ironpdf import * from」を追加します。以下はHTMLからPDFに変換するサンプルとなります。
from ironpdf import * from
renderer = ChromePdfRenderer()
pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1>")
pdf.SaveAs("output.pdf")
URLを指定して対象のページをPDF化することもできます。
from ironpdf import *
renderer = ChromePdfRenderer()
pdf = renderer.RenderUrlAsPdf("https://ironpdf.com/python/")
pdf.SaveAs("output.pdf")
利用はかなりシンプルですが、導入のハードルは他のライブラリと比べて高いかもしれません。.NET6.0ランタイムのインストールは環境によってはNGとなる可能性もありますので、もし可能な環境であれば利用をお勧めします!
PyPDF
PyPDFやPyPDF2、PyPDF4など色々なバージョンがある中、2023年現在ではPyPDFが最新のライブラリとなります。(2023年12月現在では3.17.4がリリースされている)
- PyPDF ・・・2023年12月現在でもアップデートされている
- PyPDF2・・・2022年12月31日が最終リリース
- PyPDF3・・・2022年2月4日が最終リリース
- PyPDF4・・・2018年8月8日が最終リリース
PyPDFはPDF内のテキストや画像の読み込み、PDFの分割や結合、切り取りだけでなく、メタデータの取得も可能である読み込みライブラリで一番と一定良いほど有名なライブラリです。
また、既存のPDFファイルに対してパスワードの設定やパスワード付きPDFファイルをパスワードなしとして保存することも可能です。パスワード解除はあくまで既知のものでありわからないパスワードは解除できません。
利用要件
PyPDFはBSD Licenseで利用することができ、Pythonの利用バージョンは3.6以上となります。
インストール方法
インストール方法はシンプルでpipコマンドを利用してインストールすることができます。
% pip install pypdf
使用例
以下はPyPDFを利用して、PDF内のテキストを読み込むサンプルです。
from pypdf import PdfReader
# PDFファイルの読み込み
reader = PdfReader("example.pdf")
# ページ数の取得
number_of_pages = len(reader.pages)
# ページの取得。この場合は、1ページ目を取得する。
page = reader.pages[0]
# ページからテキストを抽出
text = page.extract_text()
また、PDFの結合の例は下記のとおりです。
PdfWriter()を利用し、結合したいファイル名の配列を用意します。
それらのPDFファイルはappendして最後にwrite()を利用して結合したファイルを作成します。
from pypdf import PdfWriter
pw = PdfWriter()
pdfarr = ["sample1.pdf", "sample2.pdf"]
for item in pdfarr:
pw.append(item)
pw.write("marged-sample.pdf")
pw.close()
PDFの分割はPdfReader()とPdfWriter()を利用します。
from pypdf import PdfReader, PdfWriter
pr = PdfReader("sample1.pdf")
pw = PdfWriter()
# 1ページ目のPDFを取得する
target_page = pr.pages[0]
pw.add_page(target_page)
with open("sample1_1.pdf", "wb") as fp:
pw.write(fp)
PDFファイルの分割や結合は有償でのソフトが多いので、自分で作ってしまうのも一つの手だと思いますのでぜひお試しください。
PyMuPDF
PyMuPDFは、PyPDFと同様にページの分割や結合、テキストや画像の読み込みが可能なライブラリとなります。さらに、PDF文書を画像やテキスト形式など他の形式に変換することもできます。
このPyMuPDFはPDFだけでなく、XPSやSVG形式など複数の文書形式に対応しているだけでなく、PyPDFやpdfrwといったPDFに関するライブラリより読み込みや書き込み速度などが早い傾向があります。
利用要件
PyPDFはGNU AFFERO GPL 3.0ライセンスとなっております。
詳しくは、Artifexに問い合わせると良いかと思います。
Pythonの利用バージョンは3.8以上となっております。
インストール方法
インストール方法はシンプルでpipコマンドを利用してインストールすることができます。
% pip install PyMuPDF
使用例
シンプルにPDFからテキストを抽出します。
import fitz
# ドキュメントを開く
doc = fitz.open("example.pdf")
text = ""
# ドキュメントのページを反復処理し、UTF-8としてテキストを取得
for page in doc:
text += page.get_text()
print(text)
PDFを取得しPNGファイルなどの画像形式として出力することができます。
下記例は、PNGファイルへの出力となります。
import sys, fitz
/
doc = fitz.open("example.pdf")
# ドキュメントのページを反復処理し、png形式の画像を出力する
or page in doc:
pix = page.get_pixmap()
pix.save("page-%i.png" % page.number)
pdfplumber
pdfplumberテキストの読み込みなど行うことができるが、このライブラリの強みはPDF内の表を読み込むのに特化しています。さらに、PDFで読み込んだ表の情報をCSVに出力する機能が備わっています。
現在は2023年10月26日のリリース(v0.10.3)が最新(2023年12月現在)となっています。
利用要件
Pythonの利用バージョンは3.8以上となっております。
インストール方法
インストール方法はシンプルでpipコマンドを利用してインストールすることができます。
% pip install pdfplumber
使用例
PDFからテキストを抽出します。
import pdfplumber
with pdfplumber.open("path/to/file.pdf") as pdf:
first_page = pdf.pages[0]
print(first_page.chars[0])
PDF内の表を読み込む場合はextract_tables()を利用します。
import pdfplumber
with pdfplumber.open("path/to/file.pdf") as pdf:
for page in pdf.pages:
# テーブル情報を抜き出す
for table in page.extract_tables():
# テーブルの各行を処理する
for row in table:
# 1行目の値を取得
val = row[0]
表形式でWeb上に落ちているPDFなどを抽出したい場合は、このようなライブラリを使うと効率が良いかと思います。
Tabula-Py
Tabula-Pyは、PDFファイル内のテーブルを抽出し、それをPythonのDataFrameに変換するためのライブラリです.
元々はJavaで作られたTabulaというライブラリをPythonで使えるようにしたものです。
2023年12月現在ではバージョン2.9.0が最新でリリース日は2023年11月21日となっています。
利用要件
Pythonバージョン3.8以上が必要です。さらにJavaの実行環境が必要なのJavaをインストールする必要があります。
ライセンスはMIT Licenseとなっています。
インストール方法
まずはJava環境を整えるために、javaがインストールされているかどうか確認します。
% java -version
Javaがインストールされていない場合は、公式サイトからJavaをダウンロードしインストールしてください(JDKで良いです)
その後pipコマンドでライブラリをインストールします。
% pip install tabula-py
使用例
PDFから表を抽出してDataFrameに変換する
import tabula
# PDFファイルのパス
pdf_file = "sample.pdf"
# PDFから表を抽出し、DataFrameに変換
df = tabula.read_pdf(pdf_file)
CSVやExcelに保存したり、グラフを描画する
import tabula
import pandas as pd
import matplotlib.pyplot as plt
# PDFファイルのパス
pdf_path = "https://www.mofa.go.jp/mofaj/files/100053858.pdf"
# PDFから表を抽出
dfs = tabula.read_pdf(pdf_path, stream=True, pages=9)
# CSVに保存
dfs[0].to_csv('失業率.csv', index=None)
# Excelに保存
dfs[0].to_excel('失業率.xlsx', index=None)
# グラフ描画
target = dfs[0].iloc[0:5, 0:4].rename(columns={'Unnamed: 0': '', '日': 'Japan', '米': 'USA', '独': 'Germany'}, index={0: '2016', 1: '2017', 2: '2018', 3: '2019', 4: '2020'})
target = target.drop('', axis=1)
target.plot(marker="o")
plt.title('Unemployment Rate')
plt.xlabel('Year')
plt.ylabel('Rate')
plt.show()
pdfplumberより高性能な表処理ライブラリとなっており、Java環境を構築できる場合はこちらを利用しても良いかと思います。
Camelot
Camelotライブラリも表の情報を取得するライブラリとなります、こちらのライブラリはtabuler-pyとは異なりJava環境の構築が不要となります。
最新バージョンは2023年2月となっており、本記事の投稿月より10ヶ月前となっておりますが、頻度は低めでも開発は行われているようです。
利用要件
Pythonバージョンは3.6以上となっており、MIT Licenseとなっております。
インストール方法
インストール方法はシンプルでpipコマンドを利用してインストールすることができます。
% pip install camelot-py
使用例
PDFファイルから全てのページの表を抽出してDataFrameに変換します。
import camelot
# PDFファイルのパス
pdf_file = "sample.pdf"
# PDFから表を抽出し、DataFrameに変換
table = camelot.read_pdf(pdf_file, pages='all')
df = tables[0].df
print(df)
最後に
Pythonで利用できるPDF処理ライブラリは他にもありますが、今回紹介したライブラリでほぼ開発では事足りると思います。
プロジェクトにあったライブラリを選定して効率化してもらえると良いかと思います。