<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

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

          共 1623字,需瀏覽 4分鐘

           ·

          2021-02-17 02:03


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

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

          • 基于 fitz 庫(kù)和正則搜索提取圖片
          • 基于 pdf2image 庫(kù)的兩種方法提取圖片

          基于 fitz 庫(kù)和正則搜索

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

          pip?install?pymupdf

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

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

          import?fitz
          import?re
          import?os

          file_path?=?r'C:\xxx\xxx.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)

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

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

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

          import?fitz
          import?re
          import?os

          file_path?=?r'C:\xxx\xxx.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:?#?在這里添加一處判斷一個(gè)循環(huán)
          ????????????continue?#?不符合閾值則跳過(guò)至下
          ????????new_name?=?f"img_{count}.png"
          ????????pix.writePNG(os.path.join(pic_path,?new_name))
          ????????count?+=?1
          ????????pix?=?None

          pdf2image1(file_path,?dir_path)

          可以看到,全部圖片都被正常提取!

          基于 pdf2image 庫(kù)的兩種方法

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

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

          • windows用戶(hù)必須安裝poppler for Windows,然后將bin/文件夾添加到PATH
          • Mac用戶(hù)必須安裝poppler for Mac

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

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

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

          file_path?=?r'C:\xxx\xxx.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:\xxx\xxx.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)

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

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

          參數(shù)意義
          pdf_pathPDF 文檔路徑
          dpi圖像質(zhì)量(如果是學(xué)術(shù)期刊雜志常見(jiàn) 300dpi)
          output_folder將生成的圖像寫(xiě)入文件夾(而不是直接寫(xiě)入內(nèi)存)
          first_page起始轉(zhuǎn)換頁(yè)數(shù)
          last_page轉(zhuǎn)換至哪一頁(yè)
          fmt圖像格式,可以指定為 png,默認(rèn)為 ppm
          thread_count允許參與轉(zhuǎn)換的線(xiàn)程數(shù)
          userpwPDF 的密碼
          output_file輸出文件名
          poppler_path指定 poppler 的安裝路徑,一開(kāi)始配置好就無(wú)需指定

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


          加入知識(shí)星球【我們談?wù)摂?shù)據(jù)科學(xué)】

          300+小伙伴一起學(xué)習(xí)!








          · 推薦閱讀?·

          在Python中一馬平川的書(shū)寫(xiě)代碼!

          Python+Dash快速web應(yīng)用開(kāi)發(fā):回調(diào)交互篇(下)

          Scikit-learn 更新至0.24版,這10個(gè)新特性你需要了解


          瀏覽 87
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  樱桃视频香蕉 | 精品三级网站 | 123日逼网| 国产18禁美女黄禁片免费网站 | 日韩熟女精品 |