佳木斯湛栽影视文化发展公司

主頁(yè) > 知識(shí)庫(kù) > python 三種方法提取pdf中的圖片

python 三種方法提取pdf中的圖片

熱門標(biāo)簽:硅谷的囚徒呼叫中心 電話運(yùn)營(yíng)中心 企業(yè)做大做強(qiáng) Win7旗艦版 客戶服務(wù) 語(yǔ)音系統(tǒng) 百度AI接口 呼叫中心市場(chǎng)需求

有時(shí)我們需要將一份或者多份PDF文件中的圖片提取出來(lái),如果采取在線的網(wǎng)站實(shí)現(xiàn)的話又擔(dān)心圖片泄漏,手動(dòng)操作又覺得麻煩,其實(shí)用Python也可以輕松搞定!
今天就跟大家系統(tǒng)分享幾種Python提取 PDF 圖片的方法。其實(shí)沒有非常完美的方法,每種方法提取效率都不是百分之百,因此可以考慮用多種方法進(jìn)行互補(bǔ),主要將涉及:

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

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

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

pip install pymupdf

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

下面的代碼就利用 fitz 庫(kù)提取圖片需要通過(guò)正則匹配圖片元素,將模板元素轉(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)

運(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用戶必須安裝poppler for Windows,然后將bin/文件夾添加到PATH
  • Mac用戶必須安裝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_path

PDF 文檔路徑

dpi

圖像質(zhì)量(如果是學(xué)術(shù)期刊雜志常見 300dpi)

output_folder

將生成的圖像寫入文件夾(而不是直接寫入內(nèi)存)

first_page

起始轉(zhuǎn)換頁(yè)數(shù)

last_page

轉(zhuǎn)換至哪一頁(yè)

fmt

圖像格式,可以指定為 png,默認(rèn)為 ppm

thread_count

允許參與轉(zhuǎn)換的線程數(shù)

userpw

PDF 的密碼

output_file

輸出文件名

poppler_path

指定 poppler 的安裝路徑,一開始配置好就無(wú)需指定

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

以上就是python 三種方法提取pdf中的圖片的詳細(xì)內(nèi)容,更多關(guān)于python 提取pdf中的圖片的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

您可能感興趣的文章:
  • python解析PDF程序代碼
  • python實(shí)現(xiàn)csdn全部博文下載并轉(zhuǎn)PDF
  • Python合并多張圖片成PDF
  • Python提取PDF指定內(nèi)容并生成新文件
  • 詳解用Python把PDF轉(zhuǎn)為Word方法總結(jié)
  • python操作mysql、excel、pdf的示例
  • python pdfkit 中文亂碼問(wèn)題的解決方案
  • Python實(shí)現(xiàn)給PDF添加水印的方法
  • Python讀取pdf表格寫入excel的方法
  • Python 多張圖片合并成一個(gè)pdf的參考示例

標(biāo)簽:山西 安康 山西 喀什 濟(jì)南 海南 崇左 長(zhǎng)沙

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《python 三種方法提取pdf中的圖片》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    北流市| 朝阳区| 湟中县| 宜兰市| 浮梁县| 岑巩县| 天峨县| 依安县| 涞源县| 建瓯市| 六盘水市| 宝山区| 德保县| 普陀区| 英山县| 资中县| 赤水市| 岑巩县| 大厂| 鄂托克前旗| 娄底市| 抚州市| 白山市| 内丘县| 平南县| 壤塘县| 泰宁县| 南和县| 兴隆县| 安多县| 浦城县| 和林格尔县| 佳木斯市| 漾濞| 和政县| 洪湖市| 宽甸| 融水| 昂仁县| 陇南市| 正定县|