기술공부

pdf 페이지 img, png로 변환 방법

넹넹선생님 2025. 1. 24. 14:55
728x90
반응형

fitz.Matrix와 page.get_pixmap은 PyMuPDF를 사용해 PDF 페이지를 고해상도 이미지로 변환할 때 핵심적으로 사용되는 메서드와 클래스입니다. 아래에서 이 코드의 동작 원리와 역할을 자세히 설명하겠습니다.


1. fitz.Matrix(dpi / 72, dpi / 72)

기능

  • fitz.Matrix는 PDF 페이지의 그래픽 변환(확대, 축소, 회전 등)을 제어하는 객체를 생성합니다.
  • 여기서는 PDF 이미지를 원하는 DPI(Dots Per Inch) 해상도로 변환하기 위해 확대 비율을 설정합니다.

매개변수

  • dpi / 72: X축의 확대/축소 비율.
  • dpi / 72: Y축의 확대/축소 비율.
    • 기본 PDF 해상도는 72 DPI입니다. 따라서 원하는 해상도(DPI)를 기준으로 확대 비율을 계산: scale=dpi72\text{scale} = \frac{\text{dpi}}{72}

예제

  • DPI = 72 (기본값):scale=7272=1.0\text{scale} = \frac{72}{72} = 1.0기본 크기로 렌더링(확대/축소 없음).
  • DPI = 300:scale=30072≈4.17\text{scale} = \frac{300}{72} \approx 4.174.17배 확대되어 고해상도로 렌더링.

동작

  • fitz.Matrix(dpi / 72, dpi / 72)는 PDF 페이지를 dpi 값에 따라 확대/축소 비율을 지정합니다.
  • 결과적으로 fitz.Matrix 객체를 통해 PDF 페이지의 렌더링 크기를 조정할 수 있습니다.

2. page.get_pixmap(matrix=mat)

기능

  • PDF 페이지를 픽셀 이미지(Pixmap)로 변환합니다.
  • get_pixmap()는 Matrix 객체를 사용하여 페이지의 크기, 해상도, 색상 정보를 조정할 수 있습니다.

매개변수

  • matrix=mat: PDF 페이지를 변환할 때 사용할 그래픽 변환 매트릭스(확대, 축소, 회전 등).
  • 기본적으로, Matrix를 설정하지 않으면 72 DPI로 렌더링됩니다.

동작

  1. PDF 페이지 데이터를 읽습니다.
  2. 지정된 Matrix를 사용해 페이지를 확장/축소하거나 회전한 후 픽셀 기반 이미지로 변환합니다.
  3. 결과물은 PyMuPDF의 Pixmap 객체로 반환됩니다.

결과

  • Pixmap 객체는 PDF의 한 페이지를 렌더링한 이미지입니다.
  • 이를 .save() 메서드를 통해 PNG, JPG 등의 이미지 파일로 저장할 수 있습니다.

종합적으로 코드 설명

mat = fitz.Matrix(dpi / 72, dpi / 72)  # DPI에 따른 확대/축소 비율 설정
pix = page.get_pixmap(matrix=mat)  # Matrix를 사용해 고해상도 Pixmap 생성
  1. DPI 설정: fitz.Matrix를 사용해 PDF 페이지를 원하는 해상도로 확대.
    • 기본 PDF 해상도(72 DPI)를 기준으로 dpi / 72 비율로 크기 조정.
    • 예: DPI=300 → 4.17배 크기로 변환.
  2. 이미지 생성: get_pixmap()으로 PDF 페이지를 픽셀 기반 이미지로 렌더링.
    • PDF 페이지의 고해상도 이미지를 메모리에 생성.
    • 이 이미지를 PNG, JPG 등 파일로 저장 가능.

예제

import fitz  # PyMuPDF

pdf_path = "example.pdf"
pdf_document = fitz.open(pdf_path)  # PDF 파일 열기
page = pdf_document[0]  # 첫 번째 페이지 로드

dpi = 300  # 원하는 해상도
scale = dpi / 72
mat = fitz.Matrix(scale, scale)  # 확대 비율 설정
pix = page.get_pixmap(matrix=mat)  # 고해상도 픽셀 이미지 생성

pix.save("output_image.png")  # 이미지 저장
  • DPI=300으로 설정하면 output_image.png는 고해상도로 저장됩니다.
  • DPI 값을 조정하면 더 높은 화질(예: 600 DPI)로 저장 가능하지만 처리 시간이 더 길어질 수 있습니다.

DPI별 출력 크기 비교

  • PDF의 크기가 8.5 x 11 인치일 경우:
    • 72 DPI: (612 x 792) 픽셀
    • 150 DPI: (1275 x 1650) 픽셀
    • 300 DPI: (2550 x 3300) 픽셀
    • 600 DPI: (5100 x 6600) 픽셀

이처럼 dpi 값을 높이면 화질은 개선되지만 이미지 파일 크기와 처리 속도도 증가합니다.


추가 참고

  • DPI를 높이는 대신 fitz.Matrix의 회전 기능도 사용할 수 있습니다:
    mat = fitz.Matrix(scale, scale).preRotate(90)  # 90도 회전
    pix = page.get_pixmap(matrix=mat)
    

이 설정으로 고해상도와 원하는 각도로 변환된 이미지를 생성할 수 있습니다. 

728x90
반응형