각 텍스트 문자, 직사각형 및 선에 대한 자세한 정보를 보려면 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를 로드하려면 password
키워드 인수를 전달하십시오(예: pdfplumber.open("file.pdf", password = "test")
.
pdfminer.six
의 레이아웃 엔진에 레이아웃 분석 매개변수를 설정하려면 laparams
키워드 인수를 전달하십시오(예: pdfplumber.open("file.pdf", laparams = { "line_overlap": 0.7 })
.
유니코드 텍스트를 사전 정규화하려면 unicode_norm=...
전달합니다. 여기서 ...
는 "NFC"
, "NFD"
, "NFKC"
또는 "NFKD"
의 네 가지 유니코드 정규화 형식 중 하나입니다.
잘못된 메타데이터 값은 기본적으로 경고로 처리됩니다. 의도하지 않은 경우 strict_metadata=True
open
메소드에 전달하면 pdfplumber.open
이 메타데이터를 구문 분석할 수 없는 경우 예외가 발생합니다.
pdfplumber.PDF
클래스 최상위 pdfplumber.PDF
클래스는 단일 PDF를 나타내며 다음 두 가지 주요 속성을 갖습니다.
재산 | 설명 |
---|---|
.metadata | PDF의 Info 예고편에서 가져온 메타데이터 키/값 쌍 사전입니다. 일반적으로 "CreationDate", "ModDate", "Producer" 등이 포함됩니다. |
.pages | 로드된 페이지당 하나의 pdfplumber.Page 인스턴스를 포함하는 목록입니다. |
... 그리고 다음과 같은 방법도 있습니다:
방법 | 설명 |
---|---|
.close() | 이 메서드를 호출하면 각 페이지에서 Page.close() 호출되고 파일 스트림도 닫힙니다(스트림이 외부인 경우, 즉 이미 열려서 pdfplumber 에 직접 전달된 경우 제외). |
pdfplumber.Page
클래스 pdfplumber.Page
클래스는 pdfplumber
의 핵심입니다. pdfplumber
로 수행할 대부분의 작업은 이 수업을 중심으로 진행됩니다. 여기에는 다음과 같은 주요 속성이 있습니다.
재산 | 설명 |
---|---|
.page_number | 첫 번째 페이지는 1 , 두 번째 페이지는 2 등으로 시작하는 순차적 페이지 번호입니다. |
.width | 페이지의 너비입니다. |
.height | 페이지의 높이입니다. |
.objects / .chars / .lines / .rects / .curves / .images | 이러한 각 속성은 목록이며 각 목록에는 페이지에 포함된 각 개체에 대한 하나의 사전이 포함되어 있습니다. 자세한 내용은 아래의 "객체"를 참조하세요. |
... 그리고 다음과 같은 주요 메소드:
방법 | 설명 |
---|---|
.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
각각은 단일 텍스트 문자를 나타냅니다..lines
, 각각은 단일 1차원 선을 나타냅니다..rects
, 각각은 단일 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 | "숯" |
참고 : 문자의 matrix
속성은 PDF Reference(6th Ed.)의 섹션 4.2.2에 설명된 대로 "현재 변환 행렬"을 나타냅니다. 매트릭스는 문자의 크기, 기울이기 및 위치 변환을 제어합니다. 회전은 크기 조정과 기울이기의 조합이지만 대부분의 경우 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 | nullable 부울입니다. True 인 경우 "이미지 데이터가 현재 색상으로 페인팅하기 위한 스텐실 마스크로 사용되도록 지정합니다." |
mcid | 이 이미지에 표시된 콘텐츠 섹션 ID(그렇지 않은 경우 None )입니다. 실험적 속성. |
tag | 이 이미지에 표시된 콘텐츠 섹션 태그가 있는 경우(그렇지 않은 경우 None ). 실험적 속성. |
object_type | "영상" |
pdfminer.six
를 통해 더 높은 수준의 레이아웃 객체 얻기 pdfminer.six
처리 laparams
매개변수를 pdfplumber.open(...)
에 전달하면 각 페이지의 .objects
사전에는 "textboxhorizontal"
과 같은 pdfminer.six
의 상위 레벨 레이아웃 개체도 포함됩니다.
pdfplumber
의 시각적 디버깅 도구는 PDF의 구조와 PDF에서 추출된 개체를 이해하는 데 도움이 될 수 있습니다.
.to_image()
사용하여 PageImage
만들기 페이지(잘린 페이지 포함)를 PageImage
객체로 바꾸려면 my_page.to_image()
호출하세요. 선택적으로 다음 키워드 인수 중 하나를 전달할 수 있습니다.
resolution
: 원하는 인치당 픽셀 수입니다. 기본값: 72
. 유형: int
.width
: 원하는 이미지 너비(픽셀)입니다. 기본값: 설정되지 않음, resolution
에 따라 결정됨. 유형: int
.height
: 원하는 이미지 너비(픽셀)입니다. 기본값: 설정되지 않음, resolution
에 따라 결정됨. 유형: int
.antialias
: 이미지를 생성할 때 앤티앨리어싱을 사용할지 여부입니다. True
로 설정하면 텍스트와 그래픽이 덜 들쭉날쭉하지만 파일 크기가 더 큰 이미지가 생성됩니다. 기본값: False
. 유형: bool
.force_mediabox
: .cropbox
크기 대신 페이지의 .mediabox
크기를 사용합니다. 기본값: 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색 팔레트로 양자화하여 PNG를 8비트 색 심도로 저장합니다. quantize=False 전달하여 양자화를 비활성화하거나 colors=N 전달하여 색상 팔레트의 크기를 조정할 수 있습니다. |
명시적 좌표나 pdfplumber
PDF 개체(예: char, line, ect)를 이러한 메서드에 전달할 수 있습니다.
단일 객체 방법 | 대량 방법 | 설명 |
---|---|---|
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"] 을 전달하면 각 단어가 해당 속성 각각에 대해 정확히 동일한 값을 공유하는 문자로 제한되며 결과 단어 dicts는 해당 속성을 나타냅니다. split_at_punctuation True 로 설정하면 string.punctuation 에 지정된 구두점에서 분리 토큰을 적용하거나 문자열을 전달하여 구두점 구분 목록을 지정할 수 있습니다. split_at_punctuation='!"&'()*+,.:;<=>?@[]^`{|}~' . expand_ligatures=False 로 설정하지 않으면 fi 와 같은 합자는 구성 문자로 확장됩니다(예: , fi ) return_chars=True 전달하면 각 단어 사전에 해당 구성 문자 목록이 "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, ...) 에 전달하는 것입니다. 참고 : 너비가 0인 일치와 공백만 일치하는 항목은 (일반적으로) 페이지에 명시적인 위치가 없기 때문에 삭제됩니다. |
.dedupe_chars(tolerance=1, extra_attrs=("fontname", "size")) | 동일한 텍스트를 공유하는 문자, 위치 지정(x/y tolerance 내) 및 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={}) | row -> cell 구조를 사용하여 목록 목록으로 표시되는 페이지의 가장 큰 테이블(위의 .find_table(...) 참조)에서 추출된 텍스트를 반환합니다. |
.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
는 각 양식 요소에 대한 세 요소 튜플을 포함하는 목록입니다. 예를 들어 도시 및 주 필드가 있는 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(...)
사용하는 예인 San Jose PD 총기 검색 보고서에서 고정 너비 데이터 추출. 다른 여러 Python 라이브러리는 사용자가 PDF에서 정보를 추출하는 데 도움이 됩니다. 광범위한 개요로서 pdfplumber
다음 기능을 결합하여 다른 PDF 처리 라이브러리와 차별화됩니다.
pdfplumber
제공하지 않는 기능을 아는 것도 도움이 됩니다.
pdfminer.six
pdfplumber
의 기반을 제공합니다. 주로 PDF 구문 분석, PDF 레이아웃 및 개체 위치 분석, 텍스트 추출에 중점을 둡니다. 테이블 추출이나 시각적 디버깅을 위한 도구는 제공하지 않습니다.
PyPDF2
는 "PDF 파일의 페이지를 분할, 병합, 자르기 및 변환할 수 있는 순수 Python 라이브러리입니다. 또한 PDF 파일에 사용자 정의 데이터, 보기 옵션 및 비밀번호를 추가할 수 있습니다." 페이지 텍스트를 추출할 수 있지만 모양 개체(사각형, 선 등), 테이블 추출 또는 시각적 디버깅 도구에 대한 쉬운 액세스를 제공하지 않습니다.
pymupdf
는 pdfminer.six
(및 pdfplumber
)보다 훨씬 빠르며 PDF를 생성하고 수정할 수 있지만 라이브러리에는 Python이 아닌 소프트웨어(MuPDF)를 설치해야 합니다. 또한 모양 개체(사각형, 선 등)에 쉽게 액세스할 수 없으며 테이블 추출 또는 시각적 디버깅 도구도 제공하지 않습니다.
camelot
, tabula-py
및 pdftables
모두 주로 테이블 추출에 중점을 둡니다. 어떤 경우에는 추출하려는 특정 테이블에 더 적합할 수도 있습니다.
아이디어, 기능 및 수정 사항을 제공해주신 다음 사용자에게 깊은 감사를 드립니다.
끌어오기 요청을 환영합니다. 하지만 라이브러리가 활발히 개발 중이므로 먼저 제안서 문제를 제출해 주세요.
현재 관리자: