<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中全部圖片

          共 6053字,需瀏覽 13分鐘

           ·

          2021-01-25 16:40

          ↑ 關(guān)注 + 星標(biāo) ,每天學(xué)Python新技能

          后臺回復(fù)【大禮包】送你Python自學(xué)大禮包

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

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

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

          基于 fitz 庫和正則搜索

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

          pip install pymupdf

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

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

          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)

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

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

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

          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# 在這里添加一處判斷一個循環(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)

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

          基于 pdf2image 庫的兩種方法

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

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

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

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

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

          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中全部圖片都被提取出來!

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

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

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


          -END-

          見面禮


          碼加我微信備注「三劍客」送你上圖三本Python入門電子書 


          推薦閱讀


          1. 全球最大色情網(wǎng)站宣布:封殺特朗普

          2. 費解!為什么那么多人用“ji32k7au4a83”作密碼?

          3. 火了!開源的Python搶票神器,過年回家就看這一波了!

          4. 為什么 Django 框架比Flask框架更流行?


          點分享
          點收藏
          點點贊
          點在看
          瀏覽 36
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <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>
                  国产一级毛片电影 | 成人免费视频 国产免费 | 成人看的视频网站在线观看 | 18禁欧美 | 一个色亚洲 |