99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁精彩閱讀三種方法,Python輕松提取PDF中全部圖片
三種方法,Python輕松提取PDF中全部圖片
2021-01-25
收藏

來源:早起Python

作者:陳熹、劉早起

有時我們需要將一份或者多份PDF文件中的圖片提取出來,如果采取在線的網(wǎng)站實現(xiàn)的話又擔心圖片泄漏,手動操作又覺得麻煩,其實用Python也可以輕松搞定!

今天就跟大家系統(tǒng)分享幾種Python提取 PDF 圖片的方法。其實沒有非常完美的方法,每種方法提取效率都不是百分之百,因此可以考慮用多種方法進行互補,主要將涉及:

基于 fitz 庫和正則搜索提取圖片基于 pdf2image 庫的兩種方法提取圖片

1.基于 fitz 庫和正則搜索

fitz 是 pymupdf 的子模塊,需要先用命令行安裝 pymupdf

pip install pymupdf

但注意導(dǎo)入時使用 import fitz 導(dǎo)入模塊!

下面的代碼就利用 fitz 庫提取圖片需要通過正則匹配圖片元素,將模板元素轉(zhuǎn)化為像素后再以圖片形式寫出

import fitz import re import os

file_path = r'C:xxxxxx.pdf' # PDF 文件路徑 dir_path = r'C:xxx' # 存放圖片的文件夾 def pdf2image1(path, pic_path): 
    checkIM = r"/Subtype(?= */Image)"     pdf = fitz.open(path)
    lenXREF = pdf._getXrefLength()
    count = 1     for i in range(1, lenXREF):
        text = pdf._getXrefString(i)
        isImage = re.search(checkIM, text)
        if not isImage:
            continue         pix = fitz.Pixmap(pdf, i)
        new_name = f"img_{count}.png"         pix.writePNG(os.path.join(pic_path, new_name))
        count += 1         pix = None pdf2image1(file_path, dir_path)

運行提取示例文件后結(jié)果如下:

三種方法,Python輕松提取PDF中全部圖片

可以看到,有一些很小的色塊也被提取成圖片,那么怎么過濾掉它們呢?

有一個簡單的方法是通過大小過濾pix 像素在 fitz 庫中存在一個重要的方法 pix.size 可以反映像素多少,簡單的色素塊該值較低,可以通過設(shè)置一個閾值過濾。以閾值 10000 為例過濾:

import fitz import re import os

file_path = r'C:xxxxxx.pdf' # PDF 文件路徑 dir_path = r'C:xxx' # 存放圖片的文件夾 def pdf2image1(path, pic_path):
     checkIM = r"/Subtype(?= */Image)"     pdf = fitz.open(path)
    lenXREF = pdf._getXrefLength()
    count = 1     for i in range(1, lenXREF):
text = pdf._getXrefString(i)
isImage = re.search(checkIM, text)
 if not isImage:
            continue         pix = fitz.Pixmap(pdf, i)
 if pix.size < 10000# 在這里添加一處判斷一個循環(huán)             continue # 不符合閾值則跳過至下
  new_name = f"img_{count}.png"         pix.writePNG(os.path.join(pic_path, new_name))
 count += 1         pix = None pdf2image1(file_path, dir_path)
三種方法,Python輕松提取PDF中全部圖片

可以看到,全部圖片都被正常提?。?

2.基于 pdf2image 庫的兩種方法

一看名字就知道這個庫的用處了,官方文檔為https://www.cnpython.com/pypi/pdf2image

可以簡單通過 pip install pdf2image 安裝,但poppler才是真正起做用的轉(zhuǎn)換器,因此需要額外安裝和配置:

windows用戶必須安裝poppler for Windows,然后將bin/文件夾添加到PATHMac用戶必須安裝poppler for Mac

具體發(fā)揮作用的代碼官方文檔也給出了詳細的說明:

三種方法,Python輕松提取PDF中全部圖片

那么我們就分別嘗試這兩種方法:

from pdf2image import convert_from_path,convert_from_bytes import tempfile from 
pdf2image.exceptions import PDFInfoNotInstalledError,
 PDFPageCountError, PDFSyntaxError import os

file_path = r'C:xxxxxx.pdf' # PDF 文件路徑 dir_path = r'C:xxx' 
# 存放圖片的文件夾 def pdf2image2(file_path, dir_path):
     images = convert_from_path(file_path, dpi=200)
    for image in images:
        if not os.path.exists(dir_path):
            os.makedirs(dir_path)
        image.save(file_path + f'img_{images.index(image)}.png''PNG')

pdf2image2(file_path, dir_path)

可以成功提取圖片。再試試第二種方法:

from pdf2image import convert_from_path,convert_from_bytes import tempfile from 
pdf2image.exceptions import
 PDFInfoNotInstalledError, PDFPageCountError, PDFSyntaxError import os

file_path = r'C:xxxxxx.pdf' # PDF 文件路徑 dir_path = r'C:xxx' # 存放圖片的文件夾 def pdf2image3(file_path,
 dir_path):     images = convert_from_bytes(open(file_path, 'rb').read())
    for image in images:
        if not os.path.exists(dir_path):
            os.makedirs(dir_path)
        image.save(file_path + f'img_{images.index(image)}.png''PNG')

pdf2image3(file_path, dir_path)
三種方法,Python輕松提取PDF中全部圖片

可以看到結(jié)果和之前一致,PDF中全部圖片都被提取出來!

再補充一下。核心方法covert_from_bytes包含大量參數(shù),可以自行修改。幾個常用參數(shù)總結(jié)如下:

三種方法,Python輕松提取PDF中全部圖片

值得一提的是thread_count 參數(shù),可以啟動多線程會大大加快轉(zhuǎn)換速度,尤其是 PDF 頁面較多時。有興趣的讀者可以做嘗試。

數(shù)據(jù)分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個參數(shù)驗證碼對象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺檢測極驗服務(wù)器是否宕機 new_captcha: data.new_captcha, // 用于宕機時表示是新驗證碼的宕機 product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計時完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }