PDF TO IMAGE 변환

wandajeong·2023년 11월 27일
0

Vision AI

목록 보기
3/3

pdf를 image로 변환하기위해 pdf2image library를 사용하고 있었는데, 특정 pdf파일에서는 흰색 배경 이미지로만 변환되는 현상이 발생하였다. 시행착오 결과, 동일한 pdf파일인데 pymupdf library로 적용하면 pdf파일의 이미지가 문제없이 잘 변환되는 것을 발견하였다. 대체 이유가 뭔지 ChatGPT한테 물어봤다.

pdf2imagePyMuPDF가 PDF 파일을 처리하는 방식에는 몇 가지 중요한 차이점이 있으며, 이러한 차이점이 PDF 파일의 이미지 추출 결과에 영향을 미칠 수 있습니다. 여기 몇 가지 가능한 이유를 살펴보겠습니다:

  • 렌더링 엔진의 차이:
    pdf2image는 내부적으로 poppler를 사용하여 PDF 파일을 이미지로 변환합니다. 반면, PyMuPDF는 자체적인 렌더링 엔진을 사용합니다.
    이러한 다른 렌더링 엔진들은 PDF의 복잡한 구조나 특정 요소를 다르게 해석하고 렌더링할 수 있습니다.
  • PDF 구조와 호환성:
    특정 PDF 파일이 복잡하거나 특수한 구조를 가지고 있을 수 있습니다. 예를 들어, 레이어, 암호화, 특수 글꼴 또는 그래픽 요소 등이 이에 해당됩니다.
    PyMuPDF는 이러한 복잡한 구조를 더 잘 처리할 수 있거나, pdf2image가 처리하지 못하는 특정 요소를 해석할 수 있습니다.
  • 오류 처리와 안정성:
    pdf2imagePyMuPDF는 PDF 파일의 오류나 손상된 부분을 다르게 처리할 수 있습니다. 하나의 라이브러리가 오류를 무시하고 렌더링을 계속할 수 있는 반면, 다른 하나는 실패할 수 있습니다.
  • 보안 제한:
    일부 PDF 파일에는 복사나 인쇄를 제한하는 보안 설정이 적용되어 있을 수 있습니다. PyMuPDFpdf2image는 이러한 보안 제한을 다르게 처리할 수 있습니다.
    이러한 차이점들로 인해, 동일한 PDF 파일이라도 pdf2imagePyMuPDF를 사용할 때 다른 결과가 나타날 수 있습니다. 일반적으로, 한 라이브러리에서 문제가 발생하는 경우 다른 라이브러리를 사용해 볼 것을 권장합니다. 이는 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 
     
profile
ML/DL swimmer

0개의 댓글