기술공부
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로 렌더링됩니다.
동작
- PDF 페이지 데이터를 읽습니다.
- 지정된 Matrix를 사용해 페이지를 확장/축소하거나 회전한 후 픽셀 기반 이미지로 변환합니다.
- 결과물은 PyMuPDF의 Pixmap 객체로 반환됩니다.
결과
- Pixmap 객체는 PDF의 한 페이지를 렌더링한 이미지입니다.
- 이를 .save() 메서드를 통해 PNG, JPG 등의 이미지 파일로 저장할 수 있습니다.
종합적으로 코드 설명
mat = fitz.Matrix(dpi / 72, dpi / 72) # DPI에 따른 확대/축소 비율 설정
pix = page.get_pixmap(matrix=mat) # Matrix를 사용해 고해상도 Pixmap 생성
- DPI 설정: fitz.Matrix를 사용해 PDF 페이지를 원하는 해상도로 확대.
- 기본 PDF 해상도(72 DPI)를 기준으로 dpi / 72 비율로 크기 조정.
- 예: DPI=300 → 4.17배 크기로 변환.
- 이미지 생성: 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
반응형