HOWTO · Python

Python으로 PDF 읽기

이 튜토리얼은 파이썬으로 PDF를 읽는 방법을 보여줍니다.

이 페이지의 내용

PDF 텍스트 추출은 보고서를 검색하거나 문서를 분석하거나 텍스트를 다른 작업 흐름으로 옮길 때 유용합니다. 적합한 방법은 PDF에 텍스트가 저장된 방식과 페이지 레이아웃을 보존해야 하는지에 따라 달라집니다. 아래 예제는 일반적인 API 사용 패턴을 보여 줍니다. 이번 수정에는 Python 실행 증거가 제공되지 않아 실행되지 않았습니다. 프로젝트에 설치된 버전에 맞는 API인지 확인하세요. 각 예제는 현재 디렉터리에 읽을 수 있는 sample.pdf가 있다고 가정하며, 파일이나 패키지가 없으면 처리되지 않은 오류를 내지 않고 이를 알립니다.

PDF를 읽을 Python 라이브러리 선택하기

여기서 다루는 다섯 라이브러리는 추출한 텍스트에 접근하는 방식이 서로 다릅니다. PyPDF2는 페이지에 직접 접근할 수 있어 특정 페이지 하나를 처리하거나 문서 전체를 순회할 때 편리합니다. pdfplumber는 페이지 텍스트와 레이아웃 관련 객체를 제공하므로 위치 정보가 중요할 때 도움이 될 수 있습니다. PyMuPDF는 문서 API를 통해 페이지 단위로 텍스트를 추출합니다. pdfminer.six는 문서 텍스트를 추출하는 고수준 함수를 제공합니다. textract는 더 폭넓은 문서 추출 인터페이스를 제공하며, 동작은 설치된 종속 패키지에 따라 달라질 수 있습니다.

이는 사용 패턴의 차이일 뿐, 보편적인 순위를 뜻하지 않습니다. 자신의 PDF에서 대표 페이지 하나를 골라 각 방법으로 처리하고, 텍스트와 읽기 순서, 간격이 작업에 적합한지 살펴보세요.

사용할 라이브러리 설치하기

시도하려는 방법에 해당하는 패키지만 설치하세요. 명령은 python -m pip install PyPDF2, python -m pip install pdfplumber, python -m pip install PyMuPDF, python -m pip install pdfminer.six 또는 python -m pip install textract입니다. 패키지 이름과 Python에서 가져올 때 사용하는 이름은 항상 같지는 않습니다. 예를 들어 pdfminer.six는 pdfminer를 통해 가져오며, PyMuPDF는 흔히 fitz라는 이름으로 가져왔습니다. 예제를 수정하기 전에 설치한 버전의 문서를 확인하세요.

PDF 경로는 쉽게 바꿀 수 있도록 변수에 저장하세요. 이 예제는 상대 경로를 사용합니다. 스크립트의 작업 디렉터리가 PDF가 있는 디렉터리가 아니라면 절대 경로를 사용하세요. PDF는 바이너리 파일이므로, 파일을 직접 받는 API에는 "rb" 모드로 연 파일을 전달해야 합니다.

PyPDF2로 PDF 텍스트 읽기

PdfReader는 페이지 모음을 제공합니다. 아래 예제는 페이지가 하나라도 있으면 첫 페이지의 텍스트를 추출하고, 모든 페이지에서 추출한 텍스트를 하나로 합칩니다. 페이지에서 추출 가능한 텍스트가 없을 수 있으므로, 코드는 None 결과를 빈 문자열로 처리합니다. 컨텍스트 관리자는 처리가 끝나면 파일을 닫습니다.

이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.

from pathlib import Path

pdf_path = Path("sample.pdf")
if not pdf_path.is_file():
    print(f"PDF not found: {pdf_path}")
else:
    try:
        from PyPDF2 import PdfReader
    except ImportError:
        print("Install PyPDF2 to run this example.")
    else:
        try:
            with pdf_path.open("rb") as pdf_file:
                reader = PdfReader(pdf_file)
                if reader.pages:
                    first_page_text = reader.pages[0].extract_text() or ""
                    all_pages_text = "\n".join(
                        page.extract_text() or "" for page in reader.pages
                    )
                    print(first_page_text)
        except Exception as error:
            print(f"PDF could not be read: {error}")

페이지 하나만 처리하려면 reader.pages에서 0부터 시작하는 인덱스로 페이지를 선택하세요. 사용하기 전에 인덱스가 페이지 수 범위 안에 있는지 확인해야 합니다. 전체 문서를 처리하는 표현식은 페이지 텍스트를 줄바꿈으로 연결하므로, 구분자 없이 이어 붙이는 것보다 페이지 경계를 살펴보기 쉽습니다. 이 코드는 첫 페이지를 출력합니다. 문서 전체 텍스트를 표시하려면 마지막 print를 print(all_pages_text)로 바꾸세요. 출력은 PDF에 따라 달라지므로 여기에는 표시하지 않습니다.

pdfplumber로 텍스트와 레이아웃 정보 추출하기

페이지별로 텍스트를 살펴보고 레이아웃 관련 정보도 필요할 수 있다면 pdfplumber를 사용하세요. 이 예제는 각 페이지의 텍스트를 추출하고, 텍스트가 없는 페이지는 빈 문자열로 바꾼 다음 페이지들을 줄바꿈으로 연결합니다. 표를 재구성하거나 읽기 순서를 보장한다고 주장하지는 않습니다. 처리 중인 문서에서 반환된 텍스트를 직접 확인하세요.

이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.

from pathlib import Path

pdf_path = Path("sample.pdf")
if not pdf_path.is_file():
    print(f"PDF not found: {pdf_path}")
else:
    try:
        import pdfplumber
    except ImportError:
        print("Install pdfplumber to run this example.")
    else:
        try:
            with pdfplumber.open(pdf_path) as pdf:
                text = "\n".join(page.extract_text() or "" for page in pdf.pages)
            print(text)
        except Exception as error:
            print(f"PDF could not be read: {error}")

이 라이브러리는 더 세밀한 분석에 사용할 수 있는 페이지 객체와 레이아웃 정보도 제공합니다. 문서의 위치나 구조가 중요할 때만 이러한 기능을 사용하고, 결과를 원본 페이지와 대조해 확인하세요. 텍스트 추출만으로는 열이 독자가 기대하는 방식대로 보존되지 않을 수 있습니다.

PyMuPDF로 PDF 텍스트 읽기

PyMuPDF는 문서를 열고 각 페이지의 텍스트를 추출할 수 있습니다. 여기 표시된 가져오기 이름은 fitz이며 기존 예제에서 많이 사용되어 왔습니다. 설치된 릴리스에서 지원하는 가져오기 방식을 확인하세요. 다음 패턴은 페이지별 텍스트를 모으고 문서가 닫히도록 처리합니다.

이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.

from pathlib import Path

pdf_path = Path("sample.pdf")
if not pdf_path.is_file():
    print(f"PDF not found: {pdf_path}")
else:
    try:
        import fitz
    except ImportError:
        print("Install PyMuPDF to run this example.")
    else:
        try:
            with fitz.open(str(pdf_path)) as document:
                text = "\n".join(page.get_text() for page in document)
            print(text)
        except Exception as error:
            print(f"PDF could not be read: {error}")

페이지 하나만 처리하려면 먼저 문서의 페이지 수를 확인한 뒤 0부터 시작하는 인덱스로 페이지에 접근하고, 해당 페이지에서 get_text()를 호출하세요. 추출 모드에 따라 텍스트 표현 방식이 달라질 수 있습니다. 특정 형식이 필요하다면 설치된 버전의 문서를 확인하세요. 이 글은 라이브러리의 다른 PDF 작업이 아니라 텍스트 추출에 초점을 둡니다.

pdfminer.six로 텍스트 추출하기

pdfminer.six는 문서 경로를 받는 고수준 extract_text 함수를 제공합니다. 설치할 배포 패키지의 이름은 pdfminer.six이지만, 가져오기는 pdfminer 패키지에서 합니다.

이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.

from pathlib import Path

pdf_path = Path("sample.pdf")
if not pdf_path.is_file():
    print(f"PDF not found: {pdf_path}")
else:
    try:
        from pdfminer.high_level import extract_text
    except ImportError:
        print("Install pdfminer.six to run this example.")
    else:
        try:
            text = extract_text(str(pdf_path))
            print(text)
        except Exception as error:
            print(f"PDF could not be read: {error}")

이 고수준 호출은 간결하게 시작하기 좋은 방법입니다. 더 세밀하게 제어하려면 pdfminer.six의 저수준 레이아웃 분석 기능을 사용할 수 있지만, 설정은 문서와 원하는 결과에 맞춰 선택해야 합니다. 추출 설정을 더 자세히 지정하면 모든 PDF에서 결과가 나아진다고 단정하지 마세요. 원본 페이지와 결과를 비교하세요.

textract로 PDF 텍스트 읽기

textract는 문서 유형 전반에 걸쳐 공통 process 인터페이스를 사용합니다. PDF 처리 기능은 외부 프로그램과 패키지 설정에 따라 달라질 수 있으므로, 모든 환경에서 Python 패키지만 설치하면 충분한 것은 아닙니다. 이 예제는 처리 오류를 잡아 알립니다. 설치가 성공했다는 이유만으로 텍스트 추출 설정까지 완료되었다고 간주하지 않습니다.

이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.

from pathlib import Path

pdf_path = Path("sample.pdf")
if not pdf_path.is_file():
    print(f"PDF not found: {pdf_path}")
else:
    try:
        import textract
    except ImportError:
        print("Install textract to run this example.")
    else:
        try:
            extracted = textract.process(str(pdf_path))
        except Exception as error:
            print(f"Text extraction could not be completed: {error}")
        else:
            print(extracted.decode("utf-8", errors="replace"))

이 사용 패턴에서 process는 바이트를 반환합니다. 이를 디코딩하면 출력하거나 추가로 텍스트를 처리할 수 있는 Python 문자열이 됩니다. 처리 과정에서 도구가 없거나 입력을 지원하지 않는다는 오류가 발생하면, 사용 중인 환경에 필요한 PDF 백엔드가 무엇인지 패키지 안내를 확인하세요.

텍스트 추출의 한계를 이해하고 라이브러리 선택하기

PDF에는 선택 가능한 텍스트, 위치가 지정된 텍스트 조각, 스캔한 페이지 이미지 또는 이들이 섞여 있을 수 있습니다. OCR 단계를 사용할 수 있고 실제로 적용하지 않는 한, 텍스트 추출기는 픽셀로만 존재하는 단어를 가져올 수 없습니다. 텍스트가 포함되어 있더라도 열, 표, 머리글, 읽기 순서는 페이지에 표시된 방식과 다르게 표현될 수 있습니다. 추출한 텍스트를 분석에 사용하기 전에 원본 PDF와 비교하세요.

페이지별 직접 처리 패턴이면 충분한 경우 PyPDF2부터 사용해 보세요. 페이지 레이아웃 정보를 살펴봐야 한다면 pdfplumber를 시도해 보세요. 페이지 텍스트 API가 작업 흐름에 맞으면 PyMuPDF를, 고수준 추출 호출이나 레이아웃 옵션을 살펴보고 싶다면 pdfminer.six를 시도해 보세요. 더 폭넓은 인터페이스가 유용하고 PDF 처리 요구 사항도 충족할 수 있다면 textract를 고려하세요. 어떤 라이브러리도 모든 파일에서 최상의 텍스트를 보장하지 않습니다.

실제로 비교하려면 후보 라이브러리로 대표 페이지 하나를 추출한 다음, 단어가 빠졌는지, 열의 내용이 뒤섞였는지, 줄바꿈 때문에 후속 처리가 어려운지 확인하세요. 중요한 값을 검증할 수 있도록 원본 PDF를 보관하세요. 페이지가 스캔본이라 텍스트가 나오지 않는다면 OCR을 별도로 검토하세요. 텍스트 추출 라이브러리만 바꾸는 것으로는 해결되지 않을 수 있습니다.