前言:下面的代码有注释,下面的也是参考别人的,但是忘记来源了,因为时间隔太久了,哪位小伙伴看到了,可以提一下链接

方法一,这个测试是有用的,fitz(要install pymupdf)
#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @Time    : 2019/3/19 08:51
# @Author  : qizai
# @File    : fetch_pdf_v1.py
# @Software: PyCharmimport fitz  # pip3 install pymupdf
import time
import re
import osdef get_image(path, pic_path):'''从pdf中提取图片:param path: pdf的路径:param pic_path: 图片保存的路径:return: 无return'''t0 = time.clock()# 00、使用正则表达式查找PDF中的图片checkXO = r"/Type(?= */XObject)"checkIM = r"/Subtype(?= */Image)"# 一、打开pdf,打印PDF的相关信息doc = fitz.open(path)# 图片计数imgcount = 0lenXREF = doc._getXrefLength()# 打印PDF的信息print("文件名:{}, 页数: {}, 对象: {}".format(path, len(doc), lenXREF - 1))# 二、遍历PDF中的对象,遇到是图像才进行下一步,不然就continuefor i in range(1, lenXREF):# 定义对象字符串# text = doc._getObjectString(i)text = doc._getXrefString(i)# print(text)# continueisXObject = re.search(checkXO, text)# 使用正则表达式查看是否是图片isImage = re.search(checkIM, text)# 如果不是对象也不是图片,则continueif not isXObject or not isImage:print("不是图片")continueimgcount += 1# 根据索引生成图像pix = fitz.Pixmap(doc, i)# 根据pdf的路径生成图片的名称new_name = path.replace('\\', '_') + "_img{}.png".format(imgcount)new_name = new_name.replace(':', '')# 三、将图像存为png格式# 如果pix.n<5,可以直接存为PNGif pix.n < 5:pix.writePNG(os.path.join(pic_path, new_name))# 否则先转换CMYKelse:pix0 = fitz.Pixmap(fitz.csRGB, pix)pix0.writePNG(os.path.join(pic_path, new_name))pix0 = None# 释放资源pix = Nonet1 = time.clock()print("运行时间:{}s".format(t1 - t0))print("提取了{}张图片".format(imgcount))# 运行
if __name__=='__main__':# pdf路径path = r"Selenium 自动化爬虫.pdf"  # 测试提取图片专用  Selenium 自动化爬虫pic_path = r"image"# 创建保存图片的文件夹if os.path.exists(pic_path):print("文件夹已存在,请重新创建新文件夹!")raise SystemExitelse:os.mkdir(pic_path)get_image(path, pic_path)
方法二、pdfminer(install pdfminer3k)这个提取文字还可以,提取图片暂时识别不了
#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @Time    : 2019/3/19 11:21
# @Author  : qizai
# @File    : fetch_pdf_v2.py
# @Software: PyCharmfrom pdfminer.pdfparser import PDFParser, PDFDocument
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter, PDFTextExtractionNotAllowed
from pdfminer.converter import PDFPageAggregator
from pdfminer.layout import LTTextBoxHorizontal, LAParams, LTImage, LTCurve, LTFigure# 如果要提取图片,那么需要导入一下几个库
import sys
import os
from binascii import b2a_heximages_folder = r'image'  # 提取图片存放的路径def save_image(lt_image, page_number, images_folder):"""Try to save the image data from this LTImage object, and return the file name, if successful从LTImage object中保存图像数据,这需要依赖两个函数determine_image_type、write_file:return file_name 文件名"""result = Noneif lt_image.stream:file_stream = lt_image.stream.get_rawdata()file_ext = determine_image_type(file_stream[0:4])if file_ext:file_name = ''.join([str(page_number), '_', lt_image.name, file_ext])if write_file(images_folder, file_name, lt_image.stream.get_rawdata(), flags='wb'):result = file_namereturn resultdef determine_image_type (stream_first_4_bytes):"""Find out the image file type based on the magic number comparison of the first 4 (or 2) bytes"""file_type = Nonebytes_as_hex = b2a_hex(stream_first_4_bytes)if bytes_as_hex.startswith('ffd8'):file_type = '.jpeg'elif bytes_as_hex == '89504e47':file_type = ',png'elif bytes_as_hex == '47494638':file_type = '.gif'elif bytes_as_hex.startswith('424d'):file_type = '.bmp'return file_typedef write_file(folder, filename, filedata, flags='w'):"""Write the file data to the folder and filename combination(flags: 'w' for write text, 'wb' for write binary, use 'a' instead of 'w' for append):param flags:写入文件格式(w,wb,a) floder将文件数据写入文件夹和文件名组合:return"""result = Falseif os.path.isdir(folder):try:file_obj = open(os.path.join(folder, filename), flags)file_obj.write(filedata)file_obj.close()result = Trueexcept IOError as e:print("报错了,报错信息如下:\n{}".format(e))return resultdef get_read(path, toPath, image_path):# 以二进制形式打开pdf文件with open(path, "rb") as f:# 创建一个pdf文档分析器parser = PDFParser(f)# 创建pdf文档pdfFile = PDFDocument()# 链接分析器与文档对象parser.set_document(pdfFile)pdfFile.set_parser(parser)# 提供初始化密码pdfFile.initialize()# 检测文档是否提供txt转换if not pdfFile.is_extractable:print("不提供txt转换")raise PDFTextExtractionNotAllowedelse:# 解析数据# 数据管理manager = PDFResourceManager()# 创建一个PDF设备对象laparams = LAParams()device = PDFPageAggregator(manager, laparams=laparams)# 解释器对象interpreter = PDFPageInterpreter(manager, device)num_page, num_image, num_curve, num_figure, num_TextBoxHorizontal = 0, 0, 0, 0, 0# 循环遍历列表,每次处理一个page的内容for page in pdfFile.get_pages():  # doc.get_pages() 获取page列表num_page += 1  # 页面增一interpreter.process_page(page)# 接收该页面的LTPage对象layout = device.get_result()for content in layout:print(content)if isinstance(content, LTImage):  # 图片对象num_image += 1if isinstance(content, LTCurve):  # 曲线对象num_curve += 1if isinstance(content, LTFigure):  # figure对象num_figure += 1# 也可以判断是否含有get_text()方法。图片之类的就没有# if hasattr(out,"get_text"):if isinstance(content, LTTextBoxHorizontal):with open(toPath, "a", encoding='utf-8') as f:str = content.get_text()# print(str)f.write(str)if isinstance(content, LTImage):print("检测到图片")with open(image_path, "wb") as f:im_name = content.nameim_with = content.widthim_height = content.heightim_name = content.imagemasktry:save_image(content, num_page, images_folder)print("提取正常")except Exception as e:print("图片提取异常", e)print('对象数量:\n', '页面数:%s\n' % num_page, '图片数:%s\n' % num_image, '曲线数:%s\n' % num_curve, '水平文本框:%s\n'% num_TextBoxHorizontal)if __name__=='__main__':path = r"Selenium 自动化爬虫.pdf"  # 测试提取图片pdf to_path = r"读取pdf文件03.txt"image_path = r"帅哥.png"  # 这里只是提取报存一张,如果你是提取很多的话,这个得需要改一下get_read(path, to_path, image_path)
前面的代码都是经过我自己测试的,但写文章的时候稍有改动,但不影响运行,微薄之力,希望能够帮助到你

感谢阅读!

从pdf提取图片,有两个库可以提取fitz(要install pymupdf)、pdfminer(install pdfminer3k)相关推荐

  1. aardio PDF与图片互相转换 PDFRender库

    PDFRender升级!之前发的只能从PDF生成图片,现在也可以从图片生成PDF了. 有群友问TIFF转PDF的问题,我试了试,这个库可以.你也可以试试. 有善于写库的同学,可以再帮忙优化一下. 库源 ...

  2. pdf转图片的两种方式(java)

        最近在工作中遇到业务需要把pdf转成图片供前台预览,在网上查了一些方法,有的能用,有的缺东西,时间又比较急,没时间去看.在这里我整理了两种亲测可行的方式,节省大家时间带备忘: 1.pdf按页数 ...

  3. 用python提取图片主要颜色_用Python提取图片主要颜色

    原文来自: 这段代码主要用来从图片提取其主要颜色,类似Goolge和Baidu的图片搜索时可以指定按照颜色搜索,所以我们先需要将每张图片的主要颜色提取出来,然后将颜色划分到与其最接近的颜色段上,然后就 ...

  4. android提取图片颜色代码,Android 中动态提取图片中颜色作为主题色

    功能需求 一个页面中顶部显示一张图片(图片从网络加载),此时需要根据图片的颜色来动态调整顶部标题栏的背景色. 技术要求 Android 调色板支持库 实现过程 1.添加调色板支持库 dependenc ...

  5. open cv提取图片特征值_基于VGG16网络提取Flicker8K数据集图像特征

    # !/usr/bin/env python3 # -*- coding: utf-8 -*- # @Time : ${20200326} ${18:00} # @Author : ZicoZhou ...

  6. python 两种提取pdf中图片的包

    项目需求,提取pdf中图片,找半天的结果 1.fitz (我没找到元素定位的方法) pip install pymupdf import fitzdef extract_pic_from_pdf(pd ...

  7. java通过itext方法往pdf中插入图片(交互式pdf插入图片无法显示)

    本文参考自: 原文地址 一.:首先明确pdf的类型,在自己的开发过程中发现pdf也分几种类型. 我目前这里就指出常用两种: 一种是交互式pdf,他的组件可以读取,可以被编辑,比如liveCycle(A ...

  8. 【Python】PyMuPDF模块将PDF转换为图片

    上一篇文章介绍了pdf2image模块+poppler将PDF转换为图片,这篇文章主要介绍另外一个模块PyMuPDF.  PyMuPDF(又名"fitz"):MuPDF的Pytho ...

  9. python提取图片文字视频教学_用Python提取视频中的图片

    小编自己码的通用型函数,支持各种常用视频格式,可满足常用需求,亲测效果和速度都不错. 想获取本文数据和完整代码的下载链接,请关注微信公众号"R语言和Python学堂",并回复发文日 ...

  10. python pdf和图片互转

    1.安装两个包 pip install PyMuPDF==1.18.17 PySimpleGUI==4.47.0 2.pdf转图片 import fitzdef pdf2img(pdf_path, i ...

最新文章

  1. MySQL 学习笔记(10)—— 联结表
  2. 【Ionic+AngularJS 开发】之『个人日常管理』App(二)
  3. win10如何使用pip下载适合自己python版本的matplotlib?(亲测有效)
  4. 【Qt】DOM创建和操作XML文档
  5. IIS负载均衡-Application Request Route详解第四篇:使用ARR实现三层部署架构
  6. Android Studio调试时遇见Install Repository and sync project的问题
  7. JavaScript实现快速排序
  8. Shiro——RememberMe
  9. 云小课|DGC数据开发之基础入门篇
  10. ArcGIS中栅格数据的金字塔详解
  11. 系统运行缓慢的问题定位步骤
  12. Java面向对象之内部类(访问格式)
  13. 【原生JavaScript案例】原生JS实现进度条
  14. 白帽子讲Web安全——世界观安全
  15. HikariCP配置手册
  16. c语言盆子接球游戏,适合幼儿园孩子的70个感统训练游戏(开发右脑)
  17. python0.1+0.2不等于0.3_为什么0.1+0.2不等于0.3
  18. 实现LZW字典压缩算法
  19. MOV指令是数据传送指令
  20. Code,Diagram and Model

热门文章

  1. 【论文解读】深度学习目标检测 | R-CNN系列里程碑 | 一文弄懂Faster R-CNN
  2. 深度卷积神经网络的高级主题
  3. wpa_supplicant介绍
  4. 2022考研数二解答题规范给分(17,18,19,22)
  5. 【02】Java进阶:17-单例设计模式、多例设计模式、枚举、工厂设计模式、Lombok
  6. 要知其然还要知其所以然printChar
  7. 紫猫插件-文件读写(1-13)
  8. HTTPS 免费证书,免费 ssl 证书,FreeSSL.cn 申请多种免费证书
  9. 人工晶状体在线公式A常数优化
  10. 微信小程序的一些开发限制