Pdf से jpeg के रूप में एक पेज निकालें


95

अजगर कोड में, पीडीएफ के रूप में एक निश्चित पृष्ठ को कुशलतापूर्वक एक जेपीईजी फ़ाइल के रूप में कैसे सहेजा जाए? (केस का उपयोग करें: मेरे पास एक अजगर फ्लास्क वेब सर्वर है जहां पीडीएफ-एस अपलोड किया जाएगा और प्रत्येक पृष्ठ पर स्टोर किए गए जेपीईजी-एस।)

यह समाधान करीब है, लेकिन समस्या यह है कि यह पूरे पृष्ठ को जेपीईजी में परिवर्तित नहीं करता है।


1
छवि के आधार पर, पीएनजी के रूप में निकालना बेहतर हो सकता है। यदि पृष्ठ में मुख्य रूप से पाठ है तो यह लागू होगा।
पॉल रूनी

जवाबों:


125

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

संपादित करें: जीथूब रेपो pdf2image में यह भी उल्लेख किया गया है कि यह उपयोग करता है pdftoppmऔर इसके लिए अन्य संस्थापनों की आवश्यकता है:

pdftoppm सॉफ्टवेयर का एक टुकड़ा है जो वास्तविक जादू करता है। इसे एक बड़े पैकेज के हिस्से के रूप में वितरित किया जाता है जिसे पॉपलर कहा जाता है । विंडोज उपयोगकर्ताओं को विंडोज के लिए पॉप्लर इंस्टॉल करना होगा । मैक उपयोगकर्ताओं को मैक के लिए पॉप्लर इंस्टॉल करना होगा । लिनक्स उपयोगकर्ताओं के पास डिस्ट्रो के साथ प्री-इंस्टॉल्ड होगा (यदि उबंटू और आर्कलिनक्स पर परीक्षण किया गया है), यह नहीं है sudo apt install poppler-utils

आप विंडोज का नवीनतम संस्करण एनाकोंडा का उपयोग करके कर सकते हैं:

conda install -c conda-forge poppler

नोट: 0.67 तक के विंडोज संस्करण http://blog.alivate.com.au/poppler-windows/ पर उपलब्ध हैं, लेकिन ध्यान दें कि 0.68 अगस्त 2018 में जारी किया गया था, इसलिए आपको नवीनतम सुविधाएँ या बग फिक्स नहीं मिलेंगे।


4
नमस्ते, poppler सिर्फ एक ज़िपित फ़ाइल है, कुछ भी स्थापित नहीं करता है, किसी को dll या बिन फ़ाइलों के साथ क्या करना है?
गौरवथ

@gaurwraith: पॉपलर के लिए निम्न लिंक का उपयोग करें । किसी कारण से रोड्रिगो के वर्णन में लिंक गीथूब रेपो में नहीं है।
टोबियास

@Keval डेव क्या आपने विंडोज मशीन पर poppler स्थापित किया है और pdf2image की कोशिश की है? कृपया कौन सा विंडोज?
SKR

1
@elPastor आप केवल निर्दिष्ट पृष्ठ को परिवर्तित करने के लिए Convert_from_path फ़ंक्शन के तर्क में first_page और last_page जोड़ सकते हैं
दवे

1
@ जेकॉब 500 डीपीआई है। यह आवश्यक संकल्प और उपलब्ध गणना पर व्यापार करता है। मेरे प्रयोगों में, 500 ने अधिकांश मामलों में अच्छी तरह से काम किया जबकि 300 ने मुझे कम रेज चित्र दिए।
डेव

36

मुझे यह सरल समाधान मिला, PyMuPDF , पीएनजी फाइल का आउटपुट। ध्यान दें कि लाइब्रेरी को "फिटज़" के रूप में आयात किया गया है, इसका उपयोग करने वाले इंजन के लिए एक ऐतिहासिक नाम।

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
कृपया अपने उत्तर में स्पष्टीकरण जोड़ें।
१31:

1
एक अच्छी लाइब्रेरी और यह विंडोज़ 10 पर बिना किसी समस्या के (बिना किसी पहिये के) स्थापित हो जाता है। github.com/pymupdf
कॉमरेड चे

7
यह सबसे अच्छा जवाब है। यह एकमात्र कोड था जिसे मेरे OS पर अतिरिक्त स्थापना की आवश्यकता नहीं थी। अजगर लिपियों को पायथन सिस्टम के भीतर काम करने पर ध्यान देना चाहिए। मुझे poppler, pdftoppm, imageMagick या ghostscript, आदि को स्थापित करने की आवश्यकता नहीं है (Python 3.6)
ZStoneDPM

1
वास्तव में इसे एक और स्थापना की आवश्यकता होती है (फिटज़ लाइब्रेरी, जिसे बिना संदर्भित और इसकी निर्भरता के लिए भी आयात किया जाता है), यह उत्तर अधूरा है (इस प्रश्न के सभी उत्तरों की तरह)
टॉमासो गुरेरिनी

1
@JJPty रास्ते से ली गई पीडीएफ फाइल के बजाय, क्या हम pdfurl से ले सकते हैं? इसके अलावा, क्या आउटपुट-पीएनजी फ़ाइल के बजाय पीएनजी फ़ाइल इन-स्ट्रीम डेटा होना संभव है?
शुभम अग्रवाल

18

अजगर पुस्तकालय 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))

यहाँ के लिए विंडोज इंस्टॉलेशन लिंक है pdftoppm(पॉप्लर नामक पैकेज में): http://blog.alivate.com.au/poppler-windows/


4
नमस्ते, pdftoppm के लिए विंडोज इंस्टॉलेशन लिंक ज़िपित फ़ाइलों का सिर्फ एक गुच्छा है, आपको उन्हें काम करने के लिए क्या करना है? धन्यवाद!
गौरवथ

14

आपके OS पर Poppler स्थापित करने की कोई आवश्यकता नहीं है। यह काम करेगा:

पाइप स्थापित वैंड

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)

10
छड़ी पर काम करने के लिए ImageMagick लाइब्रेरी स्थापित करने की आवश्यकता है।
नीरज गुलिया

2
मैंने यह कोशिश की और साथ ही घोस्टस्क्रिप्ट को स्थापित करने की आवश्यकता है (विंडोज 10 और पायथन 3.7 का उपयोग करके)। यह किया और यह पूरी तरह से काम किया।
जेसीएफ

1
whats f [: - 4] के लिए? इसका कहीं और संदर्भ नहीं है
अरी

@Ari f [: - 4] फ़ाइल नाम (स्ट्रिंग स्लाइसिंग) से ".pdf" को अन्य एक्सट्रा के साथ नया फ़ाइल नाम बनाने में कटौती करेगा।
फाबियान

9

@gaurwraith, विंडोज के लिए पॉप्लर स्थापित करें और pdftoppm.exe का उपयोग करें:

  1. पॉपलर की नवीनतम बायनेरिज़ / dlls के साथ http://blog.alivate.com.au/poppler-windows/ से ज़िप फ़ाइल डाउनलोड करें और अपने प्रोग्राम फ़ाइलों के फ़ोल्डर में एक नए फ़ोल्डर में अनज़िप करें। उदाहरण के लिए: "C: \ Program Files (x86) \ Poppler"।

  2. अपने सिस्टम पथ पर्यावरण चर में "C: \ Program Files (x86) \ Poppler \ poppler-0.68.0 \ bin" जोड़ें।

  3. Cmd लाइन से pdf2image मॉड्यूल इंस्टॉल करें -> "पाइप इंस्टॉल करें pdf2image"।

  4. या वैकल्पिक रूप से, पायस के सबप्रोसेस मॉड्यूल का उपयोग करके अपने कोड से सीधे pdftoppm.exe निष्पादित करें जैसा कि उपयोगकर्ता बसज द्वारा समझाया गया है।

@vishvAs vAsuki, इस कोड को आपके द्वारा दिए गए फ़ोल्डर में एक या एक से अधिक pdfs के सभी पृष्ठों के लिए सबप्रोसेस मॉड्यूल के माध्यम से इच्छित jpgs उत्पन्न करना चाहिए:

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
यह वास्तव में स्वीकृत उत्तर होना चाहिए। दिखाता है कि पॉपलर के लिए स्थापित बायनेरिज़ के साथ क्या करना है
कुंज मेहता

3

उनकी एक उपयोगिता है जिसे 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)

2
क्या यह जावा बात सिर्फ मेरे पूरे फ़ोल्डर को नष्ट कर दिया python लिपियों में हेरफेर करते हुए ....?
उल्फ गजेरडिंगेन

2

घोस्टस्क्रिप्ट लिनक्स आधारित प्रणाली के लिए पॉपलर की तुलना में बहुत तेज प्रदर्शन करता है।

छवि रूपांतरण के लिए पीडीएफ का कोड निम्नलिखित है।

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)

घोस्टस्क्रिप्ट का उपयोग करके 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

यह एक संकीर्ण कास्टिंग डिवाइस के उपयोग के लिए लूप में बैश स्क्रिप्ट का एक छोटा सा हिस्सा है। जोड़े गए पीडीएफ फाइलों (सभी) पर हर 5 सेकंड की जांच करता है और उन्हें संसाधित करता है। यह एक डेमो डिवाइस के लिए है, अंत में रिमोट सर्वर पर परिवर्तित किया जाएगा। अब .PNG में परिवर्तित, लेकिन .JPG भी संभव है।

यह परिवर्तित करना, A4 प्रारूप पर संक्रमण के साथ, एक वीडियो प्रदर्शित करना, दो चिकनी स्क्रॉलिंग ग्रंथ और एक लोगो (तीन संस्करणों में संक्रमण के साथ) Pi3 को 4x 100% cpu- लोड;


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

यह एक बेहतर उत्तर होगा यदि आपने बताया कि किस तरह से आपने कोड को प्रश्न का उत्तर दिया।
पिपरी

1
@pppery पायथन काफी पठनीय है, टिप्पणी स्रोत फ़ोल्डर और आउटपुट फ़ोल्डर को इंगित करती है, बाकी अंग्रेजी की तरह पढ़ती है।
अरी

-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

पीडीएफ पथ के साथ कॉल को तर्क और फ़ंक्शन के रूप में एक ही निर्देशिका में .jpg फ़ाइल बनाएंगे


1
यह तकनीक ऐसी दिखती है कि यह उन चित्रों को निकालता है, जो फ़ाइल के एक पृष्ठ को एक छवि के रूप में रेखांकन करने के बजाय फ़ाइल में एम्बेड किया गया है, जो प्रश्नकर्ता चाहता था।
जोश गलाघर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.