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

二、圖片轉(zhuǎn)換為 pdf 的兩種實現(xiàn)方法
(一)簡易版——pdf 頁面尺寸跟隨圖片大小
該段代碼適用于:
1、將單張或多張圖片轉(zhuǎn)換為 pdf。
2、目標文件夾中有幾張圖片,轉(zhuǎn)換后的 pdf 就有多少頁。
3、轉(zhuǎn)換后的 pdf 頁面默認尺寸設置:視具體情況而定。簡單來說,就是轉(zhuǎn)換后的 pdf 頁面尺寸會跟隨圖片大小,這樣也就導致 pdf 頁面大小不一。
完整代碼如下:
from PIL import Image as pilImage
import os
# 簡易版——圖片轉(zhuǎn)換為pdf,pdf頁面隨圖片大小浮動
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)換完成,共計%d張圖片' % len(images))
if __name__ == "__main__":
image_file = input(r'輸入目標圖片所在文件夾路徑(如E:\test):')
convert_images_to_pdf(image_file)測試結果—頁面隨圖片大小


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

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


注:本段代碼只涵蓋了常見的 jpg、png 兩種圖片格式,其他格式可以直接在代碼中追加即可。
總結:圖片的大小是轉(zhuǎn)換后的 pdf 是否清晰、符合要求的重要因素。代碼(二)中對圖片進行了簡單縮放,可以根據(jù)自身需求在代碼中對圖片大小進行調(diào)整。(如果對代碼不是很熟悉,有一招簡單方法,就是轉(zhuǎn)換之前,可以先P圖)。
以上就是基于 python 第三方庫 PIL、reportlab ,將圖片轉(zhuǎn)換為pdf的方法,可供參考。更多相關python 圖片轉(zhuǎn)換為pdf 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
python利用winreg生成桌面路徑及實現(xiàn)掃描二維碼圖片返回相關信息
這篇文章主要介紹了python生成桌面路徑及實現(xiàn)掃描二維碼圖片返回相關信息,winreg是python的一個標準庫,用來對windows注冊表的操作,更多相關內(nèi)容需要的小伙伴可以參考一下2022-06-06
Python使用正則表達式報錯:nothing?to?repeat?at?position?0的解決方案
今天在使用python 正則模塊匹配字符串時遇到了這個問題,分享給大家,這篇文章主要給大家介紹了關于Python使用正則表達式報錯nothing?to?repeat?at?position?0的解決方案,需要的朋友可以參考下2023-03-03
使用Python保存網(wǎng)頁上的圖片或者保存頁面為截圖
這篇文章主要介紹了使用Python保存網(wǎng)頁上的圖片或者保存頁面為截圖的方法,保存網(wǎng)頁圖片主要用到urllib模塊,即簡單的爬蟲原理,需要的朋友可以參考下2016-03-03
Python使用jupyter notebook查看ipynb文件過程解析
這篇文章主要介紹了Python使用jupyter notebook查看ipynb文件過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-06-06
python如何將多個模型的ROC曲線繪制在一張圖(含圖例)
這篇文章主要給大家介紹了關于python如何將多個模型的ROC曲線繪制在一張圖的相關資料,文中通過實例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2022-02-02

