<- Back to projects and build log

PDF 한글 텍스트 추출 실험

PDF 파서 중 어떤 것이 한글 PDF에 가장 좋을까?

autorag / rag / pdf-parsing / korean-pdf
PDF 한글 텍스트 추출 실험 글 대표 일러스트
Jeffrey Kim의 SecondBrain 빌드 로그 아티클 커버

Quick context

First, this page captures one concrete build-log step, research note, or project lesson from Jeffrey Kim.

Next, use the tags, related reading, and home archive to move from this note to deeper material in the same topic cluster.

Finally, follow the RSS feed if you want the next experiment, retrospective, or paper review as soon as it ships.

제가 직접 작성한 것이 아닌 AutoRAG를 같이 만든 [김병욱](https://www.linkedin.com/in/autorag-bwook/) 연구원이 쓴 글입니다.

RAG를 하려면 수 많은 Raw Data 들을 파싱해야 한다

Raw Data들 중에서도 가장 범용적으로 사용되는 파일은 PDF이기 때문에, PDF문서에서 텍스트를 추출해 내는 능력은 RAG의 가장 앞단에서 일어나는 일이고, 그렇기 때문에 중요하다

이번 글에서는 여러 파이썬 라이브러리의 PDF 파일에서 한글을 추출해내는 능력을 비교해 볼 것이다


인터넷 검색을 통해 무료 + 많은 사람들이 사용하고 있는 5개의 라이브러리를 실험 대상으로 정했다.

PyPDFium2, PyMuPDF, PyPDF2, PDFMiner, PDFPlumber 이렇게 5개를 비교해보도록 하자


실험 PDF

실험은 가장 무난한 5개의 Domain(medical, law, finance, commerce, public)의 PDF로 진행했다.

텍스트 추출 능력만 실험하기 위해, 이미지나 표가 있는 문서들은 일단 제외하였다.

코드

1. PyPDFium2

    from langchain_community.document_loaders import PyPDFium2Loader
    
    loader = PyPDFium2Loader(pdf_path)
    load = loader.load()
    print(load[0].page_content

2. PyMuPDF

    import fitz
    
    doc = fitz.open(pdf_path)
    for page in doc:
        text = page.get_text()
        print(text)

3. PyPDF2

    from PyPDF2 import PdfReader
    
    reader = PdfReader(pdf_path)
    pages = reader.pages
    text = ""
    for page in pages:
        sub = page.extract_text()
        text += sub
    print(text)

4. PDFMiner

    from pdfminer.high_level import extract_pages
    from pdfminer.layout import LTTextContainer
    
    def extract_text_by_page(pdf_path):
        for page_layout in extract_pages(pdf_path):
            page_text = ""
            for element in page_layout:
                if isinstance(element, LTTextContainer):
                    page_text += element.get_text()
            yield page_text
    for page_number, page_text in enumerate(extract_text_by_page(pdf_path), start=1):
        print(f"Page {page_number}:\\n{page_text}\\n{'-'*40}\\n")

5. PDFPlumber

    import pdfplumber
    
    pdf = pdfplumber.open(pdf_path)
    pages = pdf.pages
    text = []
    for page in pages:
        sub = page.extract_text()
        text.append(sub)
    print(text)

결과 비교

결과를 모두 붙여넣으니 글이 너무 길어져 사진 자료로 대체하도록 하겠다.

자세한 결과를 확인하고 싶은 분들은 -> 링크

1. Medical

순위

🥇 PDFMiner (띄어쓰기까지 잘 추출해냄)

🥈 PDFPlumber

🥉 PyPDFium2

4️⃣ PyMuPDF

5️⃣ PyPDF2

03d4dd5d 1caf 4ed6 b9bb 3499b23408db article image

45907f88 6958 4df3 a7e6 90bfe02c828c article image

884747ba 9aea 4cda 9817 11ef634beafa article image

2. Law

순위

🥇 PDFPlumber → 줄 바꿈까지 완벽하게 추출

🥇 PyPDFium2

🥉 PDFMiner (공동 2위)

🥉 PyMuPDF (공동 2위)

5️⃣PyPDF2 (공동 4위)

94052af4 0afd 418c 8f99 4373677f7e50 article image

edad6eb0 28b8 413a b2ee cb60851c5472 article image

99c3e191 6057 4604 b9ef ab92e2b77b03 article image

3. Finance

순위 (1~4위까지 성능은 사실상 거의 비슷)

🥇 PDFMiner

🥈 PyPDFium2

🥈 PDFPlumber

4️⃣ PyMuPDF → 줄 바꿈이 살짝 아쉬움

4️⃣ PyPDF2

696c88b7 442d 4fca a94f f889beb849db article image

9349a9fa cdd0 4851 8851 04ec42916f03 article image

13b2e31b 5028 428e b89e 12508473585c article image

4. Commerce

순위 (매길 수 없음)

전부 추출해내지 못하고 깨져버렸다

f604029c 3a1e 4f0a a325 818c9576815e article image

15e96a65 7351 4444 92f2 c2a279dfd486 article image

PyPDF2, PyPDFium2도 처참히 깨졌는데… 사진은 생략하도록 하겠다

5. Public

순위

🥇 PDFPlumber

🥇 PyPDFium2

🥇 PDFMiner

4️⃣ PyMuPDF

5️⃣ PyPDF2

5ac66558 4c0e 4e6e aeb3 6b5a72ccf6b9 article image

ea96070b a6c8 43ce 9b3c 5239220b15e3 article image

c8b99643 8b06 4a73 b4fb 2ecafc3bfd6f article image

ff11babc b358 43eb 8748 85b1d7b87d29 article image

최종 순위

42a20a63 882a 4959 bedd 1a440ec19946 article image

총평

전반적으로 PDFMiner, PDFPlumber, PyPDFium2 성능 차이는 거의 없다고 느껴졌다

PyPDFium2가 3등을 하긴 했어도 1등과 거의 비슷한 수준이었다.

PyMuPDF는 줄 바꿈에서 가끔 깨지는 경우가 발생해 아쉬웠지만, 텍스트 추출 자체는 나쁘지 않았다

PyPDF2는 텍스트 추출은 잘 되지만, 줄 바꿈이 전혀 지원되지 않아 아쉽게도 꼴지를 했다

Related reading

같이 읽으면 좋은 프로젝트 로그와 연구 노트를 이어서 탐색해보세요.