Извлечь страницу из PDF в формате JPEG
В коде python, как эффективно сохранить определенную страницу в pdf как файл jpeg? (Используйте случай: у меня есть веб-сервер на флизе python, где будут загружены pdf файлы, а jpeg-s, соответствующие каждой странице, - это магазины.)
Это решение близко, но проблема в том, что он не конвертирует всю страницу в jpeg.
Ответы
Ответ 1
Можно использовать библиотеку 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/
Ответ 2
Библиотека 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/
Ответ 3
Нет необходимости устанавливать Poppler в вашей ОС. Это будет работать:
пип установить палочку
from wand.image import Image
f = "somefile.pdf"
with(Image(filename=f, 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)
Ответ 4
@gaurwraith, установите poppler для Windows и используйте pdftoppm.exe следующим образом:
-
Загрузите zip файл с последними бинарниками /dll Poppler с http://blog.alivate.com.au/poppler-windows/ и распакуйте в новую папку в папке с вашими программными файлами. Например: "C:\Program Files (x86)\Poppler".
-
Добавьте "C:\Program Files (x86)\Poppler\poppler-0.68.0\bin" в переменную среды SYSTEM PATH.
-
Из строки cmd установите модуль pdf2image → "pip install pdf2image".
- Или, альтернативно, непосредственно выполните 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")
Ответ 5
Я нашел это простое решение, PyMuPDF, вывод в файл PNG
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)
Ответ 6
Их утилита называется pdftojpg, которая может быть использована для преобразования pdf в img
Вы можете найти здесь код 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)
Ответ 7
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')
Ответ 8
Я бы посоветовал вам использовать Aspose.PDF Cloud SDK для преобразования PDF в JPEG. Вот пример:
curl -v "https://api.aspose.cloud/v1.1/pdf/test.pdf/pages/1/convert/jpeg?outpath=test.jpeg" -X PUT -H "Content-Type: application/json" -H "Accept: application/json" -H "Authorization: ..."
Надеюсь, поможет. В противном случае, не стесняйтесь спрашивать меня.
Примечание: я работаю в качестве разработчика Evangelist в Aspose.
Ответ 9
Я использую (возможно) гораздо более простой вариант 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 в цикле для использования узкого устройства приведения.
Проверяет каждые 5 секунд на добавленные файлы PDF (все) и обрабатывает их.
Это для демонстрационного устройства, в конце преобразование будет сделано на удаленном сервере. Теперь можно конвертировать в .PNG, но также возможен .JPG.
Это преобразование, вместе с переходами в формате А4, отображением видео, двумя текстами с плавной прокруткой и логотипом (с переходом в трех версиях) устанавливает Pi3 почти на 4x 100% загрузки процессора ;-)