ในรหัส python วิธีบันทึกหน้าบางหน้าใน pdf เป็นไฟล์ jpeg อย่างมีประสิทธิภาพ (กรณีการใช้งาน: ฉันเป็นเว็บเซิร์ฟเวอร์ python flask ที่จะอัปโหลด pdf-s และ jpeg-s ที่สอดคล้องกับแต่ละเพจคือร้านค้า)
วิธีนี้อยู่ใกล้ แต่ปัญหาคือไม่ได้แปลงทั้งหน้าเป็น jpeg
ในรหัส python วิธีบันทึกหน้าบางหน้าใน pdf เป็นไฟล์ jpeg อย่างมีประสิทธิภาพ (กรณีการใช้งาน: ฉันเป็นเว็บเซิร์ฟเวอร์ python flask ที่จะอัปโหลด pdf-s และ jpeg-s ที่สอดคล้องกับแต่ละเพจคือร้านค้า)
วิธีนี้อยู่ใกล้ แต่ปัญหาคือไม่ได้แปลงทั้งหน้าเป็น jpeg
คำตอบ:
สามารถใช้ไลบรารี 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ดังนั้นคุณจะไม่ได้รับคุณสมบัติล่าสุดหรือการแก้ไขข้อบกพร่อง
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')
ฉันพบวิธีง่ายๆนี้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)
ไลบรารี 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/
ไม่จำเป็นต้องติดตั้ง 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)
@gaurwraith ติดตั้ง poppler สำหรับ Windows และใช้ pdftoppm.exe ดังนี้:
ดาวน์โหลดไฟล์ zip ด้วยไบนารี / dlls ล่าสุดของ 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"
@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")
เป็นยูทิลิตี้ที่เรียกว่า 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)
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
ข้อมูลการติดตั้งสำหรับแพลตฟอร์มอื่น ๆ สามารถพบได้ที่นี่ หากยังไม่ได้ติดตั้งในระบบของคุณ
ฉันใช้ (อาจ) ตัวเลือกที่ง่ายกว่ามากของ 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 ;-)
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')
นี่คือวิธีแก้ปัญหาที่ไม่ต้องใช้ไลบรารีเพิ่มเติมและรวดเร็วมาก พบสิ่งนี้จาก: 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 ในไดเร็กทอรีเดียวกัน