[python] PDF를 이미지로 자동 변환
PDF가 실제로 스캔 된 이미지 인 경우 PDF를 이미지로 변환하지 말고 PDF에서 이미지를 추출해야합니다. 대부분의 경우 PDF의 모든 데이터는 본질적으로 하나의 거대한 이미지이며 Acrobat에서 읽을 수 있도록 PDF 상세 정보로 래핑됩니다.
PDF에서 이미지를 찾고 바이트를 복사하는 간단한 방법을 시도해야합니다. PDF에서 JPG 추출 . 코드는 매우 간단하며 PDF 파일에서 작동하지 않는 데는 수십 가지 이유가있을 것입니다. 그러나 그렇다면 PDF 파일에서 이미지 데이터를 가져 오는 빠르고 쉬운 방법이 있습니다.
-------------------예 pdftoppm
를 들어 명령 줄에서 (또는 Python의 subprocess
모듈을 사용하여) 호출 한 다음 ImageMagick을 사용하여 결과 PPM 파일을 원하는 형식으로 변환 할 수 있습니다 (다시 말하지만, subprocess
또는 일부 바인딩이있는 경우 사용 ).
Ghostscript는 PDF 파일을 이미지로 변환하는 데 이상적입니다. 신뢰할 수 있으며 구성 가능한 많은 옵션이 있습니다. GPL 라이선스 또는 상업용 라이선스로도 사용할 수 있습니다. 명령 줄에서 호출하거나 기본 API를 사용할 수 있습니다. 자세한 내용은:
- Ghostscript 메인 웹 사이트
- 명령 줄 사용에 대한 Ghostscript 문서
- Python에서 Ghostscript의 명령 줄 인터페이스를 호출하는 몇 가지 예를 제공하는 또 다른 stackoverflow 스레드
- Ghostscript API 문서
다음은 .pdf 파일을 이미지로 변환하는 다른 방법입니다. 이미지 프린터를 사용하십시오. ImagePrinter Pro를 사용하여 pdf를 jpeg 이미지로 "인쇄"하기 위해 아래 기능을 성공적으로 사용했습니다 . 그러나 많은 이미지 프린터가 있습니다. 원하는 것을 선택하십시오. 선택한 이미지 프린터와 이미지 프린터가 사용하는 표준 파일 저장 형식에 따라 일부 코드를 약간 변경해야 할 수도 있습니다.
import win32api
import os
def pdf_to_jpg(pdfPath, pages):
# print pdf using jpg printer
# 'pages' is the number of pages in the pdf
filepath = pdfPath.rsplit('/', 1)[0]
filename = pdfPath.rsplit('/', 1)[1]
#print pdf to jpg using jpg printer
tempprinter = "ImagePrinter Pro"
printer = '"%s"' % tempprinter
win32api.ShellExecute(0, "printto", filename, printer, ".", 0)
# Add time delay to ensure pdf finishes printing to file first
fileFound = False
if pages > 1:
jpgName = filename.split('.')[0] + '_' + str(pages - 1) + '.jpg'
else:
jpgName = filename.split('.')[0] + '.jpg'
jpgPath = filepath + '/' + jpgName
waitTime = 30
for i in range(waitTime):
if os.path.isfile(jpgPath):
fileFound = True
break
else:
time.sleep(1)
# print Error if the file was never found
if not fileFound:
print "ERROR: " + jpgName + " wasn't found after " + str(waitTime)\
+ " seconds"
return jpgPath
결과 jpgPath
변수는 인쇄 된 pdf의 마지막 jpeg 페이지의 경로 위치를 알려줍니다. 다른 페이지를 가져와야하는 경우 이전 페이지를 가져 오기 위해 경로를 수정하는 로직을 쉽게 추가 할 수 있습니다.
의 pdf_to_jpg
(pdfPath)
6 # 'pages' is the number of pages in the pdf
7 filepath = pdfPath.rsplit('/', 1)[0]
----> 8 filename = pdfPath.rsplit('/', 1)[1]
9
10 #print pdf to jpg using jpg printer
IndexError : 목록 색인이 범위를 벗어났습니다.
-------------------Wand를 사용하면 Python을위한 뛰어난 imagemagick 바인딩이있어이를 매우 쉽게 수행 할 수 있습니다.
다음은 단일 PDF 파일을 일련의 PNG 이미지로 변환하는 데 필요한 코드입니다.
from wand.image import Image
input_path = "name_of_file.pdf"
output_name = "name_of_outfile_{index}.png"
source = Image(filename=upload.original.path, resolution=300, width=2200)
images = source.sequence
for i in range(len(images)):
Image(images[0]).save(filename=output_name.format(i))
출처
https://stackoverflow.com/questions/2002785