Python-从PDF中提取图片、压缩PDF
生活随笔
收集整理的這篇文章主要介紹了
Python-从PDF中提取图片、压缩PDF
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
功能描述
老大最近一直需要將一個好幾兆的pdf文件壓縮到2mb甚至1mb以內。通常的做法可能會是打印pdf文件,然后用打印機設置生產很小的pdf文件,或者就是截圖保存等等。但都有點太傻瓜了,這時候還是python大法好,網上摘取了一部分別人的代碼,稍作修改,就變成了一個能用的小工具。在此感謝各位大佬的資源。目前差不多能用,功能如下:
源代碼
1.1 安裝必要的庫
先安裝庫 fitz,再安裝庫pymupdf,地址:https://github.com/pymupdf/PyMuPDF/
pip install fitzpip install pymupdf1.2 源代碼
第一個pdf2pic從pdf中提取jpg文件的部分引用了別人的代碼
以下兩行doc.引用的注意了,不然會報錯
另外加入了重新調整過大的照片尺寸,和保存照片的質量,這里有個變量comp_ratio
im = im.resize((1376, y_s), Image.ANTIALIAS) im.save(pic_path_d, quality=comp_ratio) import fitz import re import os from PIL import Image from tkinter import filedialogdef pdf2pic(path, pic_path, comp_ratio):checkXO = r"/Type(?= */XObject)" # 使用正則表達式來查找圖片checkIM = r"/Subtype(?= */Image)"doc = fitz.open(path) # 打開pdf文件imgcount = 0 # 圖片計數lenXREF = doc.xref_length() # 獲取對象數量長度# 打印PDF的信息print("文件名:{}, 頁數: {}, 對象: {}".format(path, len(doc), lenXREF - 1))# 遍歷每一個對象for i in range(1, lenXREF):text = doc.xref_object(i) # 定義對象字符串isXObject = re.search(checkXO, text) # 使用正則表達式查看是否是對象isImage = re.search(checkIM, text) # 使用正則表達式查看是否是圖片if not isXObject or not isImage: # 如果不是對象也不是圖片,則continuecontinueimgcount += 1pix = fitz.Pixmap(doc, i) # 生成圖像對象new_name = "pic{}.jpg".format(imgcount) # 生成圖片的名稱print(new_name)if pix.n < 5: # 如果pix.n<5,可以直接存為PNGpic_path_d = os.path.join(pic_path, new_name)pix.writeImage(os.path.join(pic_path, new_name))im = Image.open(pic_path_d)x, y = im.sizeif x > 1376:y_s = int(y * 1376 / x)im = im.resize((1376, y_s), Image.ANTIALIAS)im.save(pic_path_d, quality=comp_ratio)else: # 否則先轉換CMYKpix0 = fitz.Pixmap(fitz.csRGB, pix)pix0.writeImage(os.path.join(pic_path, new_name))pix0 = Nonepix = None # 釋放資源print("提取了{}張圖片".format(imgcount))os.startfile(pic_path)下面這個rea是用來將文件夾內的照片重新組合為pdf文件
def rea(path, pdf_name):file_list = os.listdir(path)pic_name = []im_list = []for x in file_list:if "jpg" in x or 'png' in x or 'jpeg' in x:pic_name.append(x)pic_name.sort()new_pic = []for x in pic_name:if "jpg" in x:new_pic.append(x)for x in pic_name:if "png" in x:new_pic.append(x)print("hec", new_pic)im1 = Image.open(os.path.join(path, new_pic[0]))new_pic.pop(0)for i in new_pic:img = Image.open(os.path.join(path, i))# im_list.append(Image.open(i))if img.mode == "RGBA":img = img.convert('RGB')im_list.append(img)else:im_list.append(img)im1.save(pdf_name, "PDF", resolution=100.0, save_all=True, append_images=im_list)print("輸出文件名稱:", pdf_name)def pdf_out():print('功能完善中')主程序中隨意加了一些判斷,如壓縮等級1、2、3等。
if __name__ == '__main__':print("Hello world!請先輸入壓縮等級1~3,然后在彈出的對話框中選擇需要壓縮的文件")comp_level = input("壓縮等級(1=高畫質,2=中畫質,3=低畫質):(輸入數字并按回車鍵)")ratio = 10if comp_level == "1":ratio = 20elif comp_level == "2":ratio = 10elif comp_level == "3":ratio = 5'''打開選擇文件夾對話框'''filepath = filedialog.askopenfilename() # 獲得選擇好的文件print('選擇的PDF地址:', filepath)if os.path.exists("./pdf_output"):passelse:os.mkdir("./pdf_output")pic_path = str(os.getcwd()) + "\pdf_output"print('提取圖片的輸出地址:', pic_path )pdf2pic(filepath, pic_path, comp_ratio=ratio)pdf_name = 'Compressed.pdf'if ".pdf" in pdf_name:rea(pic_path, pdf_name=pdf_name)else:rea(pic_path, pdf_name="{}.pdf".format(pdf_name))print("壓縮完成,請關閉窗口。若壓縮等級不合適,請先刪除圖片和文件并重新打開程序。")總結
以上是生活随笔為你收集整理的Python-从PDF中提取图片、压缩PDF的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Jquery通过append新元素之后事
- 下一篇: Matlab数字(所有数值存储为双精度浮