Python

[파이썬] PDF 텍스트 추출 - 페이지, 블록, 라인 w/ PyMuPDF

weweGH 2025. 2. 27. 21:00
반응형

 

PDF 파일 텍스트 추출
PDF 파일 텍스트 추출


PDF 텍스트 추출 - 페이지, 블록, 라인 w/ PyMuPDF


들어가며


여러 개의 PDF에서 텍스트가 필요할 때, 파이썬을 활용하여 원하는 단위만큼 추출할 수 있습니다. 전체 PDF 추출뿐만 아니라 페이지 단위, 블록 단위, 라인 단위 또한 가능합니다. 이 글에서는 PyMuPDF 패키지를 활용하여 PDF 파일을 읽고, 특정 단위에 맞춰 텍스트를 추출하는 방법을 소개합니다.

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

라인 단위 텍스트 추출
라인 단위 텍스트 추출


반응형