반응형
PDF 텍스트 추출 - 페이지, 블록, 라인 w/ PyMuPDF
들어가며
여러 개의 PDF에서 텍스트가 필요할 때, 파이썬을 활용하여 원하는 단위만큼 추출할 수 있습니다. 전체 PDF 추출뿐만 아니라 페이지 단위, 블록 단위, 라인 단위 또한 가능합니다. 이 글에서는 PyMuPDF 패키지를 활용하여 PDF 파일을 읽고, 특정 단위에 맞춰 텍스트를 추출하는 방법을 소개합니다.
예제로 활용할 파일의 제목은 "Attention Is All You Need"로 Google Brain 팀의 연구자들이 작성한 NLP 관련 논문입니다. arXiv에 업로드된 논문이므로 누구나 무료로 다운로드하고 읽을 수 있습니다.
- PDF 전체 텍스트 추출
- PDF 페이지 단위 텍스트 추출
- PDF 블록 단위 텍스트 추출
- PDF 라인 단위 텍스트 추출
PDF 전체 텍스트 추출
전체 텍스트를 추출하는 방법은 다음과 같습니다. 전체 페이지를 순회하고, get_text를 활용하여 전체 텍스트를 추출합니다.
import fitz
pdf_path = 'Attention is all you need.pdf'
doc = fitz.open(pdf_path)
print(f"--- Extracting text from {pdf_path} ---")
pdf_text = ""
for page_num in range(len(doc)):
page = doc[page_num]
pdf_text += page.get_text("text")
print(pdf_text)
PDF 페이지 단위 텍스트 추출
PDF 파일 전체의 하위 개념은 '페이지'입니다. 페이지 단위로 텍스트를 추출하는 방법은 다음과 같습니다. 페이지 단위로 순회하며 get_text를 활용하여 불필요한 공백을 제거한 텍스트를 추출합니다.
import fitz
import re
pdf_path = 'Attention is all you need.pdf'
doc = fitz.open(pdf_path)
print(f"--- Extracting text from {pdf_path} ---")
for page_num in range(len(doc)):
page = doc[page_num]
text = page.get_text("text")
text = re.sub(r'\s+', ' ', text.strip())
print(f"--- Page {page_num + 1} ---")
print(text)
반응형
PDF 블록 단위 텍스트 추출
페이지의 하위 개념은 '블록'입니다. 블록 단위 텍스트를 추출하는 방법은 다음과 같습니다. 페이지 단위로 순회하며 1개의 블록에 대한 텍스트를 합하여 출력합니다.
import fitz
pdf_path = 'Attention is all you need.pdf'
doc = fitz.open(pdf_path)
print(f"--- Extracting text from {pdf_path} ---")
for page_num in range(len(doc)):
page = doc[page_num]
text_dict = page.get_text("dict")
print(f"--- Page {page_num + 1} ---")
block_num = 1
for block in text_dict["blocks"]:
if "lines" in block:
block_text = ""
for line in block["lines"]:
for span in line["spans"]:
block_text += span["text"] + " "
# 블록 텍스트 출력
print(f"{block_num} Block: {block_text.strip()}")
block_num += 1
PDF 라인 단위 텍스트 추출
블록의 하위 개념은 '라인'입니다. 블록을 구성하는 라인 단위로 텍스트를 추출하는 방법은 다음과 같습니다. 페이지 단위, 블록 단위로 순회하며 각 라인의 텍스트를 출력합니다.
import fitz
pdf_path = 'Attention is all you need.pdf'
doc = fitz.open(pdf_path)
print(f"--- Extracting text from {pdf_path} ---")
for page_num in range(len(doc)):
page = doc[page_num]
text_dict = page.get_text("dict")
print(f"--- Page {page_num + 1} ---")
block_num = 1
for block in text_dict["blocks"]:
if "lines" in block:
print(f"--- Block {block_num} ---")
for line_num, line in enumerate(block["lines"], start=1):
line_text = " ".join(span["text"] for span in line["spans"])
print(f"Line {line_num}: {line_text}")
block_num += 1
반응형
'Python' 카테고리의 다른 글
[파이썬] 오라클 DB 연동 - DB 조회, 업데이트, cx_Oracle (4) | 2025.03.11 |
---|---|
[파이썬] 오라클 DB 연동 - DB 연결, cx_Oracle (2) | 2025.03.10 |
[파이썬] 토이 프로젝트 - PC 알림 프로그램 noti-py, plyer (2) | 2025.02.23 |
[파이썬] 한글 워드 클라우드 생성 및 특정 모양 적용 - KoNLPy, mask (2) | 2025.01.04 |
[파이썬] MNIST 손글씨 숫자 이미지 분류 딥러닝 모델 구현 (0) | 2024.12.29 |