জেপিইগ হিসাবে পিডিএফ থেকে একটি পৃষ্ঠা বের করুন


100

পাইথন কোডে, কীভাবে কার্যকরভাবে কোনও জেপিইগ ফাইল হিসাবে পিডিএফ-তে একটি নির্দিষ্ট পৃষ্ঠা সংরক্ষণ করতে হয়? (কেস ব্যবহার করুন: আমি একটি পাইথন ফ্লাস্ক ওয়েব সার্ভার যেখানে পিডিএফ-গুলি আপলোড করা হবে এবং প্রতিটি পৃষ্ঠার সাথে সম্পর্কিত জেপিগ-এস স্টোর রয়েছে))

এই সমাধানটি নিকটে, তবে সমস্যাটি হ'ল এটি পুরো পৃষ্ঠাটিকে জেপিগে রূপান্তর করে না।


4
চিত্রের উপর নির্ভর করে পিএনজি হিসাবে উত্তোলন করা ভাল। পৃষ্ঠাটিতে মূলত পাঠ্য থাকলে এটি প্রযোজ্য।
পল রুনি

উত্তর:


133

Pdf2image লাইব্রেরি ব্যবহার করা যেতে পারে।

আপনি এটি ব্যবহার করে সহজেই ইনস্টল করতে পারেন,

pip install pdf2image

ইনস্টল হয়ে গেলে আপনি চিত্রগুলি পেতে নিম্নলিখিত কোডটি ব্যবহার করতে পারেন।

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

জেপিগ ফর্ম্যাটে পৃষ্ঠাগুলি সংরক্ষণ করা হচ্ছে

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

সম্পাদনা করুন: গিথুব রেপো পিডিএফ 2 চিত্রটিতে এটি উল্লেখ করা হয়েছে যে এটি ব্যবহার করে 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
হাই, পপলারটি কেবল একটি জিপ করা ফাইল, কোনও কিছু ইনস্টল করে না, ডেলের বা বিন ফাইলগুলির সাথে কী করা উচিত?
গৌরাইথ

@gaurwraith: পপলারের জন্য নিম্নলিখিত লিঙ্কটি ব্যবহার করুন । কোনও কারণে রদ্রিগো থেকে বর্ণিত লিঙ্কটি গিথুব রেপোতে একই নয়।
টোবিয়াস

4
@ এলপাস্টার আপনি কেবল নির্দিষ্ট পৃষ্ঠায় রূপান্তর করতে রূপান্তর_ফর্ম_পথ ফাংশনের যুক্তিতে প্রথম_ পৃষ্ঠার এবং শেষের পৃষ্ঠাটি যুক্ত করতে পারেন
কেভাল ডেভ

4
@ জ্যাকব 500 ডিপিআই এটি প্রয়োজনীয় রেজোলিউশন এবং উপলব্ধ গণনার উপর ট্রেড অফ। আমার পরীক্ষায়, 500 বেশিরভাগ ক্ষেত্রে বেশিরভাগ ক্ষেত্রে ভাল কাজ করেছে এবং 300 জন আমাকে কম রেজ ইমেজ পেয়েছে।
কেভাল ডেভ

4
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')
পিডিএফের

38

আমি পাইমুপিডিএফ , পিএনজি ফাইলের এই সহজ সমাধানটি পেয়েছি । নোট করুন যে গ্রন্থাগারটি "ফিটজ" হিসাবে আমদানি করা হয়, এটি ব্যবহৃত রেন্ডারিং ইঞ্জিনের একটি nameতিহাসিক নাম।

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)

4
আপনার উত্তরে ব্যাখ্যা যোগ করুন।
শান্তেশ্বর ইন্দে

4
একটি ভাল গ্রন্থাগার এবং এটি কোনও সমস্যা ছাড়াই উইন্ডোজ 10 এ ইনস্টল করে (কোনও চাকার প্রয়োজন নেই)। github.com/pymupdf
কমরেড চে

7
এটি সেরা উত্তর। এটিই কেবলমাত্র কোড যা আমার ওএসে অতিরিক্ত ইনস্টলেশন প্রয়োজন হয় না। পাইথন স্ক্রিপ্টগুলিতে পাইথন সিস্টেমের মধ্যে কাজ করা উচিত। আমার পপলার, পিডিএফটিপপিএম, ইমেজম্যাগিক বা ভূস্ট্রিপ্ট ইত্যাদি ইনস্টল করার দরকার নেই (পাইথন ৩.6)
জেডস্টোনডিপিএম

4
আসলে এটির জন্য আরও একটি ইনস্টলেশন প্রয়োজন (ফিটজ লাইব্রেরি, এমনকি উল্লেখ করা ছাড়াই আমদানি করা এবং এর নির্ভরতা), এই উত্তরটি অসম্পূর্ণ (এই প্রশ্নের উত্তরগুলির মতো)
টমাসো গেরিণী

4
@ জেজেপিটি পিডিএফ ফাইলের পরিবর্তে পথ থেকে নেওয়া কি আমরা পিডিএফুরল থেকে নিতে পারি? এছাড়াও, পিএনজি ফাইলের আউটপুট-পিএনজি ফাইলের পরিবর্তে ইন-স্ট্রিম ডেটা থাকা কি সম্ভব?
শুভম অগ্রওয়াল

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
হাই, পিডিফটপপ্যামের উইন্ডোজ ইনস্টলেশন লিঙ্কটি কেবল জিপড ফাইলগুলির একটি গুচ্ছ, তাদের কাজ করতে আপনাকে কী করতে হবে? ধন্যবাদ!
গৌরাইথ

14

আপনার ওএসে পপ্পলার ইনস্টল করার দরকার নেই। এটি কাজ করবে:

পিপ ইনস্টল 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)


4
আমি এটি চেষ্টা করেছি এবং ঘোস্টস্ক্রিপ্টও ইনস্টল করতে হবে (উইন্ডোজ 10 এবং পাইথন ৩.7 ব্যবহার করে)। এটি করেছে এবং এটি পুরোপুরি কাজ করেছে।
jcf

4
এফ [: - 4] কিসের জন্য? এটি অন্য কোথাও উল্লেখ করা হয়নি
এরি

@ আরি চ [: - 4] ফাইলের নাম থেকে ".pdf" কেটে ফেলবে (স্ট্রিং স্লাইসিং) অন্য এক্সট্র্যাক্ট সহ নতুন ফাইল নাম তৈরি করতে।
ফ্যাবিয়ান

10

@gaurwraith, উইন্ডোজের জন্য পপ্পলার ইনস্টল করুন এবং পিডিএফটিপপিএম.এক্সি নীচে ব্যবহার করুন:

  1. Http://blog.alivate.com.au/poppler-windows/ থেকে পপলারের সর্বশেষ বাইনারি / ডলস সহ জিপ ফাইল ডাউনলোড করুন এবং আপনার প্রোগ্রাম ফাইল ফোল্ডারে একটি নতুন ফোল্ডারে আনজিপ করুন। উদাহরণস্বরূপ: "সি: \ প্রোগ্রাম ফাইল (x86) \ পপলার"।

  2. আপনার সিস্টেম প্যাথ পরিবেশ পরিবর্তনশীলটিতে "সি: \ প্রোগ্রাম ফাইলগুলি (x86) \ পপলার \ পপ্প্লার-0.68.0 \ বিন" যুক্ত করুন।

  3. সেন্টিমিডি লাইন থেকে পিডিএফ 2 ইমেজ মডিউল ইনস্টল করুন -> "পিপ ইনস্টল পিডিএফ 2 ইমেজ"।

  4. অথবা বিকল্পভাবে, বাসড দ্বারা বর্ণিত পাইথনের সাবপ্রসেস মডিউলটি ব্যবহার করে আপনার কোড থেকে সরাসরি পিডিএফটোপএম.এক্স.কে এক্সিকিউট করুন।

@ বিশ্ববাসী আসুকি, এই কোডটি প্রদত্ত ফোল্ডারে এক বা একাধিক পিডিএফ-এর সমস্ত পৃষ্ঠার জন্য সাবপ্রসেস মডিউলটির মাধ্যমে আপনি যে জেপজিগুলি চান তা তৈরি করতে হবে:

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

এটি অনেক সাহায্য করেছিল। ধন্যবাদ!
শ্রীকিরণ

4
এটি আসলে গ্রহণযোগ্য উত্তর হওয়া উচিত। পপলারের জন্য ইনস্টলড বাইনারিগুলির সাথে কী করতে হবে তা দেখায়
কুঞ্জ মেহতা

3

তাদের পিডিএফটোজপিজি নামে একটি ইউটিলিটি যা পিডিএফকে ইমগিতে রূপান্তর করতে ব্যবহার করা যেতে পারে

আপনি কোডটি এখানে পাবেন 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)

4
এই জাভা জিনিসটি কি আমার পুরো ফোল্ডারটি পিডিএফ ম্যানিপুলেটিং করে পাইথন স্ক্রিপ্টগুলি মুছে ফেলেছিল ....?
উল্ফ জেরডিনজেন

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)

ঘোস্টস্ক্রিপ্ট ম্যাকোস ব্যবহার করে ইনস্টল করা যেতে পারে brew install ghostscript

অন্যান্য প্ল্যাটফর্মগুলির জন্য ইনস্টলেশন সম্পর্কিত তথ্য এখানে পাওয়া যাবে । যদি এটি ইতিমধ্যে আপনার সিস্টেমে ইনস্টল করা না থাকে।


0

আমি পিডিএফ 2 ইমেজের একটি (সম্ভবত) অনেক সহজ বিকল্প ব্যবহার করছি:

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

সংকীর্ণ castালাই ডিভাইস ব্যবহারের জন্য এটি লুপের ব্যাশ স্ক্রিপ্টের একটি ছোট্ট অংশ। যুক্ত পিডিএফ ফাইলগুলিতে (সমস্ত) প্রতি 5 সেকেন্ডে পরীক্ষা করে সেগুলি প্রক্রিয়া করে। এটি একটি ডেমো ডিভাইসের জন্য, শেষে রূপান্তরটি একটি দূরবর্তী সার্ভারে করা হবে। এখন .PNG এ রূপান্তর করা হচ্ছে, তবে .জেপিজিও সম্ভব।

এই রূপান্তরকরণের সাথে সাথে, এ 4 ফর্ম্যাটে ট্রানজিশনের সাথে একটি ভিডিও প্রদর্শন, দুটি মসৃণ স্ক্রোলিং পাঠ এবং একটি লোগো (তিন সংস্করণে রূপান্তর সহ) পাই 3 কে 4x 100% সিপিইউ-লোড সেট করে ;-)


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

আপনি প্রদত্ত কোডটি কীভাবে প্রশ্নের উত্তর দেয় তা যদি আপনি ব্যাখ্যা করেন তবে এটি আরও ভাল উত্তর হবে।
পিপ্পারি

4
@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 ফাইল তৈরি করবে


4
এই কৌশলটি দেখে মনে হচ্ছে এটি ফাইলের কোনও পৃষ্ঠাকে চিত্র হিসাবে ছড়িয়ে দেওয়ার পরিবর্তে ফাইলটিতে এমবেড করা চিত্রগুলি উত্তোলন করে যা প্রশ্নকর্তা যা চেয়েছিলেন সেটিই।
জোশ গালাগের
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.