pdf를 image로 변환하기위해 pdf2image
library를 사용하고 있었는데, 특정 pdf파일에서는 흰색 배경 이미지로만 변환되는 현상이 발생하였다. 시행착오 결과, 동일한 pdf파일인데 pymupdf
library로 적용하면 pdf파일의 이미지가 문제없이 잘 변환되는 것을 발견하였다. 대체 이유가 뭔지 ChatGPT한테 물어봤다.
pdf2image
와PyMuPDF
가 PDF 파일을 처리하는 방식에는 몇 가지 중요한 차이점이 있으며, 이러한 차이점이 PDF 파일의 이미지 추출 결과에 영향을 미칠 수 있습니다. 여기 몇 가지 가능한 이유를 살펴보겠습니다:
- 렌더링 엔진의 차이:
pdf2image
는 내부적으로 poppler를 사용하여 PDF 파일을 이미지로 변환합니다. 반면,PyMuPDF
는 자체적인 렌더링 엔진을 사용합니다.
이러한 다른 렌더링 엔진들은 PDF의 복잡한 구조나 특정 요소를 다르게 해석하고 렌더링할 수 있습니다.- PDF 구조와 호환성:
특정 PDF 파일이 복잡하거나 특수한 구조를 가지고 있을 수 있습니다. 예를 들어, 레이어, 암호화, 특수 글꼴 또는 그래픽 요소 등이 이에 해당됩니다.
PyMuPDF
는 이러한 복잡한 구조를 더 잘 처리할 수 있거나,pdf2image
가 처리하지 못하는 특정 요소를 해석할 수 있습니다.- 오류 처리와 안정성:
pdf2image
와PyMuPDF
는 PDF 파일의 오류나 손상된 부분을 다르게 처리할 수 있습니다. 하나의 라이브러리가 오류를 무시하고 렌더링을 계속할 수 있는 반면, 다른 하나는 실패할 수 있습니다.- 보안 제한:
일부 PDF 파일에는 복사나 인쇄를 제한하는 보안 설정이 적용되어 있을 수 있습니다.PyMuPDF
와pdf2image
는 이러한 보안 제한을 다르게 처리할 수 있습니다.
이러한 차이점들로 인해, 동일한 PDF 파일이라도pdf2image
와PyMuPDF
를 사용할 때 다른 결과가 나타날 수 있습니다. 일반적으로, 한 라이브러리에서 문제가 발생하는 경우 다른 라이브러리를 사용해 볼 것을 권장합니다. 이는 PDF 파일의 복잡성과 다양한 라이브러리의 처리 방식이 각기 다를 수 있기 때문입니다.
또한, PyMuPDF가 pdf2image 보다 이미지 변환 속도가 더 빠르다고 한다.
따라서, 기존 pdf2image가 변환한 image 형식과 동일하게 pymupdf에서 변환할 수 있도록 코드를 수정하였다.
from pdf2image import convert_from_bytes
import fitz
from PIL import Image
poppler_path = "C:/Program Files (x86)/poppler-0.68.0/bin"
def pdf_to_image(id, pdf_path):
if id in C.TRANSPDFLIB:
doc = fitz.open(pdf_path)
for page in doc:
# 원본 이미지 비율을 유지하면서 높이를 2450으로 조정
scale = 2450 / page.rect.height
pix = page.get_pixmap(matrix = fitz.Matrix(scale, scale))
# PIL.Image 객체로 변환
imgs_ = Image.frombytes("RGB", [pix.width, pix.height], pix.samples)
# 그레이스케일로 변환
imgs = imgs_.convert('L')
imgs.save('path~')
imgs = [imgs]
doc.close()
else:
imgs = convert_from_bytes(
open(pdf_path, "rb").read(),
500,
grayscale= True,
size =(2450, None),
poppler_path = poppler_path
)
return imgs