python中圖片轉(zhuǎn)換為pdf實(shí)現(xiàn)方法
一、PIL 庫(kù)簡(jiǎn)介及安裝使用方法
本文將圖片轉(zhuǎn)換為 pdf 的實(shí)現(xiàn)方法,主要是基于 python 的第三方圖像處理庫(kù) PIL。
PIL(Python Imaging Library),免費(fèi)開(kāi)源,提供了非常強(qiáng)大的圖像處理功能。
PIL,只支持 python 2.x 版本;隨著發(fā)展, Python 社區(qū)開(kāi)發(fā)了一個(gè)名為 Pillow 的分支,一個(gè)兼容 PIL 的圖像處理庫(kù),用以支持 python 3.x 版本。
Pillow,不僅繼承了 PIL 的功能,還在其基礎(chǔ)上增加了許多新的特性,使其成為比原始 PIL 更加活躍的圖像處理庫(kù)。
(一)python 不同版本下 PIL 的使用方法
(1)python 2.x:通常不需要單獨(dú)安裝,PIL 已包含在標(biāo)準(zhǔn)庫(kù)中,可直接使用。
(2)python 3.x:需要單獨(dú)安裝 Pillow 庫(kù)來(lái)代替 PIL。
作者使用的是 python 3.x,并直接通過(guò) pip 安裝了 Pillow 庫(kù)。
安裝命令如下:
pip install Pillow
查看是否安裝成功及當(dāng)前版本:
pip show pillow

二、圖片轉(zhuǎn)換為 pdf 的兩種實(shí)現(xiàn)方法
(一)簡(jiǎn)易版——pdf 頁(yè)面尺寸跟隨圖片大小
該段代碼適用于:
1、將單張或多張圖片轉(zhuǎn)換為 pdf。
2、目標(biāo)文件夾中有幾張圖片,轉(zhuǎn)換后的 pdf 就有多少頁(yè)。
3、轉(zhuǎn)換后的 pdf 頁(yè)面默認(rèn)尺寸設(shè)置:視具體情況而定。簡(jiǎn)單來(lái)說(shuō),就是轉(zhuǎn)換后的 pdf 頁(yè)面尺寸會(huì)跟隨圖片大小,這樣也就導(dǎo)致 pdf 頁(yè)面大小不一。
完整代碼如下:
from PIL import Image as pilImage
import os
# 簡(jiǎn)易版——圖片轉(zhuǎn)換為pdf,pdf頁(yè)面隨圖片大小浮動(dòng)
def convert_images_to_pdf(image_file):
os.chdir(image_file)
images = []
file_lis = os.listdir(image_file)
output_path = 'output.pdf'
con = 0
for image_path in file_lis:
if image_path.endswith(('.jpg', '.png')):
image = pilImage.open(image_path)
images.append(image.convert("RGB"))
con += 1
print(image_path + ':第%d張' % con)
images[0].save(output_path, save_all=True, append_images=images[1:])
print('轉(zhuǎn)換完成,共計(jì)%d張圖片' % len(images))
if __name__ == "__main__":
image_file = input(r'輸入目標(biāo)圖片所在文件夾路徑(如E:\test):')
convert_images_to_pdf(image_file)測(cè)試結(jié)果—頁(yè)面隨圖片大小


注:本段代碼只涵蓋了常見(jiàn)的 jpg、png 兩種圖片格式,其他格式可以直接在代碼中追加。

(二)常用版——pdf 每頁(yè)尺寸統(tǒng)一為 A4
基于(一)中的代碼,引入了第三方模塊 reportlab,對(duì)轉(zhuǎn)換后的 pdf 頁(yè)面尺寸進(jìn)行設(shè)置。
1、第一步,先通過(guò)命令:pip show reportlab ,查看是否已經(jīng)安裝有 reportlab 模塊,已安裝的情況下會(huì)提示版本號(hào)等信息,并且在使用時(shí)不會(huì)報(bào)錯(cuò)。
如果沒(méi)有安裝 reportlab 模塊,則需要進(jìn)行安裝:pip install reportlab。
注:經(jīng)作者實(shí)測(cè),直接使用 pip 命令安裝可能會(huì)失敗,因每臺(tái)電腦所裝的 python 版本、環(huán)境依賴等,失敗情況可能也有所不同。解決辦法:先去下載對(duì)應(yīng)自身 python 版本的 reportlab 包或 whl 文件,再進(jìn)行安裝。常用下載鏈接可參考: https://pypi.org/search/?q=reportlab。
2、第二步,安裝好所需要的庫(kù)后,直接復(fù)制并運(yùn)行下面的代碼,輸入需要轉(zhuǎn)換的圖片文件夾路徑即可。
該段代碼適用于:
1、將單張或多張圖片轉(zhuǎn)換為 pdf。
2、目標(biāo)文件夾中有幾張圖片,轉(zhuǎn)換后的 pdf 就有多少頁(yè)。
3、轉(zhuǎn)換后的 pdf 每頁(yè)大小均為 A4 。
完整代碼如下:
from PIL import Image as pilImage
from reportlab.platypus import SimpleDocTemplate, Image, PageBreak
from reportlab.lib.pagesizes import A4, landscape
import os
# 獲取目標(biāo)文件下圖片文件
def get_Images(image_file):
images = []
file_lis = os.listdir(image_file)
for image_path in file_lis:
if image_path.endswith(('jpg', 'png')):
images.append(image_path)
return images, image_file
# 常用版——圖片轉(zhuǎn)換為pdf,限制pdf頁(yè)面大小為A4
def convert_images_to_pdfp(images, image_file):
os.chdir(image_file)
# 獲取A4尺寸
a4_w, a4_h = landscape(A4)
# 創(chuàng)建一個(gè)PDF文檔
pdf_doc = SimpleDocTemplate(r'tmp.pdf')
if len(images) == 0:
print('該文件夾路徑下無(wú)圖片,請(qǐng)檢查圖片格式!')
elif len(images) == 1:
# 獲取圖片尺寸
img = pilImage.open(images[0])
img_w, img_h = img.size
# 設(shè)置合適的縮放比率
ratio = min(a4_w / img_w, a4_h / img_h)
# 創(chuàng)建文檔
page = Image(images[0], img_w * ratio, img_h * ratio)
pdf_doc.build([ page ])
print(images[0] + '——轉(zhuǎn)換完成')
else:
frames = [] # 用于存儲(chǔ)多張圖片框架
con = 0
for image in images:
# 獲取圖片尺寸
img = pilImage.open(image)
img_w, img_h = img.size
# 設(shè)置合適的縮放比率
ratio = min(a4_w / img_w, a4_h / img_h)
# 儲(chǔ)存文檔內(nèi)容
page = Image(image, img_w * ratio, img_h * ratio)
frames.append(page) # 將文檔內(nèi)容添加到列表中
frames.append(PageBreak()) # 在每張圖片后添加PageBreak
con += 1
print(image + '——第%d張' % con)
pdf_doc.build(frames)
print('轉(zhuǎn)換完成,共計(jì)%d張' % len(images))
if __name__ == "__main__":
image_file = input(r'輸入目標(biāo)圖片所在文件夾路徑(如E:\test):')
images = get_Images(image_file)
convert_images_to_pdfp(images[0], images[1])測(cè)試結(jié)果——每頁(yè)均為 A4 大小


注:本段代碼只涵蓋了常見(jiàn)的 jpg、png 兩種圖片格式,其他格式可以直接在代碼中追加即可。
總結(jié):圖片的大小是轉(zhuǎn)換后的 pdf 是否清晰、符合要求的重要因素。代碼(二)中對(duì)圖片進(jìn)行了簡(jiǎn)單縮放,可以根據(jù)自身需求在代碼中對(duì)圖片大小進(jìn)行調(diào)整。(如果對(duì)代碼不是很熟悉,有一招簡(jiǎn)單方法,就是轉(zhuǎn)換之前,可以先P圖)。
以上就是基于 python 第三方庫(kù) PIL、reportlab ,將圖片轉(zhuǎn)換為pdf的方法,可供參考。更多相關(guān)python 圖片轉(zhuǎn)換為pdf 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python logging日志庫(kù)空間不足問(wèn)題解決
這篇文章主要介紹了Python logging日志庫(kù)空間不足問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09
教你如何使用Python開(kāi)發(fā)一個(gè)釘釘群應(yīng)答機(jī)器人
在聊天工具大肆侵入我們生活各個(gè)方面的今天,各種消息無(wú)時(shí)無(wú)刻不在侵?jǐn)_我們的每一寸時(shí)間,這種情況下,一個(gè)聊天的機(jī)器人就很有必要了.今天,我們來(lái)學(xué)習(xí)一下使用 Python 開(kāi)發(fā)一個(gè)釘釘?shù)膽?yīng)答機(jī)器人,助你「人生苦短,少回消息」,需要的朋友可以參考下2021-06-06
pyqt5 textEdit、lineEdit操作的示例代碼
這篇文章主要介紹了pyqt5 textEdit、lineEdit操作的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
基于Python實(shí)現(xiàn)配置熱加載的方法詳解
所謂的配置熱加載,也就是說(shuō)當(dāng)服務(wù)收到配置更新消息之后,我們不用重啟服務(wù)就可以使用最新的配置去執(zhí)行任務(wù)。本文將介紹如何用Python實(shí)現(xiàn)配置熱加載,需要的可以參考一下2022-07-07
Jinja2實(shí)現(xiàn)模板渲染與訪問(wèn)對(duì)象屬性流程詳解
要了解jinja2,那么需要先理解模板的概念。模板在Python的web開(kāi)發(fā)中廣泛使用,它能夠有效的將業(yè)務(wù)邏輯和頁(yè)面邏輯分開(kāi),使代碼可讀性增強(qiáng),并且更加容易理解和維護(hù)。模板簡(jiǎn)單來(lái)說(shuō)就是一個(gè)其中包含占位變量表示動(dòng)態(tài)部分的文,模板文件在經(jīng)過(guò)動(dòng)態(tài)賦值后,返回給用戶2023-03-03
檢測(cè)tensorflow是否使用gpu進(jìn)行計(jì)算的方式
今天小編就為大家分享一篇檢測(cè)tensorflow是否使用gpu進(jìn)行計(jì)算的方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-02-02
如何使用 Python 中的功能和庫(kù)創(chuàng)建 n-gram
在計(jì)算語(yǔ)言學(xué)中,n-gram 對(duì)于語(yǔ)言處理、上下文和語(yǔ)義分析非常重要,它們是從令牌字符串中相鄰的連續(xù)單詞序列,本文將討論如何使用 Python 中的功能和庫(kù)創(chuàng)建 n-gram,感興趣的朋友一起看看吧2023-09-09

