.net pdf转图片_pdf2image类库实现批量pdf转图片

通过pdf2image来实现对PDF文件的处理工作,我们本次主要做的是将PDF文件批量转成图片。之前写过批量提取封面的文章,但是在后期的深入编写过程中遇到一些问题,近期再次深入编写程序,一起来看看代码吧!

6151d8f6d8813f53af85d8eae92f9189.png

python

一、说明

本次使用python的类库pdf2image来实现功能,pdf2image需要poppler和pillow的支持。

二、安装poppler和pillow

1、popple安装

window安装方式

通过国内网址:http://blog.alivate.com.au/poppler-windows/,下载压缩包,将压缩包进行解压操作,目录如下图,将解压包放置到磁盘根目录(避免出现误删除情况),进入lib文件夹,复制路径。如下:C:poppler-0.68.0lib,将路径添加到环境变量PATH中。然后将电脑重新启动(需要重启一下电脑才会生效)

8800f628079724e031e7ff60838b372a.png

示例


linux安装(centos为例)

yum install poppler poppler-cpp-devel poppler-utils

2、pillow安装

pip install pillow

三、编写代码

import configparserimport osfrom pdf2image import convert_from_path, convert_from_bytes '''    PDF 文件转图片    使用类库 pdf2image''' # 获取目录下所有 PDF 格式文件def get_path_file(files_path):    print('开始获取文件列表')    f = open('./list.txt', 'a+', encoding='utf-8')    for root, dirs, files in os.walk(files_path, topdown=False):        for name in files:            f_p = os.path.join(root, name).replace("", "/")            if ".pdf" in f_p:                f.write(f_p + "")    f.close() # 生成文件def make_pdf(pdf_path, save_path, ppm_path):    # 通过路径获取文件集合    get_path_file(pdf_path)    # 读取列表文件,获取集合数据    f = open("./list.txt", 'r', encoding='utf8')    path_url = f.read()    file_data = path_url.split("")    count = len(file_data)    print("共计PDF文件数:%s" % count)    for index, v_path in enumerate(file_data):        # 路径为空,跳出        if not v_path:            continue        print('剩余:%s,本次生成文件:%s' % ((count - index - 2), v_path))        # 将 pdf 路径中的 斜线 替换        pdf_path = pdf_path.replace('', '/')        new_file_path = v_path.replace(pdf_path, save_path).replace('.pdf', '/')        images = convert_from_path(            pdf_path=v_path,  # 要转换的pdf的路径            dpi=200,  # dpi中的图像质量(默认200)            output_folder=ppm_path,  # 将生成的图像写入文件夹(而不是直接写入内存)            first_page=None,  # 要处理的第一页            last_page=None,  # 停止前要处理的最后一页            fmt="ppm",  # 输出图像格式            jpegopt=None,  # jpeg选项“quality”、“progressive”和“optimize”(仅适用于jpeg格式)            thread_count=4,  # 允许生成多少线程进行处理            userpw=None,  # PDF密码            use_cropbox=False,  # 使用cropbox而不是mediabox            strict=False,  # 当抛出语法错误时,它将作为异常引发            transparent=False,  # 以透明背景而不是白色背景输出。            single_file=False,  # 使用pdftoppm/pdftocairo中的-singlefile选项            poppler_path=None,  # 查找poppler二进制文件的路径            grayscale=False,  # 输出灰度图像            size=None,  # 结果图像的大小,使用枕头(宽度、高度)标准            paths_only=False,  # 不加载图像,而是返回路径(需要output_文件夹)            use_pdftocairo=False,  # 用pdftocairo而不是pdftoppm,可能有助于提高性能            timeout=None,  # 超时        )        # 不存在时跳出        if not images:            print('文件内容为空,跳出:%s' % v_path)            continue         # 文件名称        file_name = os.path.basename(v_path)        if '.pdf' not in file_name:            print("此文件非PDF文件")            continue        if not os.path.exists(new_file_path):            os.makedirs(new_file_path)        else:            # 存在目录 获取目录下文件数量            if images == len(os.listdir(new_file_path)):                continue        for i, image in enumerate(images):            image.save("./%s/%d.png" % (new_file_path, i), "PNG")            # print("正在保存第%s张图" % i)            # 删除 缓存目录        delete_file(ppm_path)  # 判断目录是否存在def get_path_status(path, status):    path_status = os.path.exists(path)    if not path_status and status:        os.makedirs(path)    elif not path_status:        print('%s,目录不存在' % path)        exit()  # 删除文件夹及其子文件def delete_file(path):    # 先把各个目录的文件删除完    for root, dirs, files in os.walk(path):        for file in files:            filepath = os.path.join(root, file)            try:                os.remove(filepath)                # print("删除文件%s成功" % file)            except:                print("删除文件%s异常" % file)  if __name__ == '__main__':    pro_dir = os.path.split(os.path.realpath(__file__))[0]    config_path = os.path.join(pro_dir, "config.ini")    if not os.path.exists(config_path):        print("无配置文件,请先填写")        exit()    con = configparser.ConfigParser()    print('开始读取配置文件')    # 读取配置    con.read(config_path, encoding='utf-8')     get_path_status(con['PATH']['file_path'], False)    get_path_status(con['PATH']['save_path'], True)    get_path_status(con['PATH']['cache_path'], True)     make_pdf(con['PATH']['file_path'], con['PATH']['save_path'], con['PATH']['cache_path'])    # 删除缓存空目录和资源列表文件    os.removedirs(con['PATH']['cache_path'])    os.remove('./list.txt')    print('任务处理完成')

配置文件使用的.ini文件,名称为config.ini。将配置文件和代码文件放置在同级目录中,内容如下:

[PATH]; 文件存储目录 格式如下: file_path = F:PDF文件PDF资料其他file_path = D:python2020-10-14【pdf转图片】pdf; 图片保存目录save_path = ./image/; 缓存生成目录cache_path = ./ppm/

四、运行截图

056f84d65351b26af80147513cad7de3.png

截图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/472681.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 悬浮提示框_表格(悬浮框提示)

JTable的ToolTip提示和其它的组件提示是一样的,因为它们都是继承于Jcomponent,当我们需要为我们的单元格实现ToolTip的时候,只需要复写它的getToolTipText方法就可以了,看看Sun官方的例子://Implement table cell tool tips.OverridepublicString getToolTipText(Mo…

linux远程工具_【linux实操3.1】linux远程连接工具Secure的使用

把自己的闲置笔记本用来做centos7服务器了,同时也出一期教程,记录自己同时也帮助需要的人;安排如下1、【linux实操1】华硕笔记本安装centos7实战2、【linux实操2】使用yum在命令行安装常用工具3、【linux实操3】安装漂亮的桌面xfce桌面**记录…

IOS--UIAlertView的使用方法详细

IOS--UIAlertView的使用方法详细 // UIAlertView的常用方法 // 标准样式 UIAlertView *oneAlertView [[UIAlertView alloc] initWithTitle:"标题"message:"提示内容" delegate:self cancelButtonTitle:"关闭"otherButtonTitles:"OK"…

afreecatv 回放下载_行车记录仪怎么看回放?行车记录仪停车后能自动录像吗

点击上面蓝色字↑↑↑即可免费订阅!请喜欢的朋友请转发和分享,让更多朋友看到汽车知识天天学 (微信号:qiche92 )  行车记录仪最关键的一个部件,它就是储存零件——TF卡(内存卡)。在购买行车记录仪时,TF卡并不是标配&…

lstm原始论文_有序的神经元——ON-LSTM模型浅析

尽管最近出现的Transformer系列的模型在nlp领域内很流行,但RNN仍然有着重要的地位。本文介绍的模型来自于ICLR 2019的最佳论文之一,它针对自然语言具有语法分层的特点,对原有的LSTM模型的结构做出了改进,使得新模型不仅具有更好的…

c++ 航空管理系统_浅谈航站楼能源管理系统的设计与应用

蒋超萍江苏安科瑞电器制造有限公司 江苏江阴 214400 【摘要】根据航站楼的特点,从航站楼能源消耗现状、能源管理系统的功能、系统架构、子系统以及能源的优化调度方案五个方面介绍了航站楼能源管理系统的设计,并对节能效果进行了预测。关键词&#xff1a…

LeetCode 1785. 构成特定和需要添加的最少元素(贪心)

文章目录1. 题目2. 解题1. 题目 给你一个整数数组 nums &#xff0c;和两个整数 limit 与 goal 。 数组 nums 有一条重要属性&#xff1a;abs(nums[i]) < limit 。 返回使数组元素总和等于 goal 所需要向数组中添加的 最少元素数量 &#xff0c;添加元素 不应改变 数组中 …

insert和update 锁等待_黑龙F5智感双全智能锁全球首发,掀起惊艳风潮

2020备受瞩目重磅新品 —— 黑龙F5智感双芯智能门锁&#xff0c;正式官宣&#xff0c;革新行业的智感解锁交互&#xff0c;强大的双芯片双智控&#xff0c;再次掀起惊艳风潮。双芯片科技感交互&#xff0c;领行业新风向黑龙F5智能锁前沿性地配备双芯片&#xff0c;以双核分别掌…

怎么更改苹果账户名称_番茄todo小组件背景怎么改 苹果番茄todo小组件背景更改方法介绍...

番茄todo小组件背景怎么改&#xff0c;这也是大家会用到的一款倒计时APP&#xff0c;那么用户们应该怎么更改小组件的背景图片呢&#xff0c;可能还有些人不知道更改的方法。所以这里就为大家带来了具体的步骤!番茄todo小组件背景怎么改1.在打开APP后&#xff0c;如没有待办事项…

LeetCode 1786. 从第一个节点出发到最后一个节点的受限路径数(迪杰斯特拉 + 拓扑排序)

文章目录1. 题目2. 解题1. 题目 现有一个加权无向连通图。 给你一个正整数 n &#xff0c;表示图中有 n 个节点&#xff0c;并按从 1 到 n 给节点编号&#xff1b;另给你一个数组 edges &#xff0c;其中每个 edges[i] [ui, vi, weighti] 表示存在一条位于节点 ui 和 vi 之间…

java选择题多选题系统小程序_单选题与多选题判断得分(自动考试小程序,入门级)...

【单选题与多选题判断得分】【核心代码】using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;namespace 自动…

diskfileitemfactory 需要的包_浅析电动汽车电池包低压线束设计及制造

点击上方右侧“EDC电驱未来”可订阅哦&#xff01;般的电池包低压线束承载着模组通信、模组采样和电池管理等功能。电池包低压线束一般分为模组通信线束、模组采样线束、BMS线束等。这里结合实际工作中的经历和遇到的困扰&#xff0c;主要分析和探讨SUV纯电动汽车电池包低压线束…

xgboost实例_XGBoost超详细推导,终于有人讲明白了!

- XGB中树结点分裂的依据是什么&#xff1f;- 如何计算树节点的权值&#xff1f;- 为防止过拟合&#xff0c;XGB做了哪些改进&#xff1f;相信看到这篇文章的各位对XGBoost都不陌生&#xff0c;的确&#xff0c;XGBoost不仅是各大数据科学比赛的必杀武器&#xff0c;在实际工作…

修改dts后重编译_「正点原子FPGA连载」第二十章另一种方式编译ZYNQ镜像

1)摘自【正点原子】领航者 ZYNQ 之linux驱动开发指南2)实验平台&#xff1a;正点原子领航者ZYNQ开发板3)平台购买地址&#xff1a;https://item.taobao.com/item.htm?&id6061601087614)全套实验源码手册视频下载:http://www.openedv.com/docs/boards/fpga/zdyz_linhanz.ht…

流畅的Python 2. 数据结构 - 序列构成的数组

文章目录1. 内置序列2. 列表推导 []、生成器() 表达式3. 元组 tuple4. 切片5. , * 操作6. 增量赋值7. 排序8. bisect管理已排序序列8.1 用 bisect.bisect 二分搜索8.2 用 bisect.insort 二分插入新元素9. 列表的替代9.1 数组9.2 内存视图9.3 NumPy、SciPy9.4 队列1. 内置序列 …

hadoop 多机全分布式安装步骤(虚拟机1master+2slave)

文章目录1. 虚拟机安装Centos72. 配置静态IP3. 更改主机名4. 编辑域名映射5. 安装配置Java6. 配置SSH免密登录7 .安装Hadoop8. 关闭防火墙9. 格式化文件系统10. 启动验证11. 第一个MapReduce程序: WordCount12. 关闭Hadoop参考书&#xff1a;《Hadoop大数据原理与应用》1. 虚拟…

ie浏览器模拟器_航空飞机模拟器安卓版下载-航空飞机模拟器游戏下载

3D建模射击&#xff0c;真实的飞行世界&#xff0c;在航空飞机模拟器游戏中玩家将化身为飞行员&#xff0c;这里的飞机类型非常齐全&#xff0c;每一辆都要熟练操作&#xff0c;最大程度还原了飞行员最真实的驾驶场景&#xff0c;完成任务获得奖励还能提高它的性能哦&#xff0…

npm安装vue_vue搭建脚手架的方式

基于window系统整理的vue脚手架npm、yarn安装方法&#xff0c;记得网络一定要好先说npm的安装方法先在需要创建项目的文件夹下打开终端&#xff0c;如果没有node可以先去官网下载&#xff0c;然后一路next&#xff0c;就OK&#xff0c;记得看清楚电脑操作系统是64还是32&#x…

《BI那点儿事》运用标准计分和离差——分析三国超一流统帅综合实力排名 绝对客观,数据说话...

数据分析基础概念&#xff1a;标准计分&#xff1a; 1、无论作为变量的满分为几分&#xff0c;其标准计分的平均数势必为0&#xff0c;而其标准差势必为1。2、无论作为变量的单位是什么&#xff0c;其标准计分的平均数势必为0&#xff0c;而其标准差势必为1。公式为&#xff1a…

天池 在线编程 最佳利用率(二分查找 + 哈希)

文章目录1. 题目2. 解题1. 题目 给两个排序的数组。 从两个数组中各取取一个数&#xff0c;这两个数之和需要小于或等于k&#xff0c; 需要找到两数之和最大的索引组合。 返回一对包含两个列表的索引。 如果有多个两数之和相等的索引答案&#xff0c;你应该选择第一个数组索引…