python中圖片轉(zhuǎn)換為pdf實(shí)現(xiàn)方法
一、PIL 庫簡介及安裝使用方法
本文將圖片轉(zhuǎn)換為 pdf 的實(shí)現(xiàn)方法,主要是基于 python 的第三方圖像處理庫 PIL。
PIL(Python Imaging Library),免費(fèi)開源,提供了非常強(qiáng)大的圖像處理功能。
PIL,只支持 python 2.x 版本;隨著發(fā)展, Python 社區(qū)開發(fā)了一個(gè)名為 Pillow 的分支,一個(gè)兼容 PIL 的圖像處理庫,用以支持 python 3.x 版本。
Pillow,不僅繼承了 PIL 的功能,還在其基礎(chǔ)上增加了許多新的特性,使其成為比原始 PIL 更加活躍的圖像處理庫。
(一)python 不同版本下 PIL 的使用方法
(1)python 2.x:通常不需要單獨(dú)安裝,PIL 已包含在標(biāo)準(zhǔn)庫中,可直接使用。
(2)python 3.x:需要單獨(dú)安裝 Pillow 庫來代替 PIL。
作者使用的是 python 3.x,并直接通過 pip 安裝了 Pillow 庫。
安裝命令如下:
pip install Pillow
查看是否安裝成功及當(dāng)前版本:
pip show pillow
二、圖片轉(zhuǎn)換為 pdf 的兩種實(shí)現(xiàn)方法
(一)簡易版——pdf 頁面尺寸跟隨圖片大小
該段代碼適用于:
1、將單張或多張圖片轉(zhuǎn)換為 pdf。
2、目標(biāo)文件夾中有幾張圖片,轉(zhuǎn)換后的 pdf 就有多少頁。
3、轉(zhuǎn)換后的 pdf 頁面默認(rèn)尺寸設(shè)置:視具體情況而定。簡單來說,就是轉(zhuǎn)換后的 pdf 頁面尺寸會跟隨圖片大小,這樣也就導(dǎo)致 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)換完成,共計(jì)%d張圖片' % len(images)) if __name__ == "__main__": image_file = input(r'輸入目標(biāo)圖片所在文件夾路徑(如E:\test):') convert_images_to_pdf(image_file)
測試結(jié)果—頁面隨圖片大小
注:本段代碼只涵蓋了常見的 jpg、png 兩種圖片格式,其他格式可以直接在代碼中追加。
(二)常用版——pdf 每頁尺寸統(tǒng)一為 A4
基于(一)中的代碼,引入了第三方模塊 reportlab,對轉(zhuǎn)換后的 pdf 頁面尺寸進(jìn)行設(shè)置。
1、第一步,先通過命令:pip show reportlab ,查看是否已經(jīng)安裝有 reportlab 模塊,已安裝的情況下會提示版本號等信息,并且在使用時(shí)不會報(bào)錯(cuò)。
如果沒有安裝 reportlab 模塊,則需要進(jìn)行安裝:pip install reportlab。
注:經(jīng)作者實(shí)測,直接使用 pip 命令安裝可能會失敗,因每臺電腦所裝的 python 版本、環(huán)境依賴等,失敗情況可能也有所不同。解決辦法:先去下載對應(yīng)自身 python 版本的 reportlab 包或 whl 文件,再進(jìn)行安裝。常用下載鏈接可參考: https://pypi.org/search/?q=reportlab。
2、第二步,安裝好所需要的庫后,直接復(fù)制并運(yùn)行下面的代碼,輸入需要轉(zhuǎn)換的圖片文件夾路徑即可。
該段代碼適用于:
1、將單張或多張圖片轉(zhuǎn)換為 pdf。
2、目標(biāo)文件夾中有幾張圖片,轉(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 # 獲取目標(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頁面大小為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('該文件夾路徑下無圖片,請檢查圖片格式!') 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 = [] # 用于存儲多張圖片框架 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) # 儲存文檔內(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])
測試結(jié)果——每頁均為 A4 大小
注:本段代碼只涵蓋了常見的 jpg、png 兩種圖片格式,其他格式可以直接在代碼中追加即可。
總結(jié):圖片的大小是轉(zhuǎn)換后的 pdf 是否清晰、符合要求的重要因素。代碼(二)中對圖片進(jìn)行了簡單縮放,可以根據(jù)自身需求在代碼中對圖片大小進(jìn)行調(diào)整。(如果對代碼不是很熟悉,有一招簡單方法,就是轉(zhuǎn)換之前,可以先P圖)。
以上就是基于 python 第三方庫 PIL、reportlab ,將圖片轉(zhuǎn)換為pdf的方法,可供參考。更多相關(guān)python 圖片轉(zhuǎn)換為pdf 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
教你如何使用Python開發(fā)一個(gè)釘釘群應(yīng)答機(jī)器人
在聊天工具大肆侵入我們生活各個(gè)方面的今天,各種消息無時(shí)無刻不在侵?jǐn)_我們的每一寸時(shí)間,這種情況下,一個(gè)聊天的機(jī)器人就很有必要了.今天,我們來學(xué)習(xí)一下使用 Python 開發(fā)一個(gè)釘釘?shù)膽?yīng)答機(jī)器人,助你「人生苦短,少回消息」,需要的朋友可以參考下2021-06-06pyqt5 textEdit、lineEdit操作的示例代碼
這篇文章主要介紹了pyqt5 textEdit、lineEdit操作的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08基于Python實(shí)現(xiàn)配置熱加載的方法詳解
所謂的配置熱加載,也就是說當(dāng)服務(wù)收到配置更新消息之后,我們不用重啟服務(wù)就可以使用最新的配置去執(zhí)行任務(wù)。本文將介紹如何用Python實(shí)現(xiàn)配置熱加載,需要的可以參考一下2022-07-07Jinja2實(shí)現(xiàn)模板渲染與訪問對象屬性流程詳解
要了解jinja2,那么需要先理解模板的概念。模板在Python的web開發(fā)中廣泛使用,它能夠有效的將業(yè)務(wù)邏輯和頁面邏輯分開,使代碼可讀性增強(qiáng),并且更加容易理解和維護(hù)。模板簡單來說就是一個(gè)其中包含占位變量表示動態(tài)部分的文,模板文件在經(jīng)過動態(tài)賦值后,返回給用戶2023-03-03檢測tensorflow是否使用gpu進(jìn)行計(jì)算的方式
今天小編就為大家分享一篇檢測tensorflow是否使用gpu進(jìn)行計(jì)算的方式,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-02-02如何使用 Python 中的功能和庫創(chuàng)建 n-gram
在計(jì)算語言學(xué)中,n-gram 對于語言處理、上下文和語義分析非常重要,它們是從令牌字符串中相鄰的連續(xù)單詞序列,本文將討論如何使用 Python 中的功能和庫創(chuàng)建 n-gram,感興趣的朋友一起看看吧2023-09-09