目錄
- 過(guò)程
- 拍照
- 用到的Python 操作庫(kù)
- Python遍歷文件夾獲取圖片
- 旋轉(zhuǎn)圖片展示方向并壓縮像素
- 整體代碼
- 整體代碼
- 將腳本打包成exe
- 總結(jié)
過(guò)程
拿到一個(gè)需求最重要的就是將大塊任務(wù)拆分成一個(gè)個(gè)小模塊,逐個(gè)擊破。
拍照
這一步首先是將所有的書(shū)頁(yè)拍好,需要注意的是要按照書(shū)的頁(yè)碼來(lái)拍,因?yàn)楹竺娴呐判蚴前凑瘴募M(jìn)行排序的,拍照的文件名基本上是按照時(shí)間生成的,如果拍的時(shí)候亂了,到時(shí)候生成的 pdf 里面的頁(yè)碼也會(huì)亂掉。
用到的Python 操作庫(kù)
Python 最好的地方就是有大量的第三方庫(kù)能幫我們快速實(shí)現(xiàn)我們想要的方法,搜索到了兩個(gè)庫(kù), PyFPDF 和img2pdf,我們這里選擇img2pdf來(lái)完成我們的需求 pip install img2pdf
Python遍歷文件夾獲取圖片
dirname = "f:/wlzcool"
imgs = []
for fname in os.listdir(dirname):
if not fname.endswith(".jpg"):
continue
path = os.path.join(dirname, fname)
if os.path.isdir(path):
continue
imgs.append(path)
需要注意圖片的文件名如果是純數(shù)字且位數(shù)不一樣,排序會(huì)為1之后是10而不是2,需要進(jìn)行一個(gè)排序,如果是手機(jī)拍的文件就沒(méi)有這個(gè)問(wèn)題。 files.sort(key=lambda x: int(x[:-4]))
旋轉(zhuǎn)圖片展示方向并壓縮像素
有的時(shí)候手機(jī)拍出來(lái)的圖片是水平的,需要將其改為豎直的
用rotate旋轉(zhuǎn)方向的時(shí)候需要注意加上expand=True 這個(gè)參數(shù),否則會(huì)有黑邊出現(xiàn)。
手機(jī)的照片像素太高,有的需要進(jìn)行壓縮以保證最后生成的pdf的大小適中。
img = Image.open(path)
if img.size[0] > img.size[1]:
im_rotate = img.rotate(90, expand=True)
size = (int(im_rotate.size[0] / 3), int(im_rotate.size[1] / 3))
im_rotate = im_rotate.resize(size)
im_rotate.save(savepath, quality=95)
else:
size = (int(img.size[0] / 3), int(img.size[1] / 3))
img = img.resize(size)
img.save(savepath, quality=95)
整體代碼
寫(xiě)成腳本需要考慮的有很多,為了方便使用,需要將各種參數(shù)改為允許用戶(hù)輸入的。比如圖片文件夾所在的路徑,壓縮比之類(lèi)的
from PIL import Image
import os
import img2pdf
flag = False
while not flag:
dirname = input("請(qǐng)輸入圖片文件夾所在路徑(例如d:/wlzcool):")
flag = os.path.exists(dirname)
if not flag:
print("圖片文件夾所在路徑不存在!")
saveflag = False
while not saveflag:
savedirname = input("請(qǐng)輸入目標(biāo)圖片文件夾所在路徑(例如d:/wlzcool2):")
saveflag = os.path.exists(savedirname)
if not saveflag:
print("圖片文件夾所在路徑不存在!")
automakedir = input("是否自動(dòng)創(chuàng)建對(duì)應(yīng)文件夾?(是Y/否N):")
if automakedir.strip().upper() == "Y":
os.makedirs(savedirname)
saveflag = True
files = os.listdir(dirname)
reductionFactor = int(input("請(qǐng)輸入長(zhǎng)寬壓縮比(例如3):"))
if reductionFactor = 0:
reductionFactor = 3
isConvertBlack = input("是否輸出黑白版本?(是Y/否N):").strip().upper() == "Y"
for fname in files:
if not fname.endswith(".jpg"):
continue
path = os.path.join(dirname, fname)
savePath = os.path.join(savedirname, fname)
if os.path.isdir(path):
continue
img = Image.open(path)
if img.size[0] > img.size[1]:
im_rotate = img.rotate(90, expand=True)
size = (int(im_rotate.size[0] / reductionFactor), int(im_rotate.size[1] / reductionFactor))
im_rotate = im_rotate.resize(size)
if isConvertBlack:
im_rotate = im_rotate.convert("L")
im_rotate.save(savePath, quality=95)
else:
size = (int(img.size[0] / reductionFactor), int(img.size[1] / reductionFactor))
img = img.resize(size)
if isConvertBlack:
img = img.convert("L")
img.save(savePath, quality=95)
filename = input("請(qǐng)輸入輸出文件名(例如:第一章):")
with open(filename + ".pdf", "wb") as f:
imgs = []
files = os.listdir(savedirname)
for fname in files:
if not fname.endswith(".jpg"):
continue
path = os.path.join(savedirname, fname)
if os.path.isdir(path):
continue
imgs.append(path)
f.write(img2pdf.convert(imgs))
整體代碼
寫(xiě)成腳本需要考慮的有很多,為了方便使用,需要將各種參數(shù)改為允許用戶(hù)輸入的。比如圖片文件夾所在的路徑,壓縮比之類(lèi)的
from PIL import Image
import os
import img2pdf
flag = False
while not flag:
dirname = input("請(qǐng)輸入圖片文件夾所在路徑(例如d:/wlzcool):")
flag = os.path.exists(dirname)
if not flag:
print("圖片文件夾所在路徑不存在!")
saveflag = False
while not saveflag:
savedirname = input("請(qǐng)輸入目標(biāo)圖片文件夾所在路徑(例如d:/wlzcool2):")
saveflag = os.path.exists(savedirname)
if not saveflag:
print("圖片文件夾所在路徑不存在!")
automakedir = input("是否自動(dòng)創(chuàng)建對(duì)應(yīng)文件夾?(是Y/否N):")
if automakedir.strip().upper() == "Y":
os.makedirs(savedirname)
saveflag = True
files = os.listdir(dirname)
reductionFactor = int(input("請(qǐng)輸入長(zhǎng)寬壓縮比(例如3):"))
if reductionFactor = 0:
reductionFactor = 3
isConvertBlack = input("是否輸出黑白版本?(是Y/否N):").strip().upper() == "Y"
for fname in files:
if not fname.endswith(".jpg"):
continue
path = os.path.join(dirname, fname)
savePath = os.path.join(savedirname, fname)
if os.path.isdir(path):
continue
img = Image.open(path)
if img.size[0] > img.size[1]:
im_rotate = img.rotate(90, expand=True)
size = (int(im_rotate.size[0] / reductionFactor), int(im_rotate.size[1] / reductionFactor))
im_rotate = im_rotate.resize(size)
if isConvertBlack:
im_rotate = im_rotate.convert("L")
im_rotate.save(savePath, quality=95)
else:
size = (int(img.size[0] / reductionFactor), int(img.size[1] / reductionFactor))
img = img.resize(size)
if isConvertBlack:
img = img.convert("L")
img.save(savePath, quality=95)
filename = input("請(qǐng)輸入輸出文件名(例如:第一章):")
with open(filename + ".pdf", "wb") as f:
imgs = []
files = os.listdir(savedirname)
for fname in files:
if not fname.endswith(".jpg"):
continue
path = os.path.join(savedirname, fname)
if os.path.isdir(path):
continue
imgs.append(path)
f.write(img2pdf.convert(imgs))
將腳本打包成exe
不是所有的電腦都有Python環(huán)境,我們需要將腳本打包成exe方便在任意一臺(tái)電腦上使用。 使用 PyInstaller 來(lái)進(jìn)行腳本的打包
安裝 PyInstaller
pip install pyinstaller
打包腳本
在腳本所在的路徑的cmd中執(zhí)行以下命令即可
pyinstaller -F yourprogram.py
總結(jié)
人生苦短,我用 Python,在強(qiáng)大的第三方庫(kù)幫助下,我們只需很少的時(shí)間就可以開(kāi)發(fā)一個(gè)很有意思的小功能。
以上就是Python 多張圖片合并成一個(gè)pdf的參考示例的詳細(xì)內(nèi)容,更多關(guān)于Python 圖片合并成pdf的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
您可能感興趣的文章:- python解析PDF程序代碼
- python實(shí)現(xiàn)csdn全部博文下載并轉(zhuǎn)PDF
- Python合并多張圖片成PDF
- Python提取PDF指定內(nèi)容并生成新文件
- 詳解用Python把PDF轉(zhuǎn)為Word方法總結(jié)
- python操作mysql、excel、pdf的示例
- python pdfkit 中文亂碼問(wèn)題的解決方案
- python 三種方法提取pdf中的圖片
- Python實(shí)現(xiàn)給PDF添加水印的方法
- Python讀取pdf表格寫(xiě)入excel的方法