Bir sayfayı pdf'den jpeg olarak çıkarın


100

Python kodunda, pdf'deki belirli bir sayfayı jpeg dosyası olarak verimli bir şekilde nasıl kaydedebilirim? (Kullanım örneği: pdf'lerin yükleneceği ve her sayfaya karşılık gelen jpeg'lerin depolandığı bir python şişesi web sunucum var.)

Bu çözüm yakındır, ancak sorun tüm sayfayı jpeg'ye dönüştürmemesidir.


1
Görüntüye bağlı olarak, bir png olarak ayıklamak daha iyi olabilir. Bu, sayfanın esas olarak metin içermesi durumunda geçerlidir.
Paul Rooney

Yanıtlar:


134

Pdf2image kitaplığı kullanılabilir.

Bunu kullanarak kurabilirsiniz,

pip install pdf2image

Kurulduktan sonra görüntüleri almak için aşağıdaki kodu kullanabilirsiniz.

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

Sayfaları jpeg formatında kaydetme

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

Düzenleme: Github repo pdf2image ayrıca kullandığından pdftoppmve başka kurulumlar gerektirdiğinden bahseder :

pdftoppm, gerçek sihri gerçekleştiren yazılım parçasıdır. Poppler adlı daha büyük bir paketin parçası olarak dağıtılır . Windows kullanıcılarının Windows için poppler yüklemesi gerekecektir . Mac kullanıcılarının Mac için poppler yüklemesi gerekecek . Linux kullanıcıları, dağıtım ile önceden yüklenmiş pdftoppm'ye sahip olacaklardır (Ubuntu ve Archlinux üzerinde test edilmiştir) eğer değilse, çalıştırın sudo apt install poppler-utils.

Anaconda kullanarak Windows altında en son sürümü aşağıdakileri yaparak yükleyebilirsiniz:

conda install -c conda-forge poppler

not: 0.67'ye kadar olan Windows sürümleri http://blog.alivate.com.au/poppler-windows/ adresinde mevcuttur, ancak 0.68'in Ağustos 2018'de piyasaya sürüldüğünü, bu nedenle en son özellikleri veya hata düzeltmelerini alamayacağınızı unutmayın .


4
Merhaba, poppler sadece sıkıştırılmış bir dosya, hiçbir şey yüklemiyor, dll'ler veya bin dosyalarıyla ne yapılması gerekiyor?
gaurwraith

@gaurwraith: Poppler için aşağıdaki bağlantıyı kullanın . Bazı nedenlerden dolayı Rodrigo'daki açıklamadaki bağlantı, github deposundaki ile aynı değil.
Tobias

1
@elPastor, yalnızca belirtilen sayfayı dönüştürmek için, ilk_sayfa ve son_sayfayı, dönüşüm_from_path işlevinin bağımsız değişkenine ekleyebilirsiniz
Keval Dave

1
@Jacob 500 dpi'dir. Gerekli çözünürlük ve mevcut hesaplama arasında değiş tokuş. Deneylerimde 500, çoğu durumda iyi çalıştı, 300 ise bana düşük çözünürlüklü görüntüler verdi.
Keval Dave

1
PDF'nin ilk sayfasını dönüştürmek ve başka hiçbir şeyi dönüştürmek için bu işe 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')
yaramaz

38

Bu basit çözümü, PyMuPDF'yi png dosyasına çıktı olarak buldum . Kitaplığın, kullandığı işleme motorunun tarihsel adı olan "fitz" olarak içe aktarıldığını unutmayın.

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
Lütfen cevabınıza açıklama ekleyin.
Shanteshwar Inde

1
İyi bir kitaplık ve Windows 10'a sorunsuz yüklenir (tekerlek gerekmez). github.com/pymupdf
Yoldaş Che

7
EN İYİ cevap budur. Bu, işletim sistemime ek bir kurulum gerektirmeyen tek koddu. Python betikleri, Python sistemi içinde çalışmaya odaklanmalıdır. Poppler, pdftoppm, imageMagick veya ghostscript vb. Yüklememe gerek yoktu (Python 3.6)
ZStoneDPM

1
Aslında başka bir kurulum gerektiriyor (fitz kütüphanesi, referans alınmadan ithal edildi ve bağımlılıkları), bu cevap eksik (bu sorudaki tüm cevaplar gibi)
Tommaso Guerrini

1
@JJPty Yolundan alınan pdf dosyası yerine pdfurl'den alabilir miyiz? Ayrıca, png dosyasının çıktı-png dosyası yerine yayın içi veri olması mümkün müdür?
Shubham Agrawal

19

Python kütüphanesi pdf2imageaslında (diğer yanıtında kullanılan) yapmaz sadece başlatılması çok daha pdttoppm ile subprocess.Popenişte doğrudan yapıyor kısa versiyonu,:

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))

Windows kurulum bağlantısı pdftoppm(poppler adlı bir pakette bulunur): http://blog.alivate.com.au/poppler-windows/


4
Merhaba, pdftoppm için Windows kurulum bağlantısı sadece bir grup sıkıştırılmış dosyadır, çalışmalarını sağlamak için bunlarla ne yapmanız gerekir? Teşekkürler!
gaurwraith

14

İşletim sisteminize Poppler yüklemenize gerek yoktur. Bu çalışacak:

pip kurulum Wand

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
Değnek üzerinde çalışmak için ImageMagick kitaplığının kurulması gerekir.
Neeraj Gulia

3
Bunu denedim ve Ghostscript'i de yüklemem gerekiyordu (Windows 10 ve Python 3.7 kullanarak). Yaptı ve mükemmel çalıştı.
jcf

1
f [: - 4] ne için? başka hiçbir yerde referansta bulunulmamış
Ari

@Ari f [: - 4], diğer ext ile yeni dosya adı oluşturmak için dosya adından (dize dilimleme) ".pdf" dosyasını kesecektir.
Fabian

11

@gaurwraith, Windows için poppler'ı yükleyin ve aşağıdaki gibi pdftoppm.exe'yi kullanın:

  1. Poppler'in en son ikili dosyalarını / dll'lerini içeren zip dosyasını http://blog.alivate.com.au/poppler-windows/ adresinden indirin ve program dosyaları klasörünüzdeki yeni bir klasöre açın. Örneğin: "C: \ Program Files (x86) \ Poppler".

  2. SYSTEM PATH ortam değişkeninize "C: \ Program Files (x86) \ Poppler \ poppler-0.68.0 \ bin" ekleyin.

  3. Cmd satırından pdf2image modülünü kurun -> "pip install pdf2image".

  4. Veya alternatif olarak, kullanıcı Basj tarafından açıklandığı gibi Python'un alt işlem modülünü kullanarak kodunuzdan pdftoppm.exe'yi doğrudan çalıştırın.

@vishvAsuki, bu kod, belirli bir klasördeki bir veya daha fazla pdf'nin tüm sayfaları için alt işlem modülü aracılığıyla istediğiniz jpgs'yi oluşturmalıdır:

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))

Veya pdf2image modülünü kullanarak:

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

Bu çok yardımcı oldu. Teşekkürler!
Sreekiran

1
Bu aslında kabul edilen cevap olmalıdır. Poppler için kurulu ikili dosyalar ile ne yapılacağını gösterir
Kunj Mehta

3

Pdf'i img'ye dönüştürmek için kullanılabilecek pdftojpg adlı bir yardımcı programdır.

Kodu burada bulabilirsiniz 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
bu java şeyi, python komut dosyalarını işleyen pdf ile dolu tüm klasörümü sildi mi ....?
Ulf Gjerdingen

2

GhostScript, Linux tabanlı bir sistem için Poppler'dan çok daha hızlı çalışır.

Aşağıda pdf'den görüntüye dönüştürme kodu verilmiştir.

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, aşağıdakiler kullanılarak macOS'a yüklenebilir: brew install ghostscript

Diğer platformlar için kurulum bilgileri burada bulunabilir . Zaten sisteminize yüklenmemişse.


0

Ben (belki) çok daha basit bir pdf2image seçeneği kullanıyorum:

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

Bu, dar bir döküm cihazının kullanımı için bir döngüdeki bir bash betiğinin küçük bir parçasıdır. Eklenen pdf dosyalarını (tümü) 5 saniyede bir kontrol eder ve işler. Bu bir demo cihaz içindir, sonunda dönüştürme uzaktaki bir sunucuda yapılacaktır. Şimdi .PNG'ye dönüştürmek mümkündür, ancak .JPG de mümkündür.

A4 formatındaki geçişlerle birlikte bu dönüştürme, bir video, iki yumuşak kayan metin ve bir logo (üç versiyonda geçiş ile) görüntüleme, Pi3'ü en fazla 4x% 100 cpu yüküne ayarlar ;-)


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')

Verdiğiniz kodun soruyu nasıl yanıtladığını açıklarsanız, bu daha iyi bir cevap olacaktır.
pppery

2
@pppery Python oldukça okunabilir, yorumlar kaynak klasörü ve çıktı klasörünü gösterir, geri kalanı İngilizce gibi okunur.
Ari

-1

İşte ek kitaplık gerektirmeyen ve çok hızlı bir çözüm. Bu, şu adresten bulundu: https://nedbatchelder.com/blog/200712/extracting_jpgs_from_pdfs.html# Kodu daha kullanışlı hale getirmek için bir işleve ekledim.

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

Bağımsız değişken olarak pdf yolu ile convert'ü çağırın ve işlev aynı dizinde bir .jpg dosyası oluşturacaktır


1
Bu teknik, dosyanın bir sayfasını sorgulayan kişinin istediği bir görüntü olarak rasterleştirmek yerine dosyaya gömülü görüntüleri çıkarıyor gibi görünüyor.
Josh Gallagher
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.