แยกหน้าจาก pdf เป็น jpeg


100

ในรหัส python วิธีบันทึกหน้าบางหน้าใน pdf เป็นไฟล์ jpeg อย่างมีประสิทธิภาพ (กรณีการใช้งาน: ฉันเป็นเว็บเซิร์ฟเวอร์ python flask ที่จะอัปโหลด pdf-s และ jpeg-s ที่สอดคล้องกับแต่ละเพจคือร้านค้า)

วิธีนี้อยู่ใกล้ แต่ปัญหาคือไม่ได้แปลงทั้งหน้าเป็น jpeg


1
การแตกไฟล์เป็น png อาจจะดีกว่าทั้งนี้ขึ้นอยู่กับรูปภาพ สิ่งนี้จะใช้ได้หากหน้าเว็บมีข้อความเป็นหลัก
Paul Rooney

คำตอบ:


133

สามารถใช้ไลบรารี 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 repo pdf2imageยังระบุว่าใช้pdftoppmและต้องมีการติดตั้งอื่น ๆ :

pdftoppm เป็นซอฟต์แวร์ที่สร้างเวทมนตร์ที่แท้จริง มันมีการกระจายเป็นส่วนหนึ่งของแพคเกจมากขึ้นเรียกว่าpoppler ผู้ใช้ Windows จะต้องติดตั้งpoppler สำหรับ Windows ผู้ใช้ Mac จะต้องติดตั้งpoppler สำหรับ Mac ผู้ใช้ลินุกซ์จะมี pdftoppm ที่ติดตั้งกับ distro (ทดสอบบน Ubuntu และ ArchLinux) sudo apt install poppler-utilsหากยังไม่ได้วิ่ง

คุณสามารถติดตั้งเวอร์ชันล่าสุดใน Windows โดยใช้ anaconda โดยทำดังนี้

conda install -c conda-forge poppler

หมายเหตุ: Windows เวอร์ชันไม่เกิน 0.67 มีอยู่ที่http://blog.alivate.com.au/poppler-windows/แต่โปรดทราบว่า 0.68 เปิดตัวในเดือนสิงหาคม 2018ดังนั้นคุณจะไม่ได้รับคุณสมบัติล่าสุดหรือการแก้ไขข้อบกพร่อง


4
สวัสดี poppler เป็นเพียงไฟล์ซิปไม่ได้ติดตั้งอะไรเลยควรทำอย่างไรกับไฟล์ dll หรือ bin
gaurwraith

@gaurwraith: ใช้ต่อไปนี้เชื่อมโยงไปยัง poppler ด้วยเหตุผลบางประการลิงก์ในคำอธิบายจาก Rodrigo จึงไม่เหมือนกับใน github repo
Tobias

1
@elPastor คุณสามารถเพิ่ม first_page และ last_page ในอาร์กิวเมนต์ของฟังก์ชัน conver_from_path เพื่อแปลงหน้าที่ระบุเท่านั้น
Keval Dave

1
@Jacob 500 คือ dpi แลกกับความละเอียดที่ต้องการและการคำนวณที่มีอยู่ ในการทดลองของฉัน 500 ทำงานได้ดีส่วนใหญ่ในขณะที่ 300 ทำให้ฉันได้ภาพ rez ต่ำ
Keval Dave

1
สำหรับการแปลงหน้าแรกของ PDF และไม่มีอะไรอื่นให้ใช้งานได้: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')
helgis

38

ฉันพบวิธีง่ายๆนี้PyMuPDFส่งออกไปยังไฟล์ png โปรดทราบว่าไลบรารีจะถูกอิมพอร์ตเป็น "fitz" ซึ่งเป็นชื่อทางประวัติศาสตร์สำหรับเอ็นจินการเรนเดอร์ที่ใช้

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
โปรดเพิ่มคำอธิบายในคำตอบของคุณ
Shanteshwar Inde

1
ไลบรารีที่ดีและติดตั้งบน Windows 10 โดยไม่มีปัญหา (ไม่ต้องใช้ล้อ) github.com/pymupdf
สหายเช

7
นี่คือคำตอบที่ดีที่สุด นี่เป็นรหัสเดียวที่ไม่ต้องติดตั้งเพิ่มเติมในระบบปฏิบัติการของฉัน สคริปต์ Python ควรเน้นการทำงานภายในระบบ Python ฉันไม่จำเป็นต้องติดตั้ง poppler, pdftoppm, imageMagick หรือ ghostscript ฯลฯ (Python 3.6)
ZStoneDPM

1
จริงๆแล้วต้องมีการติดตั้งอื่น (ไลบรารี fitz นำเข้าโดยไม่ได้อ้างถึงและการอ้างอิง) คำตอบนี้ไม่สมบูรณ์ (เช่นเดียวกับคำตอบทั้งหมดในคำถามนี้)
Tommaso Guerrini

1
@JJPty แทนที่จะเป็นไฟล์ pdf ที่นำมาจากเส้นทางเราสามารถใช้จาก pdfurl ได้หรือไม่? นอกจากนี้ยังเป็นไปได้หรือไม่ที่ไฟล์ png จะเป็นข้อมูลในสตรีมแทนที่จะเป็นไฟล์ output-png?
Shubham Agrawal

18

ไลบรารี 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))

นี่คือลิงค์การติดตั้ง Windows สำหรับpdftoppm(อยู่ในแพ็คเกจชื่อ poppler): http://blog.alivate.com.au/poppler-windows/


4
สวัสดีลิงค์การติดตั้ง Windows สำหรับ pdftoppm เป็นเพียงไฟล์บีบอัดคุณต้องทำอย่างไรกับไฟล์เหล่านี้เพื่อให้ใช้งานได้ ขอบคุณ!
gaurwraith

14

ไม่จำเป็นต้องติดตั้ง Poppler บนระบบปฏิบัติการของคุณ สิ่งนี้จะได้ผล:

pip ติดตั้ง 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
ต้องติดตั้งไลบรารี ImageMagickเพื่อทำงานบนไม้กายสิทธิ์
Neeraj Gulia

3
ฉันลองแล้วและจำเป็นต้องติดตั้ง Ghostscript ด้วย (ใช้ Windows 10 และ Python 3.7) ทำได้และทำงานได้อย่างสมบูรณ์
jcf

1
f [: - 4] มีไว้เพื่ออะไร ไม่ได้อ้างอิงจากที่อื่น
อาริ

@Ari f [: - 4] จะตัด ".pdf" ออกจากชื่อไฟล์ (การแบ่งส่วนสตริง) เพื่อสร้างชื่อไฟล์ใหม่ด้วยนามสกุลอื่น ๆ
Fabian

10

@gaurwraith ติดตั้ง poppler สำหรับ Windows และใช้ pdftoppm.exe ดังนี้:

  1. ดาวน์โหลดไฟล์ zip ด้วยไบนารี / dlls ล่าสุดของ Poppler จาก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 อธิบาย

@vishv ในฐานะ 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")

สิ่งนี้ช่วยได้มาก ขอบคุณ!
Sreekiran

1
นี่ควรเป็นคำตอบที่ยอมรับได้ แสดงสิ่งที่ต้องทำกับไบนารีที่ติดตั้งไว้สำหรับ Poppler
Kunj Mehta

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
สิ่งนี้ java เพิ่งลบโฟลเดอร์ทั้งหมดของฉันที่เต็มไปด้วย pdf ที่จัดการสคริปต์ python .... ?
Ulf Gjerdingen

2

GhostScript ทำงานได้เร็วกว่า Poppler สำหรับระบบที่ใช้ Linux มาก

ต่อไปนี้เป็นรหัสสำหรับการแปลง pdf เป็นรูปภาพ

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 บน 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 วินาทีในไฟล์ pdf ที่เพิ่มเข้ามา (ทั้งหมด) และประมวลผล นี่เป็นอุปกรณ์สาธิตในตอนท้ายการแปลงจะทำที่เซิร์ฟเวอร์ระยะไกล กำลังแปลงเป็น. PNG แต่. JPG ก็เป็นไปได้เช่นกัน

การแปลงนี้พร้อมกับการเปลี่ยนในรูปแบบ A4 การแสดงวิดีโอข้อความการเลื่อนที่ราบรื่นสองข้อความและโลโก้ (พร้อมการเปลี่ยนแปลงในสามเวอร์ชัน) ตั้งค่า Pi3 ให้เป็น 4x 100% cpu-load ;-)


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

นี่จะเป็นคำตอบที่ดีกว่าหากคุณอธิบายว่าโค้ดที่คุณให้มาตอบคำถามได้อย่างไร
pppery

2
@pppery Python ค่อนข้างอ่านได้ความคิดเห็นระบุโฟลเดอร์ต้นทางและโฟลเดอร์เอาต์พุตส่วนที่เหลืออ่านเหมือนภาษาอังกฤษ
อารีย์

-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

เรียกแปลงไฟล์ด้วยพา ธ pdf เป็นอาร์กิวเมนต์และฟังก์ชันจะสร้างไฟล์. jpg ในไดเร็กทอรีเดียวกัน


1
เทคนิคนี้ดูเหมือนว่าจะแยกรูปภาพที่ฝังอยู่ในไฟล์แทนที่จะแรสเตอร์หน้าไฟล์เป็นรูปภาพซึ่งเป็นสิ่งที่ผู้ถามต้องการ
Josh Gallagher
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.