Python PDF 라이브러리 비교 분석

PDF(Portable Document Format)는 운영체제에 구애받지 않고 문서를 공유하기 위한 표준 파일 형식입니다. 이러한 PDF 문서를 다루기 위한 다양한 Python 라이브러리가 존재하며, 본 글에서는 기능, 라이선스, 커뮤니티 활성도 측면에서 7가지 주요 라이브러리를 비교 분석하여 사용 목적에 맞는 도구를 선택하는 데 도움을 드리고자 합니다.

주요 Python PDF 라이브러리

  • PyPDF2: PDF 파일의 읽기, 분할, 병합, 텍스트 및 메타데이터 추출 등 기본적인 작업을 지원합니다. (현재는 PyPDF4로 계승되어 유지보수되고 있습니다.)
  • pdfrw: 기존 PDF 파일의 조작에 특화되어 있으며, ReportLab과 통합하여 새로운 페이지를 생성하는 기능을 보완할 수 있습니다.
  • ReportLab: 텍스트, 차트 등 PDF 콘텐츠를 전문적으로 생성하는 데 사용되는 라이브러리로, 상용 라이브러리의 오픈소스 버전입니다.
  • pikepdf: C++ 기반의 QPDF를 활용하여 PyPDF2 및 pdfrw와 유사한 기능을 제공하며, PDF의 저수준(low-level) 작업에 더 적합합니다.
  • pdfplumber: pdfminer.six를 기반으로 하며, 텍스트와 도형(사각형, 선, 곡선) 정보 추출뿐만 아니라 테이블 구조를 파싱하는 기능까지 제공합니다.
  • pdfminer.six: pdfminer의 커뮤니티 유지보수 버전으로, 원본 pdfminer는 2020년부터 활발한 업데이트가 이루어지지 않고 있습니다.
  • PyMuPDF: MuPDF 라이브러리를 기반으로 하며, 포괄적인 기능을 제공하고 빠른 처리 속도로 잘 알려져 있습니다.
  • borb: 순수 Python으로 작성된 라이브러리로, PDF 문서의 읽기, 쓰기, 조작 등 저수준 및 고수준 작업을 모두 지원합니다.

라이브러리 기능 비교

Python PDF 라이브러리의 주요 기능을 크게 '콘텐츠 추출', '페이지 조작', '콘텐츠 생성' 세 가지로 나누어 볼 수 있습니다. '콘텐츠 추출'은 기존 PDF에서 텍스트, 이미지, 메타데이터 등을 읽어오는 작업을 의미합니다. '페이지 조작'은 분할, 병합, 자르기, 회전 등 기존 페이지를 수정하는 작업에 해당합니다. 마지막으로 '콘텐츠 생성'은 텍스트, 이미지, 도형 등을 포함하는 새로운 PDF 문서를 만들거나 기존 문서를 편집하는 것을 포함합니다.

다음 표는 2022년 6월 기준으로 각 라이브러리의 최신 버전을 기준으로 작성된 비교입니다.

라이브러리 콘텐츠 추출 페이지 조작 콘텐츠 생성 라이선스 (주요) 특징
PyPDF2 (PyPDF4) 텍스트, 메타데이터 분할, 병합, 회전, 암호화/복호화 간단한 텍스트 추가 MIT 오래되었으나 널리 사용됨. 유지보수 상태 확인 필요.
pdfrw 텍스트, 메타데이터 분할, 병합, 회전 ReportLab 통합 MIT 기존 PDF 조작에 강점.
ReportLab - - 텍스트, 이미지, 차트, 벡터 그래픽 BSD PDF 생성에 최적화.
pikepdf 텍스트, 메타데이터, 객체 분할, 병합, 자르기, 암호화/복호화 - MPL 2.0 QPDF 기반, 저수준 접근 용이.
pdfplumber 텍스트(위치, 폰트, 색상 포함), 테이블, 도형 - - MIT 테이블 추출에 특화.
pdfminer.six 텍스트(자세한 정보 포함), 레이아웃 분석 - - MIT 텍스트 분석 및 추출에 강점.
PyMuPDF 텍스트, 이미지, 메타데이터, 주석 페이지 추출, 병합, 회전, 자르기 이미지 렌더링, 텍스트 추가 AGPL v3 / Commercial 매우 빠르고 기능이 포괄적임. 상업적 이용 시 라이선스 확인 필요.
borb 텍스트, 이미지, 메타데이터 페이지 조작, 병합, 분할 텍스트, 이미지, 도형, 벡터 그래픽 GPL v3 / Commercial 전반적인 기능 지원, 순수 Python. 상업적 이용 시 라이선스 확인 필요.

라이선스 고려사항

PyMuPDF와 borb는 GPL(General Public License) 계열의 라이선스를 따르거나 상용 라이선스를 제공합니다. GPL 라이선스는 무료 사용을 지원하지만, 해당 라이브러리를 사용하여 개발된 프로그램 역시 동일한 라이선스를 따라야 하는 조건이 붙습니다. 따라서 소스 코드 비공개 등 폐쇄적인 상업적 이용을 원할 경우, 별도의 상용 라이선스 구매가 필요할 수 있습니다.

코드 예제: PDF 페이지를 이미지로 변환 시 문제 해결

PyMuPDF를 사용하여 PDF 문서의 특정 페이지를 PNG 이미지로 저장할 때, 차트의 선이 흐리게 나타나는 현상이 발생할 수 있습니다. 이는 PDF 렌더링 엔진의 차이에서 비롯될 수 있으며, 대안으로 pdf2image 라이브러리를 사용해 볼 수 있습니다. pdf2image는 Poppler 라이브러리를 백엔드로 사용하며, MuPDF를 사용하는 PyMuPDF와는 다른 렌더링 방식을 가집니다. Poppler는 별도 설치가 필요할 수 있습니다.

PyMuPDF 사용 예제


import fitz  # PyMuPDF

pdf_path = "input.pdf"
output_path = "output_pymupdf.png"
page_number = 10  # 0-indexed

try:
    doc = fitz.open(pdf_path)
    page = doc.load_page(page_number)
    pix = page.get_pixmap(dpi=500)
    pix.save(output_path)
    print(f"Page {page_number + 1} saved to {output_path} using PyMuPDF.")
    doc.close()
except Exception as e:
    print(f"An error occurred with PyMuPDF: {e}")

pdf2image 사용 예제


from pdf2image import convert_from_path
import os

pdf_path = "input.pdf"
output_path = "output_pdf2image.png"
page_number = 10  # 1-indexed for pdf2image

# Poppler 설치 경로 지정 (필요한 경우)
# poppler_path = r"C:\path\to\poppler\bin" # 예시 경로

try:
    images = convert_from_path(
        pdf_path,
        dpi=500,
        first_page=page_number + 1,  # pdf2image는 1부터 시작
        last_page=page_number + 1,
        fmt="png",
        # poppler_path=poppler_path # Poppler 경로 지정
    )
    if images:
        images[0].save(output_path, "PNG")
        print(f"Page {page_number + 1} saved to {output_path} using pdf2image.")
    else:
        print("No images were generated.")
except Exception as e:
    print(f"An error occurred with pdf2image: {e}. Ensure Poppler is installed and in your PATH.")

두 라이브러리는 각각 MuPDF와 Poppler라는 다른 렌더링 엔진을 사용하며, MuPDF가 일반적으로 더 빠른 성능을 보입니다. 하지만 이미지 품질이나 특정 렌더링 문제 발생 시 다른 라이브러리를 시도해 볼 가치가 있습니다.

태그: python PDF 라이브러리 PyMuPDF pdf2image

7월 28일 06:55에 게시됨