各テキスト文字、四角形、および線に関する詳細情報を PDF に表示します。さらに: テーブルの抽出と視覚的なデバッグ。
スキャンされた PDF ではなく、機械で生成された PDF で最も効果的に機能します。 pdfminer.six
に基づいて構築されています。
現在、Python 3.8、3.9、3.10、3.11 でテストされています。
この文書の翻訳は中国語で入手できます (@hbh112233abc による)。
バグを報告したり、機能をリクエストするには、問題を提出してください。特定の PDF について質問したりサポートをリクエストするには、ディスカッション フォーラムをご利用ください。
pip install pdfplumber
curl " https://raw.githubusercontent.com/jsvine/pdfplumber/stable/examples/pdfs/background-checks.pdf " > background-checks.pdf
pdfplumber < background-checks.pdf > background-checks.csv
出力は、PDF 内のすべての文字、行、四角形に関する情報を含む CSV になります。
口論 | 説明 |
---|---|
--format [format] | csv またはjson 。 json 形式はより多くの情報を返します。これには、PDF レベルおよびページ レベルのメタデータに加えて、辞書でネストされた属性が含まれます。 |
--pages [list of pages] | スペースで区切られ、 1 インデックス付けされたページまたはハイフンでつながれたページ範囲のリスト。たとえば、 1, 11-15 は、ページ 1、11、12、13、14、および 15 のデータを返します。 |
--types [list of object types to extract] | 選択肢は、 char 、 rect 、 line 、 curve 、 image 、 annot などです。デフォルトは利用可能なすべてです。 |
--laparams | pdfplumber.open(..., laparams=...) に渡す JSON 形式の文字列 (例: '{"detect_vertical": true}' )。 |
--precision [integer] | 浮動小数点数を四捨五入する小数点以下の桁数。デフォルトでは丸めなしです。 |
import pdfplumber
with pdfplumber . open ( "path/to/file.pdf" ) as pdf :
first_page = pdf . pages [ 0 ]
print ( first_page . chars [ 0 ])
PDF の操作を開始するには、 pdfplumber.open(x)
を呼び出します。ここで、 x
には次の値を指定できます。
open
メソッドは、 pdfplumber.PDF
クラスのインスタンスを返します。
パスワードで保護された PDF をロードするには、 pdfplumber.open("file.pdf", password = "test")
のように、 password
キーワード引数を渡します。
レイアウト分析パラメーターをpdfminer.six
のレイアウト エンジンに設定するには、 laparams
キーワード引数を渡します (例: pdfplumber.open("file.pdf", laparams = { "line_overlap": 0.7 })
。
Unicode テキストを事前に正規化するには、 unicode_norm=...
を渡します。ここで、 ...
は 4 つの Unicode 正規化形式 ( "NFC"
、 "NFD"
、 "NFKC"
または"NFKD"
のいずれかです。
無効なメタデータ値は、デフォルトで警告として扱われます。それが意図されていない場合は、 open
メソッドにstrict_metadata=True
を渡します。メタデータを解析できない場合、 pdfplumber.open
例外を発生させます。
pdfplumber.PDF
クラス最上位のpdfplumber.PDF
クラスは単一の PDF を表し、次の 2 つの主要なプロパティがあります。
財産 | 説明 |
---|---|
.metadata | PDF のInfo トレーラーから抽出された、メタデータのキーと値のペアの辞書。通常、「CreationDate」、「ModDate」、「Producer」などが含まれます。 |
.pages | ロードされるページごとに 1 つのpdfplumber.Page インスタンスを含むリスト。 |
...また、次のメソッドもあります。
方法 | 説明 |
---|---|
.close() | このメソッドを呼び出すと、各ページでPage.close() が呼び出され、ファイル ストリームも閉じられます (ストリームが外部である場合、つまり、すでに開かれていてpdfplumber に直接渡されている場合を除く)。 |
pdfplumber.Page
クラスpdfplumber.Page
クラスはpdfplumber
の中核です。 pdfplumber
で行うことのほとんどは、このクラスを中心に展開します。これには次の主なプロパティがあります。
財産 | 説明 |
---|---|
.page_number | 連続するページ番号。最初のページは1 番目のページは2 などで始まります。 |
.width | ページの幅。 |
.height | ページの高さ。 |
.objects / .chars / .lines / .rects / .curves / .images | これらのプロパティはそれぞれリストであり、各リストには、ページに埋め込まれたオブジェクトごとに 1 つの辞書が含まれています。詳細については、以下の「オブジェクト」を参照してください。 |
...そしてこれらの主なメソッド:
方法 | 説明 |
---|---|
.crop(bounding_box, relative=False, strict=True) | 境界ボックスにトリミングされたページのバージョンを返します。これは、 (x0, top, x1, bottom) の値を持つ 4 タプルとして表現される必要があります。切り取られたページでは、少なくとも部分的に境界ボックス内に収まるオブジェクトが保持されます。オブジェクトが部分的にのみボックス内に収まる場合、その寸法は境界ボックスに合わせてスライスされます。 relative=True の場合、境界ボックスは絶対位置ではなく、ページの境界ボックスの左上からのオフセットとして計算されます。 (視覚的な例と説明については、問題 #245 を参照してください。) strict=True (デフォルト) の場合、クロップの境界ボックスは完全にページの境界ボックス内に収まる必要があります。 |
.within_bbox(bounding_box, relative=False, strict=True) | .crop に似ていますが、境界ボックス内に完全に収まるオブジェクトのみを保持します。 |
.outside_bbox(bounding_box, relative=False, strict=True) | .crop および.within_bbox に似ていますが、境界ボックスの完全に外側にあるオブジェクトのみを保持します。 |
.filter(test_function) | test_function(obj) True を返す.objects のみを含むページのバージョンを返します。 |
...また、次のメソッドもあります。
方法 | 説明 |
---|---|
.close() | デフォルトでは、 Page オブジェクトはレイアウトとオブジェクトの情報をキャッシュして、再処理する必要がないようにします。ただし、大きな PDF を解析する場合、これらのキャッシュされたプロパティは大量のメモリを必要とする可能性があります。このメソッドを使用すると、キャッシュをフラッシュしてメモリを解放できます。 |
追加のメソッドについては、以下のセクションで説明します。
pdfplumber.PDF
およびpdfplumber.Page
の各インスタンスは、 pdfminer.six
PDF 解析から派生したいくつかのタイプの PDF オブジェクトへのアクセスを提供します。次のプロパティはそれぞれ、一致するオブジェクトの Python リストを返します。
.chars
、それぞれが 1 つのテキスト文字を表します。.lines
、それぞれが単一の 1 次元の直線を表します。.rects
。それぞれが 1 つの 2 次元の長方形を表します。.curves
。それぞれは、 pdfminer.six
線または長方形として認識しない一連の接続された点を表します。.images
、それぞれがイメージを表します。.annots
、それぞれが単一の PDF 注釈を表します (詳細については、公式 PDF 仕様のセクション 8.4 を参照).hyperlinks
。それぞれがサブタイプLink
の単一の PDF 注釈を表し、 URI
アクション属性を持ちます。各オブジェクトは、次のプロパティを持つ単純な Python dict
として表されます。
char
プロパティ財産 | 説明 |
---|---|
page_number | この文字が見つかったページ番号。 |
text | たとえば、「z」、「Z」、「」などです。 |
fontname | 文字のフォントフェイスの名前。 |
size | フォントサイズ。 |
adv | テキスト幅 * フォント サイズ * 倍率に等しい。 |
upright | キャラクターが直立しているかどうか。 |
height | キャラクターの身長。 |
width | 文字の幅。 |
x0 | ページの左側から文字の左側までの距離。 |
x1 | ページの左側から文字の右側までの距離。 |
y0 | ページの下部から文字の下部までの距離。 |
y1 | ページの下部から文字の上部までの距離。 |
top | ページの上部から文字の上部までの距離。 |
bottom | ページの上部から文字の下部までの距離。 |
doctop | 文書の上部から文字の上部までの距離。 |
matrix | このキャラクターの「現在の変換行列」。 (詳細は下記をご覧ください。) |
mcid | この文字のマークされたコンテンツ セクション ID (存在する場合) (それ以外の場合はNone )。実験的な属性。 |
tag | この文字のマークされたコンテンツ セクション タグ (存在する場合) (それ以外の場合はNone )。実験的な属性。 |
ncs | TKTK |
stroking_pattern | TKTK |
non_stroking_pattern | TKTK |
stroking_color | 文字の輪郭 (つまり、ストローク) の色。詳細については、docs/colors.md を参照してください。 |
non_stroking_color | キャラクターのインテリアカラー。詳細については、docs/colors.md を参照してください。 |
object_type | 「チャー」 |
注: PDF リファレンス (第 6 版) のセクション 4.2.2 で説明されているように、キャラクターのmatrix
プロパティは「現在の変換行列」を表します。マトリックスは、キャラクターのスケール、傾き、および位置の変換を制御します。回転はスケールとスキューの組み合わせですが、ほとんどの場合、X 軸のスキューと等しいと考えることができます。 pdfplumber.ctm
サブモジュールは、これらの計算を支援するクラスCTM
を定義します。例えば:
from pdfplumber . ctm import CTM
my_char = pdf . pages [ 0 ]. chars [ 3 ]
my_char_ctm = CTM ( * my_char [ "matrix" ])
my_char_rotation = my_char_ctm . skew_x
line
プロパティ財産 | 説明 |
---|---|
page_number | この行が見つかったページ番号。 |
height | 行の高さ。 |
width | 線の幅。 |
x0 | ページの左側から左側端までの距離。 |
x1 | ページの左側から右側の端までの距離。 |
y0 | ページの下端から下端までの距離。 |
y1 | ページの上端から下端までの距離。 |
top | ページの先頭から行の先頭までの距離。 |
bottom | ページの上部から行の下部までの距離。 |
doctop | 文書の先頭から行の先頭までの距離。 |
linewidth | 線の太さ。 |
stroking_color | 線の色。詳細については、docs/colors.md を参照してください。 |
non_stroking_color | 線のパスに指定された非ストローク色。詳細については、docs/colors.md を参照してください。 |
mcid | この行のマークされたコンテンツ セクション ID (存在する場合) (それ以外の場合はNone )。実験的な属性。 |
tag | この行のマークされたコンテンツ セクション タグ (存在する場合) (それ以外の場合はNone )。実験的な属性。 |
object_type | "ライン" |
rect
プロパティ財産 | 説明 |
---|---|
page_number | この四角形が見つかったページ番号。 |
height | 長方形の高さ。 |
width | 長方形の幅。 |
x0 | ページの左側から長方形の左側までの距離。 |
x1 | ページの左側から長方形の右側までの距離。 |
y0 | ページの下部から長方形の下部までの距離。 |
y1 | ページの下部から長方形の上部までの距離。 |
top | ページの上部から長方形の上部までの距離。 |
bottom | ページの上部から長方形の底部までの距離。 |
doctop | ドキュメントの上部から長方形の上部までの距離。 |
linewidth | 線の太さ。 |
stroking_color | 長方形の輪郭の色。詳細については、docs/colors.md を参照してください。 |
non_stroking_color | 長方形の塗りつぶしの色。詳細については、docs/colors.md を参照してください。 |
mcid | この四角形のマークされたコンテンツ セクション ID (存在する場合) (それ以外の場合はNone )。実験的な属性。 |
tag | この四角形のマークされたコンテンツ セクション タグ (存在する場合) (それ以外の場合はNone )。実験的な属性。 |
object_type | 「直方体」 |
curve
プロパティ財産 | 説明 |
---|---|
page_number | この曲線が見つかったページ番号。 |
pts | 曲線上の点を示す(x, top) タプルのリスト。 |
path | (cmd, *(x, top)) タプルのリスト。完全なパスの説明を記述します。これには、ベジェ曲線で使用される制御点なども含まれます。 |
height | 曲線の境界ボックスの高さ。 |
width | 曲線の境界ボックスの幅。 |
x0 | ページの左側から曲線の左端までの距離。 |
x1 | ページの左側から曲線の右端までの距離。 |
y0 | ページの下部から曲線の最下点までの距離。 |
y1 | ページの下部から曲線の最高点までの距離。 |
top | ページの上部から曲線の最高点までの距離。 |
bottom | ページの上部から曲線の最下点までの距離。 |
doctop | ドキュメントの上部から曲線の最高点までの距離。 |
linewidth | 線の太さ。 |
fill | 曲線のパスによって定義された形状が塗りつぶされるかどうか。 |
stroking_color | 曲線の輪郭の色。詳細については、docs/colors.md を参照してください。 |
non_stroking_color | 曲線の塗りつぶしの色。詳細については、docs/colors.md を参照してください。 |
dash | 曲線の破線スタイルを記述する([dash_array], dash_phase) タプル。詳細については、PDF 仕様の表 4.6 を参照してください。 |
mcid | このカーブのマークされたコンテンツ セクション ID (存在する場合) (それ以外の場合はNone )。実験的な属性。 |
tag | このカーブのマークされたコンテンツ セクション タグ (存在する場合) (それ以外の場合はNone )。実験的な属性。 |
object_type | "曲線" |
さらに、 pdfplumber.PDF
とpdfplumber.Page
両方とも、オブジェクトのいくつかの派生リストへのアクセスを提供します。 .rect_edges
(各四角形を 4 つの線に分解します)、. .curve_edges
( curve
オブジェクトに対して同じことを行います)、および.edges
(曲線オブジェクトを結合します) .rect_edges
、 .curve_edges
、および.lines
)。
image
プロパティ注: image
オブジェクトの位置と特性はpdfplumber
経由で利用できますが、このライブラリは画像コンテンツの再構築を直接サポートしません。そのためには、この提案を参照してください。
財産 | 説明 |
---|---|
page_number | 画像が見つかったページ番号。 |
height | 画像の高さ。 |
width | 画像の幅。 |
x0 | ページの左側から画像の左側までの距離。 |
x1 | ページの左側から画像の右側までの距離。 |
y0 | ページの下部から画像の下部までの距離。 |
y1 | ページの下部から画像の上部までの距離。 |
top | ページの上部から画像の上部までの距離。 |
bottom | ページの上部から画像の下部までの距離。 |
doctop | ドキュメントの上部から長方形の上部までの距離。 |
srcsize | (width, height) タプルとしての画像の元のサイズ。 |
colorspace | 画像のカラー ドメイン (RGB など)。 |
bits | カラーコンポーネントごとのビット数。たとえば、8 は、各色成分 (RGB 色空間の R、G、B) の 255 の可能な値に対応します。 |
stream | pdfminer.pdftypes.PDFStream オブジェクトとしての画像のピクセル値。 |
imagemask | null 許容のブール値。 True の場合、「イメージ データが現在の色でペイントするためのステンシル マスクとして使用されることを指定します。」 |
mcid | この画像のマークされたコンテンツ セクション ID (存在する場合) (それ以外の場合はNone )。実験的な属性。 |
tag | この画像のマークされたコンテンツ セクション タグ (存在する場合) (それ以外の場合はNone )。実験的な属性。 |
object_type | "画像" |
pdfminer.six
を介した高レベルのレイアウト オブジェクトの取得pdfminer.six
-handling laparams
パラメータをpdfplumber.open(...)
に渡すと、各ページの.objects
辞書には、 pdfminer.six
の高レベルのレイアウト オブジェクト ( "textboxhorizontal"
など) も含まれます。
pdfplumber
のビジュアル デバッグ ツールは、PDF の構造とそこから抽出されたオブジェクトを理解するのに役立ちます。
.to_image()
を使用してPageImage
作成する任意のページ (トリミングされたページを含む) をPageImage
オブジェクトに変換するには、 my_page.to_image()
を呼び出します。オプションで、次のキーワード引数のいずれかを渡すことができます。
resolution
: 1 インチあたりの希望のピクセル数。デフォルト: 72
。型: int
。width
: 希望する画像の幅 (ピクセル単位)。デフォルト: 未設定、 resolution
によって決定されます。型: int
。height
: 希望する画像の幅 (ピクセル単位)。デフォルト: 未設定、 resolution
によって決定されます。型: int
。antialias
: 画像の作成時にアンチエイリアスを使用するかどうか。 True
に設定すると、ギザギザの少ないテキストとグラフィックを含む画像が作成されますが、ファイル サイズは大きくなります。デフォルト: False
。タイプ: bool
。force_mediabox
: ページの.mediabox
サイズではなく、 .cropbox
サイズを使用します。デフォルト: False
。タイプ: bool
。例えば:
im = my_pdf . pages [ 0 ]. to_image ( resolution = 150 )
スクリプトまたは REPL から、 im.show()
ローカルの画像ビューアで画像を開きます。ただし、 PageImage
オブジェクトは Jupyter ノートブックともうまく連携します。これらはセル出力として自動的にレンダリングされます。例えば:
注: .to_image(...)
Page.crop(...)
/ CroppedPage
インスタンスでは期待どおりに機能しますが、 Page.filter(...)
/ FilteredPage
インスタンスを介して行われた変更を組み込むことはできません。
PageImage
メソッド方法 | 説明 |
---|---|
im.reset() | これまでに描いたものをすべてクリアします。 |
im.copy() | 画像を新しいPageImage オブジェクトにコピーします。 |
im.show() | ローカル画像ビューアで画像を開きます。 |
im.save(path_or_fileobject, format="PNG", quantize=True, colors=256, bits=8) | 注釈付きの画像を PNG ファイルとして保存します。デフォルトの引数は、画像を 256 色のパレットに量子化し、8 ビットの色深度で PNG を保存します。 quantize=False を渡すことで量子化を無効にするか、 colors=N を渡すことでカラー パレットのサイズを調整できます。 |
これらのメソッドには、明示的な座標または任意のpdfplumber
PDF オブジェクト (char、line、rect など) を渡すことができます。
単一オブジェクト法 | バルク方式 | 説明 |
---|---|---|
im.draw_line(line, stroke={color}, stroke_width=1) | im.draw_lines(list_of_lines, **kwargs) | line 、 curve 、または 2 タプルの 2 タプル ( ((x, y), (x, y)) など) から線を描画します。 |
im.draw_vline(location, stroke={color}, stroke_width=1) | im.draw_vlines(list_of_locations, **kwargs) | location で示される x 座標に垂直線を描画します。 |
im.draw_hline(location, stroke={color}, stroke_width=1) | im.draw_hlines(list_of_locations, **kwargs) | location で示される y 座標に水平線を描画します。 |
im.draw_rect(bbox_or_obj, fill={color}, stroke={color}, stroke_width=1) | im.draw_rects(list_of_rects, **kwargs) | rect 、 char など、または 4 タプルのバウンディング ボックスから四角形を描画します。 |
im.draw_circle(center_or_obj, radius=5, fill={color}, stroke={color}) | im.draw_circles(list_of_circles, **kwargs) | (x, y) 座標、またはchar 、 rect などの中心に円を描画します。 |
注: 上記のメソッドは Pillow のImageDraw
メソッドに基づいて構築されていますが、パラメータは SVG のfill
/ stroke
/ stroke_width
命名法との一貫性を保つために調整されています。
im.debug_tablefinder(table_settings={})
検出された線 (赤色)、交差点 (円)、およびテーブル (水色) がオーバーレイされたバージョンの PageImage を返します。
pdfplumber
任意のページ (トリミングされたページや派生ページを含む) からテキストを抽出できます。また、そのテキストのレイアウトを保存したり、単語や検索クエリの座標を特定したりすることもできます。 Page
オブジェクトは、次のテキスト抽出メソッドを呼び出すことができます。
方法 | 説明 |
---|---|
.extract_text(x_tolerance=3, x_tolerance_ratio=None, y_tolerance=3, layout=False, x_density=7.25, y_density=13, line_dir_render=None, char_dir_render=None, **kwargs) | ページのすべての文字オブジェクトを単一の文字列に照合します。
|
.extract_text_simple(x_tolerance=3, y_tolerance=3) | より単純なロジックを使用した、わずかに高速ですが柔軟性に欠ける.extract_text(...) のバージョン。 |
.extract_words(x_tolerance=3, x_tolerance_ratio=None, y_tolerance=3, keep_blank_chars=False, use_text_flow=False, line_dir="ttb", char_dir="ltr", line_dir_rotated="ttb", char_dir_rotated="ltr", extra_attrs=[], split_at_punctuation=False, expand_ligatures=True, return_chars=False) | すべての単語に見えるものとその境界ボックスのリストを返します。単語は、(「正立」文字の場合) ある文字のx1 と次の文字のx0 の差がx_tolerance 以下であり、ある文字のdoctop と次の文字のdoctop が一致する文字のシーケンスとみなされます。 y_tolerance 以下です。 ( x_tolerance_ratio がNone でない場合、エクストラクターはx_tolerance_ratio * previous_character["size"] に等しい動的なx_tolerance 使用します。) 同様のアプローチが非直立文字に対しても採用されますが、代わりに文字間の水平距離ではなく垂直距離を測定します。 keep_blank_chars True に変更すると、空白文字が単語間のスペースとしてではなく、単語の一部として扱われることになります。 use_text_flow True に変更すると、x/y 位置で文字を事前に並べ替えるのではなく、PDF の基礎となる文字の流れが、単語の順序付けとセグメント化のガイドとして使用されます。 (これは、カーソルをドラッグすると PDF 内のテキストがハイライト表示される様子を模倣しています。同様に、順序は常に論理的であるとは限りません。) 引数line_dir とchar_dir 、行/文字が読み取られると予想される方向をこのメソッドに伝えます。有効なオプションは、「ttb」(上から下)、「btt」(下から上)、「ltr」(左から右)、および「rtl」(右から左)です。 line_dir_rotated 引数とchar_dir_rotated 引数は似ていますが、回転されたテキストを対象とします。 extra_attrs のリスト (例: ["fontname", "size"] を渡すと、各単語がそれらの属性のそれぞれでまったく同じ値を共有する文字に制限され、結果として得られる単語の辞書がそれらの属性を示します。split_at_punctuation split_at_punctuation True に設定すると、 string.punctuation で指定された句読点でトークンの分割を強制するか、文字列を渡すことで区切り句読点のリストを指定できます。 split_at_punctuation='!"&'()*+,.:;<=>?@[]^`{|}~' 。 expand_ligatures=False 設定しない限り、 fi などの合字は構成文字に展開されます (例: return_chars=True 渡すと、その構成文字fi リストが"chars" フィールドのリストとして各単語辞書に追加されます。 |
.extract_text_lines(layout=False, strip=True, return_chars=True, **kwargs) | ページ上のテキスト行を表す辞書のリストを返す実験的な機能。 strip パラメータは、Python のstr.strip() メソッドと同様に機能し、周囲の空白を含まないtext 属性を返します。 ( layout = True の場合にのみ関係します。) return_chars False に設定すると、返されたテキスト行の辞書から個々の文字オブジェクトが除外されます。残りの**kwargs .extract_text(layout=True, ...) に渡すものです。 |
.search(pattern, regex=True, case=True, main_group=0, return_groups=True, return_chars=True, layout=False, **kwargs) | ページのテキストを検索して、クエリに一致するすべてのインスタンスのリストを返す実験的な機能。各インスタンスの応答辞書オブジェクトには、一致するテキスト、一致する正規表現グループ、境界ボックスの座標、および char オブジェクト自体が含まれます。 pattern コンパイルされた正規表現、コンパイルされていない正規表現、または非正規表現文字列を指定できます。 regex がFalse の場合、パターンは非正規表現文字列として扱われます。 case がFalse 場合、検索は大文字と小文字を区別しない方法で実行されます。 main_group 設定すると、結果がpattern 内の特定の正規表現グループに制限されます (デフォルトの0 は全体の一致を意味します)。 return_groups および/またはreturn_chars False に設定すると、一致した正規表現グループおよび/または文字のリストが (返される辞書に"groups" および"chars" として) 追加されなくなります。 layout パラメーターは、 .extract_text(...) の場合と同様に機能します。残りの**kwargs .extract_text(layout=True, ...) に渡すものです。注: 幅がゼロの一致とすべての空白の一致は、(一般に) ページ上で明示的な位置を持たないため、破棄されます。 |
.dedupe_chars(tolerance=1, extra_attrs=("fontname", "size")) | 重複した文字 (他の文字と同じテキスト、位置 ( tolerance x/y 内)、およびextra_attrs 共有する文字) が削除されたページのバージョンを返します。 (動機を理解するには、問題 #71 を参照してください。) |
pdfplumber
のテーブル検出へのアプローチは、Anssi Nurminen の修士論文から多くの部分を借用しており、Tabula からインスピレーションを受けています。次のように動作します。
pdfplumber.Page
オブジェクトは、次のテーブル メソッドを呼び出すことができます。
方法 | 説明 |
---|---|
.find_tables(table_settings={}) | Table オブジェクトのリストを返します。 Table オブジェクトは.cells 、 .rows 、 .columns 、および.bbox プロパティ、および.extract(x_tolerance=3, y_tolerance=3) メソッドへのアクセスを提供します。 |
.find_table(table_settings={}) | .find_tables(...) に似ていますが、ページ上の最大のテーブルをTable オブジェクトとして返します。複数のテーブルのサイズが同じである場合 (セルの数で測定した場合)、このメソッドはページの先頭に最も近いテーブルを返します。 |
.extract_tables(table_settings={}) | ページ上で見つかったすべてのテーブルから抽出されたテキストを返します。これは、 table -> row -> cell 構造を持つリストのリストのリストとして表されます。 |
.extract_table(table_settings={}) | ページ上の最大のテーブル (上記の.find_table(...) を参照) から抽出されたテキストを返します。これは、 row -> cell 構造を持つリストのリストとして表されます。 |
.debug_tablefinder(table_settings={}) | .edges 、 .intersections 、 .cells 、および.tables プロパティにアクセスできる、 TableFinder クラスのインスタンスを返します。 |
例えば:
pdf = pdfplumber . open ( "path/to/my.pdf" )
page = pdf . pages [ 0 ]
page . extract_table ()
より詳細な例については、ここをクリックしてください。
デフォルトでは、 extract_tables
ページの垂直線と水平線 (または長方形の端) をセル区切りとして使用します。ただし、このメソッドはtable_settings
引数を使用して高度にカスタマイズできます。可能な設定とそのデフォルト:
{
"vertical_strategy" : "lines" ,
"horizontal_strategy" : "lines" ,
"explicit_vertical_lines" : [],
"explicit_horizontal_lines" : [],
"snap_tolerance" : 3 ,
"snap_x_tolerance" : 3 ,
"snap_y_tolerance" : 3 ,
"join_tolerance" : 3 ,
"join_x_tolerance" : 3 ,
"join_y_tolerance" : 3 ,
"edge_min_length" : 3 ,
"min_words_vertical" : 3 ,
"min_words_horizontal" : 1 ,
"intersection_tolerance" : 3 ,
"intersection_x_tolerance" : 3 ,
"intersection_y_tolerance" : 3 ,
"text_tolerance" : 3 ,
"text_x_tolerance" : 3 ,
"text_y_tolerance" : 3 ,
"text_*" : …, # See below
}
設定 | 説明 |
---|---|
"vertical_strategy" | "lines" 、 "lines_strict" 、 "text" 、または"explicit" のいずれか。以下の説明を参照してください。 |
"horizontal_strategy" | "lines" 、 "lines_strict" 、 "text" 、または"explicit" のいずれか。以下の説明を参照してください。 |
"explicit_vertical_lines" | テーブル内のセルを明示的に区切る垂直線のリスト。上記の戦略のいずれかと組み合わせて使用できます。リスト内の項目は、ページの高さ全体の線のx 座標を示す数値、またはline / rect / curve オブジェクトのいずれかである必要があります。 |
"explicit_horizontal_lines" | テーブル内のセルを明示的に区切る水平線のリスト。上記の戦略のいずれかと組み合わせて使用できます。リスト内の項目は、ページの高さ全体の線のy 座標を示す数値、またはline / rect / curve オブジェクトのいずれかである必要があります。 |
"snap_tolerance" 、 "snap_x_tolerance" 、 "snap_y_tolerance" | snap_tolerance ポイント内の平行線は、同じ水平または垂直位置に「スナップ」されます。 |
"join_tolerance" 、 "join_x_tolerance" 、 "join_y_tolerance" | 同じ無限直線上にあり、その端が互いのjoin_tolerance 内にある線分は、単一の線分に「結合」されます。 |
"edge_min_length" | edge_min_length より短いエッジは、テーブルの再構築を試行する前に破棄されます。 |
"min_words_vertical" | "vertical_strategy": "text" を使用する場合、少なくともmin_words_vertical 単語が同じ配置を共有する必要があります。 |
"min_words_horizontal" | "horizontal_strategy": "text" を使用する場合、少なくともmin_words_horizontal 単語が同じ配置を共有する必要があります。 |
"intersection_tolerance" 、 "intersection_x_tolerance" 、 "intersection_y_tolerance" | エッジをセルに結合する場合、直交するエッジが交差しているとみなされるためには、 intersection_tolerance ポイント内にある必要があります。 |
"text_*" | text_ というプレフィックスが付いたすべての設定は、検出された各テーブルからテキストを抽出するときに使用されます。ここでは、 Page.extract_text(...) のすべての可能な引数も有効です。 |
"text_x_tolerance" 、 "text_y_tolerance" | これらのtext_ 接頭辞付きの設定は、 text ストラテジが使用されている場合のテーブル識別アルゴリズムにも適用されます。つまり、アルゴリズムが単語を検索するとき、各単語の個々の文字がtext_x_tolerance / text_y_tolerance ポイント以上離れていないことを期待します。 |
vertical_strategy
とhorizontal_strategy
どちらも次のオプションを受け入れます。
戦略 | 説明 |
---|---|
"lines" | ページのグラフィカルな線 (四角形オブジェクトの辺を含む) を表セルの境界線として使用します。 |
"lines_strict" | 可能性のある表セルの境界線として、ページのグラフィカルな線を使用しますが、四角形オブジェクトの辺は使用しません。 |
"text" | vertical_strategy の場合: ページ上の単語の左、右、または中央を接続する (仮想の) 線を推定し、それらの線を潜在的な表セルの境界線として使用します。 horizontal_strategy の場合も同じですが、単語の先頭を使用します。 |
"explicit" | explicit_vertical_lines に明示的に定義されexplicit_horizontal_lines 行のみを使用してください。 |
多くの場合、テーブルを抽出する前にページをトリミングする ( Page.crop(bounding_box)
と便利です。
pdfplumber
のテーブル抽出はv0.5.0
で根本的に再設計され、重大な変更が導入されました。
PDF ファイルには、ユーザーが入力して保存できる入力を含むフォームが含まれる場合があります。フォーム フィールドの値は PDF ファイル内の他のテキストと同じように表示されますが、フォーム データは異なる方法で処理されます。詳細については、この仕様の 671 ページを参照してください。
pdfplumber
フォーム データを操作するためのインターフェイスがありませんが、 pdfminer
のpdfplumber
のラッパーを使用してアクセスできます。
たとえば、このスニペットはフォームのフィールド名と値を取得し、辞書に保存します。
import pdfplumber
from pdfplumber . utils . pdfinternals import resolve_and_decode , resolve
pdf = pdfplumber . open ( "document_with_form.pdf" )
def parse_field_helper ( form_data , field , prefix = None ):
""" appends any PDF AcroForm field/value pairs in `field` to provided `form_data` list
if `field` has child fields, those will be parsed recursively.
"""
resolved_field = field . resolve ()
field_name = '.' . join ( filter ( lambda x : x , [ prefix , resolve_and_decode ( resolved_field . get ( "T" ))]))
if "Kids" in resolved_field :
for kid_field in resolved_field [ "Kids" ]:
parse_field_helper ( form_data , kid_field , prefix = field_name )
if "T" in resolved_field or "TU" in resolved_field :
# "T" is a field-name, but it's sometimes absent.
# "TU" is the "alternate field name" and is often more human-readable
# your PDF may have one, the other, or both.
alternate_field_name = resolve_and_decode ( resolved_field . get ( "TU" )) if resolved_field . get ( "TU" ) else None
field_value = resolve_and_decode ( resolved_field [ "V" ]) if 'V' in resolved_field else None
form_data . append ([ field_name , alternate_field_name , field_value ])
form_data = []
fields = resolve ( resolve ( pdf . doc . catalog [ "AcroForm" ])[ "Fields" ])
for field in fields :
parse_field_helper ( form_data , field )
このスクリプトを実行すると、 form_data
各フォーム要素の 3 要素タプルを含むリストになります。たとえば、都市と州のフィールドを含む PDF フォームは次のようになります。
[
['STATE.0', 'enter STATE', 'CA'],
['section 2 accident infoRmation.1.0',
'enter city of accident',
'SAN FRANCISCO']
]
上記のフォーム解析コードの保守を手伝ってくれた @jeremybmerrill に感謝します。
extract_table
の使用。基本的なビジュアル デバッグとテーブル抽出を示します。extract_table
使用する。ビジュアル デバッグを使用して最適なテーブル抽出設定を見つける方法を示します。 Page.crop(...)
とPage.extract_text(...).
curve
オブジェクトの検査と視覚化。Page.extract_text(...)
の使用例。 他のいくつかの Python ライブラリは、ユーザーが PDF から情報を抽出するのに役立ちます。大まかに言うと、 pdfplumber
、次の機能を組み合わせることで他の PDF 処理ライブラリと区別されます。
pdfplumber
提供していない機能を知っておくことも役立ちます。
pdfminer.six
pdfplumber
の基盤を提供します。主に PDF の解析、PDF レイアウトとオブジェクトの位置の分析、テキストの抽出に重点を置いています。テーブル抽出や視覚的なデバッグのためのツールは提供されません。
PyPDF2
は純粋な Python ライブラリで、「PDF ファイルのページの分割、結合、トリミング、変換が可能です。また、カスタム データ、表示オプション、およびパスワードを PDF ファイルに追加することもできます。」ページ テキストを抽出できますが、形状オブジェクト (四角形、線など)、テーブル抽出、または視覚的なデバッグ ツールへの簡単なアクセスは提供されません。
pymupdf
はpdfminer.six
(つまりpdfplumber
) よりも大幅に高速で、PDF を生成および変更できますが、ライブラリには Python 以外のソフトウェア (MuPDF) のインストールが必要です。また、形状オブジェクト (四角形、線など) に簡単にアクセスできず、テーブル抽出ツールや視覚的なデバッグ ツールも提供されません。
camelot
、 tabula-py
、およびpdftables
すべて、主にテーブルの抽出に焦点を当てています。場合によっては、抽出しようとしている特定のテーブルにより適している場合があります。
アイデア、機能、修正を提供してくれた次のユーザーに感謝します。
プル リクエストは歓迎ですが、ライブラリは現在開発中であるため、最初に提案の問題を送信してください。
現在のメンテナー: