日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

Python-从PDF中提取图片、压缩PDF

發(fā)布時間:2023/12/20 python 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python-从PDF中提取图片、压缩PDF 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

功能描述

老大最近一直需要將一個好幾兆的pdf文件壓縮到2mb甚至1mb以內(nèi)。通常的做法可能會是打印pdf文件,然后用打印機設(shè)置生產(chǎn)很小的pdf文件,或者就是截圖保存等等。但都有點太傻瓜了,這時候還是python大法好,網(wǎng)上摘取了一部分別人的代碼,稍作修改,就變成了一個能用的小工具。在此感謝各位大佬的資源。目前差不多能用,功能如下:

  • 從PDF中提取圖片
  • 將圖片進(jìn)行質(zhì)量和尺寸大小的壓縮
  • 生成新的PDF文件
  • 源代碼

    1.1 安裝必要的庫

    先安裝庫 fitz,再安裝庫pymupdf,地址:https://github.com/pymupdf/PyMuPDF/

    pip install fitzpip install pymupdf

    1.2 源代碼

    第一個pdf2pic從pdf中提取jpg文件的部分引用了別人的代碼
    以下兩行doc.引用的注意了,不然會報錯

    lenXREF = doc.xref_length() text = doc.xref_object(i) # 定義對象字符串

    另外加入了重新調(diào)整過大的照片尺寸,和保存照片的質(zhì)量,這里有個變量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)" # 使用正則表達(dá)式來查找圖片checkIM = r"/Subtype(?= */Image)"doc = fitz.open(path) # 打開pdf文件imgcount = 0 # 圖片計數(shù)lenXREF = doc.xref_length() # 獲取對象數(shù)量長度# 打印PDF的信息print("文件名:{}, 頁數(shù): {}, 對象: {}".format(path, len(doc), lenXREF - 1))# 遍歷每一個對象for i in range(1, lenXREF):text = doc.xref_object(i) # 定義對象字符串isXObject = re.search(checkXO, text) # 使用正則表達(dá)式查看是否是對象isImage = re.search(checkIM, text) # 使用正則表達(dá)式查看是否是圖片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: # 否則先轉(zhuǎn)換CMYKpix0 = fitz.Pixmap(fitz.csRGB, pix)pix0.writeImage(os.path.join(pic_path, new_name))pix0 = Nonepix = None # 釋放資源print("提取了{(lán)}張圖片".format(imgcount))os.startfile(pic_path)

    下面這個rea是用來將文件夾內(nèi)的照片重新組合為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=高畫質(zhì),2=中畫質(zhì),3=低畫質(zhì)):(輸入數(shù)字并按回車鍵)")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("壓縮完成,請關(guān)閉窗口。若壓縮等級不合適,請先刪除圖片和文件并重新打開程序。")

    總結(jié)

    以上是生活随笔為你收集整理的Python-从PDF中提取图片、压缩PDF的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。