pdf에서 jpeg로 페이지 추출


99

파이썬 코드에서 pdf의 특정 페이지를 jpeg 파일로 효율적으로 저장하는 방법은 무엇입니까? (사용 사례 : pdf-s가 업로드되고 각 페이지에 해당하는 jpeg-s가 스토어 인 파이썬 플라스크 웹 서버가 있습니다.)

이 솔루션 은 가깝지만 문제는 전체 페이지를 jpeg로 변환하지 않는다는 것입니다.


1
이미지에 따라 png로 추출하는 것이 더 좋을 수 있습니다. 이는 페이지에 주로 텍스트가 포함 된 경우에 적용됩니다.
Paul Rooney

답변:


133

pdf2image 라이브러리를 사용할 수 있습니다.

다음을 사용하여 간단히 설치할 수 있습니다.

pip install pdf2image

일단 설치되면 다음 코드를 사용하여 이미지를 얻을 수 있습니다.

from pdf2image import convert_from_path
pages = convert_from_path('pdf_file', 500)

jpeg 형식으로 페이지 저장

for page in pages:
    page.save('out.jpg', 'JPEG')

편집 : Github repo pdf2image 는 또한 사용 pdftoppm하고 다른 설치가 필요하다고 언급 합니다.

pdftoppm은 실제 마법을 수행하는 소프트웨어입니다. poppler 라는 더 큰 패키지의 일부로 배포됩니다 . Windows 사용자는 Windows 용 poppler 를 설치해야합니다 . Mac 사용자는 Mac 용 poppler 를 설치해야합니다 . Linux 사용자는 pdftoppm이 배포판 (Ubuntu 및 Archlinux에서 테스트 됨)과 함께 사전 설치되어 있지 않은 경우 sudo apt install poppler-utils.

anaconda를 사용하여 Windows에서 다음을 수행하여 최신 버전을 설치할 수 있습니다.

conda install -c conda-forge poppler

참고 : Windows 버전 최대 0.67은 http://blog.alivate.com.au/poppler-windows/ 에서 사용할 수 있지만 0.68은 2018 년 8 월출시 되었으므로 최신 기능이나 버그 수정을받을 수 없습니다.


4
안녕하세요, poppler는 단지 압축 파일이며 아무것도 설치하지 않습니다. dll 또는 bin 파일로 무엇을해야합니까?
gaurwraith

@gaurwraith : 다음 링크를 사용하여 poppler . 어떤 이유로 Rodrigo의 설명에있는 링크는 github repo와 동일하지 않습니다.
Tobias

1
@elPastor 만 지정된 페이지를 변환 할 conver_from_path 함수의 인수에 FIRST_PAGE 및 LAST_PAGE을 추가 할 수 있습니다
Keval 데이브

1
@Jacob 500은 dpi입니다. 필요한 해상도와 사용 가능한 계산을 절충합니다. 내 실험에서 500은 대부분의 경우 잘 작동했으며 300은 저 레즈 이미지를 얻었습니다.
Keval Dave

1
PDF의 첫 페이지 만 변환하면 다음과 같이 작동합니다.from pdf2image import convert_from_path pages = convert_from_path('file.pdf', 500) pages = convert_from_path('file.pdf', 500, single_file=True) pages[0].save('file.jpg', 'JPEG')
helgis

37

이 간단한 솔루션 PyMuPDF , png 파일로 출력을 찾았습니다 . 라이브러리는 사용하는 렌더링 엔진의 기록 이름 인 "fitz"로 가져옵니다.

import fitz

pdffile = "infile.pdf"
doc = fitz.open(pdffile)
page = doc.loadPage(0)  # number of page
pix = page.getPixmap()
output = "outfile.png"
pix.writePNG(output)

1
답변에 설명을 추가하십시오.
Shanteshwar Inde

1
좋은 라이브러리이며 문제없이 Windows 10에 설치됩니다 (휠이 필요하지 않음). github.com/pymupdf
체 동지

7
이것이 최선의 대답입니다. 이것은 내 OS에 추가 설치가 필요하지 않은 유일한 코드였습니다. Python 스크립트는 Python 시스템 내에서 작업하는 데 중점을 두어야합니다. poppler, pdftoppm, imageMagick 또는 ghostscript 등을 설치할 필요가 없었습니다. (Python 3.6)
ZStoneDPM

1
실제로 다른 설치가 필요합니다 (fitz 라이브러리, 참조하지 않고 가져 오기 및 종속성).이 답변은 불완전합니다 (이 질문의 모든 답변처럼)
Tommaso Guerrini

1
@JJPty 경로에서 가져온 pdf 파일 대신 pdfurl에서 가져올 수 있습니까? 또한 png 파일이 output-png 파일이 아닌 인스 트림 데이터 일 수 있습니까?
Shubham Agrawal

18

pdf2image실제로 Python 라이브러리 (다른 답변에서 사용됨)는으로 시작 pdttoppm 하는 것 이상을 수행하지 subprocess.Popen않으므로 다음은 직접 수행하는 짧은 버전입니다.

PDFTOPPMPATH = r"D:\Documents\software\____PORTABLE\poppler-0.51\bin\pdftoppm.exe"
PDFFILE = "SKM_28718052212190.pdf"

import subprocess
subprocess.Popen('"%s" -png "%s" out' % (PDFTOPPMPATH, PDFFILE))

다음은 pdftoppm(poppler라는 패키지에 포함 된)에 대한 Windows 설치 링크입니다 . http://blog.alivate.com.au/poppler-windows/


4
안녕하세요, pdftoppm에 대한 Windows 설치 링크는 압축 된 파일의 무리 일뿐입니다. 파일을 작동하려면 어떻게해야합니까? 감사!
gaurwraith

14

OS에 Poppler를 설치할 필요가 없습니다. 이것은 작동합니다 :

pip 설치 완드

from wand.image import Image

f = "somefile.pdf"
with(Image(filename=f, resolution=120)) as source: 
    for i, image in enumerate(source.sequence):
        newfilename = f[:-4] + str(i + 1) + '.jpeg'
        Image(image).save(filename=newfilename)

12
지팡이에서 작동하려면 ImageMagick 라이브러리 를 설치해야합니다.
Neeraj Gulia

3
나는 이것을 시도했고 Ghostscript도 설치해야했습니다 (Windows 10 및 Python 3.7 사용). 해냈고 완벽하게 작동했습니다.
jcf

1
f [:-4]는 무엇입니까? 그 다른 곳에서는 참조되지
아리

@Ari f [:-4]는 파일 이름 (string slicing)에서 ".pdf"를 잘라내어 다른 ext.
Fabian

10

@gaurwraith, Windows 용 poppler를 설치하고 다음과 같이 pdftoppm.exe를 사용합니다.

  1. http://blog.alivate.com.au/poppler-windows/ 에서 Poppler의 최신 바이너리 / dll이 포함 된 zip 파일을 다운로드 하고 프로그램 파일 폴더의 새 폴더에 압축을 풉니 다. 예 : "C : \ Program Files (x86) \ Poppler".

  2. SYSTEM PATH 환경 변수에 "C : \ Program Files (x86) \ Poppler \ poppler-0.68.0 \ bin"을 추가합니다.

  3. cmd 라인에서 pdf2image 모듈 설치-> "pip install pdf2image".

  4. 또는 사용자 Basj가 설명한대로 Python의 하위 프로세스 모듈을 사용하여 코드에서 pdftoppm.exe를 직접 실행합니다.

@vishvAs vAsuki,이 코드는 주어진 폴더에있는 하나 이상의 pdf의 모든 페이지에 대해 하위 프로세스 모듈을 통해 원하는 jpg를 생성해야합니다.

import os, subprocess

pdf_dir = r"C:\yourPDFfolder"
os.chdir(pdf_dir)

pdftoppm_path = r"C:\Program Files (x86)\Poppler\poppler-0.68.0\bin\pdftoppm.exe"

for pdf_file in os.listdir(pdf_dir):

    if pdf_file.endswith(".pdf"):

        subprocess.Popen('"%s" -jpeg %s out' % (pdftoppm_path, pdf_file))

또는 pdf2image 모듈 사용 :

import os
from pdf2image import convert_from_path

pdf_dir = r"C:\yourPDFfolder"
os.chdir(pdf_dir)

    for pdf_file in os.listdir(pdf_dir):

        if pdf_file.endswith(".pdf"):

            pages = convert_from_path(pdf_file, 300)
            pdf_file = pdf_file[:-4]

            for page in pages:

               page.save("%s-page%d.jpg" % (pdf_file,pages.index(page)), "JPEG")

이것은 많은 도움이되었습니다. 감사!
Sreekiran

1
이것은 실제로 받아 들여진 대답이어야합니다. Poppler의 설치 바이너리가 무엇을해야 하는지를 쇼
쿤지 메타

3

pdf를 img로 변환하는 데 사용할 수있는 pdftojpg라는 유틸리티입니다.

여기에서 코드를 찾을 수 있습니다 https://github.com/pankajr141/pdf2jpg

from pdf2jpg import pdf2jpg
inputpath = r"D:\inputdir\pdf1.pdf"
outputpath = r"D:\outputdir"
# To convert single page
result = pdf2jpg.convert_pdf2jpg(inputpath, outputpath, pages="1")
print(result)

# To convert multiple pages
result = pdf2jpg.convert_pdf2jpg(inputpath, outputpath, pages="1,0,3")
print(result)

# to convert all pages
result = pdf2jpg.convert_pdf2jpg(inputpath, outputpath, pages="ALL")
print(result)

2
이 자바 일이 파이썬 스크립트를 조작하는 pdf로 가득 찬 내 전체 폴더를 삭제 했습니까? ...?
Ulf Gjerdingen 18.11.26

2

GhostScript는 Linux 기반 시스템의 경우 Poppler보다 훨씬 빠르게 수행됩니다.

다음은 pdf에서 이미지로 변환하는 코드입니다.

def get_image_page(pdf_file, out_file, page_num):
    page = str(page_num + 1)
    command = ["gs", "-q", "-dNOPAUSE", "-dBATCH", "-sDEVICE=png16m", "-r" + str(RESOLUTION), "-dPDFFitPage",
               "-sOutputFile=" + out_file, "-dFirstPage=" + page, "-dLastPage=" + page,
               pdf_file]
    f_null = open(os.devnull, 'w')
    subprocess.call(command, stdout=f_null, stderr=subprocess.STDOUT)

GhostScript는 다음을 사용하여 macOS에 설치할 수 있습니다. brew install ghostscript

다른 플랫폼에 대한 설치 정보는 여기 에서 찾을 수 있습니다 . 시스템에 아직 설치되지 않은 경우.


0

pdf2image의 훨씬 간단한 옵션을 사용합니다.

cd $dir
for f in *.pdf
do
  if [ -f "${f}" ]; then
    n=$(echo "$f" | cut -f1 -d'.')
    pdftoppm -scale-to 1440 -png $f $conv/$n
    rm $f
    mv  $conv/*.png $dir
  fi
done

이것은 좁은 캐스팅 장치를 사용하기위한 루프에있는 bash 스크립트의 작은 부분입니다. 추가 된 pdf 파일 (전체)을 5 초마다 확인하여 처리합니다. 이것은 데모 장치 용이며, 마지막에 원격 서버에서 변환이 수행됩니다. 지금 .PNG로 변환하지만 .JPG도 가능합니다.

이 변환은 A4 형식의 전환과 함께 비디오, 두 개의 부드러운 스크롤 텍스트 및 로고 (세 가지 버전의 전환 포함)를 표시하여 Pi3를 최대 4x 100 % cpu-load로 설정합니다 ;-)


0
from pdf2image import convert_from_path
import glob

pdf_dir = glob.glob(r'G:\personal\pdf\*')  #your pdf folder path
img_dir = "G:\\personal\\img\\"           #your dest img path

for pdf_ in pdf_dir:
    pages = convert_from_path(pdf_, 500)
    for page in pages:
        page.save(img_dir+pdf_.split("\\")[-1][:-3]+"jpg", 'JPEG')

제공 한 코드가 질문에 어떻게 대답하는지 설명했다면 더 나은 대답이 될 것입니다.
pppery

1
@pppery Python은 상당히 읽기 쉽고 주석은 소스 폴더와 출력 폴더를 나타내며 나머지는 영어처럼 읽습니다.
아리

-1

여기에 추가 라이브러리가 필요하지 않고 매우 빠른 솔루션이 있습니다. https://nedbatchelder.com/blog/200712/extracting_jpgs_from_pdfs.html# 에서 찾았 습니다. 더 편리하게 사용할 수 있도록 함수에 코드를 추가했습니다.

def convert(filepath):
    with open(filepath, "rb") as file:
        pdf = file.read()

    startmark = b"\xff\xd8"
    startfix = 0
    endmark = b"\xff\xd9"
    endfix = 2
    i = 0

    njpg = 0
    while True:
        istream = pdf.find(b"stream", i)
        if istream < 0:
            break
        istart = pdf.find(startmark, istream, istream + 20)
        if istart < 0:
            i = istream + 20
            continue
        iend = pdf.find(b"endstream", istart)
        if iend < 0:
            raise Exception("Didn't find end of stream!")
        iend = pdf.find(endmark, iend - 20)
        if iend < 0:
            raise Exception("Didn't find end of JPG!")

        istart += startfix
        iend += endfix
        jpg = pdf[istart:iend]
        newfile = "{}jpg".format(filepath[:-3])
        with open(newfile, "wb") as jpgfile:
            jpgfile.write(jpg)

        njpg += 1
        i = iend

        return newfile

pdf 경로를 인수로 사용하여 convert를 호출하면 함수가 동일한 디렉토리에 .jpg 파일을 생성합니다.


1
이 기술은 질문자가 원하는 이미지로 파일 페이지를 래스터 화하는 대신 파일에 포함 된 이미지를 추출하는 것처럼 보입니다.
Josh Gallagher
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.