it-swarm.com.ru

Python: извлечь страницу из PDF-файла в формате JPEG

В коде Python, как эффективно сохранить определенную страницу в формате PDF в виде файла JPEG? (Вариант использования: у меня есть веб-сервер с флягой Python, на который будут загружены pdf-файлы и сохранены файлы jpeg-s, соответствующие каждой странице.)

Это решение близко, но проблема в том, что он не конвертирует всю страницу в формат JPEG.

20
vishvAs vAsuki

Можно использовать библиотеку 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 pdf2image также упоминает, что он использует pdftoppm и что он требует других установок:

pdftoppm - это часть программного обеспечения, которая совершает магию. Он распространяется как часть большего пакета, называемого poppler . Пользователи Windows должны будут установить poppler для Windows . Пользователям Mac придется установить poppler для Mac . У пользователей Linux будет предварительно установлен pdftoppm с дистрибутивом (протестировано на Ubuntu и Archlinux), если нет, запустите Sudo apt install poppler-utils.

Вот правильная установка для Windows: http://blog.alivate.com.au/poppler-windows/

36
Keval Dave

Библиотека Python pdf2image (используется в другом ответе) на самом деле не делает намного больше, чем просто запуск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)) #have updated the values here

Вот ссылка на установку Windows для pdftoppm (содержится в пакете с именем poppler): http://blog.alivate.com.au/poppler-windows/

8
Basj

@gaurwraith, установите poppler для Windows и используйте pdftoppm.exe следующим образом:

  1. Загрузите Zip-файл с последними двоичными файлами Poppler/dll с http://blog.alivate.com.au/poppler-windows/ и разархивируйте в новую папку в папке с программными файлами. Например: «C:\Program Files (x86)\Poppler».

  2. Добавьте «C:\Program Files (x86)\Poppler\poppler-0.68.0\bin» в переменную среды SYSTEM PATH.

  3. Из строки cmd установите модуль pdf2image -> «pip install pdf2image».

  4. Или, в качестве альтернативы, непосредственно запустите pdftoppm.exe из вашего кода, используя модуль подпроцесса Python, как объяснил пользователь Basj.

@vishvAs vAsuki, этот код должен генерировать jpgs, которые вы хотите через модуль подпроцесса, для всех страниц одного или нескольких файлов PDF в данной папке:

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")
1
photek1944

Нет необходимости устанавливать Poppler в вашей ОС. Это будет работать:

пип установить палочку

from wand.image import Image

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