前言:在最近的测试中遇到一个与PDF相关的测试需求,其中有一个过程是将PDF转换成图片,然后对图片进行测试。

粗略的试了好几种方式,其中语言尝试了Python和Java,总体而言所找到的Python方式相对比Java更快一些,更简单一些。

下面首先分享一下Python将PDF转换成图片,Java后续有时间在进行分享。

需求:我需要先将PDF转换成为PNG图片,并截取图片的一部分存储,然后作为测试目标进行测试。

操作:

1、PDF转PNG图片

2、对PNG图片进行指定区域截图,在另存到指定文件夹下

针对截图此处所找到的方法如上一篇博客:Python图片裁剪的两种方式——Pillow和OpenCV

PyMuPDF将PDF转换成图片

import sys, fitzimport osimport datetimedef pyMuPDF_fitz(pdfPath, imagePath):startTime_pdf2img = datetime.datetime.now()#开始时间print("imagePath="+imagePath)pdfDoc = fitz.open(pdfPath)for pg in range(pdfDoc.pageCount):page = pdfDoc[pg]rotate = int(0)# 每个尺寸的缩放系数为1.3,这将为我们生成分辨率提高2.6的图像。# 此处若是不做设置,默认图片大小为:792X612, dpi=96zoom_x = 1.33333333 #(1.33333333-->1056x816) (2-->1584x1224)zoom_y = 1.33333333mat = fitz.Matrix(zoom_x, zoom_y).preRotate(rotate)pix = page.getPixmap(matrix=mat, alpha=False)if not os.path.exists(imagePath):#判断存放图片的文件夹是否存在os.makedirs(imagePath) # 若图片文件夹不存在就创建pix.writePNG(imagePath+'/'+'images_%s.png' % pg)#将图片写入指定的文件夹内endTime_pdf2img = datetime.datetime.now()#结束时间print('pdf2img时间=',(endTime_pdf2img - startTime_pdf2img).seconds)if __name__ == "__main__":pdfPath = '../path/demo.pdf'imagePath = '../path/image'pyMuPDF_fitz(pdfPath, imagePath)

PDF文档页数超过100页的话需要十几秒,因为先转换成一整张1056X816的图片,再对本地文件中的所有图片进行遍历截图,时间上比较慢,通过查看文档发现:

还可以在转换的同时指定图片的大小,对图片指定区域进行截取,这样快很多,一步到位,省去了二次截图的过程,前提是我们必须要知道想要截取哪一块区域并保存。

官方示例代码如下:

#下面的这段代码就是想要从一页PDF的中心点为起点截取到右下角的区域,截取整张图的1/4.>>> mat = fitz.Matrix(2, 2) # 在每个方向缩放因子2>>> rect = page.rect # 页面的矩形>>> mp = rect.tl + (rect.br - rect.tl) * 0.5 # 矩形的中心>>> clip = fitz.Rect(mp, rect.br) # 我们想要的剪切区域>>> pix = page.getPixmap(matrix = mat, clip = clip)

实际用到的例子是:

整张图片导出之后是1056*816,但是我想要的是这张图片最底部的部分1056*75,相当于PDF文档的页脚部分。

import sys, fitzimport osimport datetimedef pyMuPDF_fitz(pdfPath, imagePath):startTime_pdf2img = datetime.datetime.now()#开始时间pdfDoc = fitz.open(pdfPath)for pg in range(pdfDoc.pageCount):page = pdfDoc[pg]rotate = int(0)# 每个尺寸的缩放系数为1.3,这将为我们生成分辨率提高2.6的图像。# 此处若是不做设置,默认图片大小为:792X612, dpi=96zoom_x = 1.33333333 #(1.33333333-->1056x816) (2-->1584x1224)zoom_y = 1.33333333mat = fitz.Matrix(zoom_x, zoom_y).preRotate(rotate)pix = page.getPixmap(matrix=mat, alpha=False)if not os.path.exists(imagePath):#判断存放图片的文件夹是否存在os.makedirs(imagePath) # 若图片文件夹不存在就创建pix.writePNG(imagePath+'/'+'images_%s.png' % pg)#将图片写入指定的文件夹内endTime_pdf2img = datetime.datetime.now()#结束时间print('pdf2img时间=',(endTime_pdf2img - startTime_pdf2img).seconds)def pyMuPDF2_fitz(pdfPath, imagePath):pdfDoc = fitz.open(pdfPath) # open documentfor pg in range(pdfDoc.pageCount): # iterate through the pagespage = pdfDoc[pg]rotate = int(0)# 每个尺寸的缩放系数为1.3,这将为我们生成分辨率提高2.6的图像# 此处若是不做设置,默认图片大小为:792X612, dpi=96zoom_x = 1.33333333 #(1.33333333-->1056x816) (2-->1584x1224)zoom_y = 1.33333333mat = fitz.Matrix(zoom_x, zoom_y).preRotate(rotate) # 缩放系数1.3在每个维度 .preRotate(rotate)是执行一个旋转rect = page.rect # 页面大小mp = rect.tl + (rect.bl - (0,75/zoom_x)) # 矩形区域 56=75/1.3333clip = fitz.Rect(mp, rect.br) # 想要截取的区域pix = page.getPixmap(matrix=mat, alpha=False, clip=clip) # 将页面转换为图像if not os.path.exists(imagePath):os.makedirs(imagePath)pix.writePNG(imagePath+'/'+'psReport_%s.png' % pg)# store image as a PNGif __name__ == "__main__":pdfPath = '../path/demo.pdf'imagePath = '../path/image'#pyMuPDF_fitz(pdfPath, imagePath)#只是转换图片pyMuPDF2_fitz(pdfPath, imagePath)#指定想要的区域转换成图片

当然上面这种是综合下来最快的,另外PyMuPDF还可以对PDF进行追加删除之类的功能。

下面再介绍一种方法pdf2image

pdf2image 将PDF转换成图片

pdf2image也是个包装器,真正的转换工具是poppler

GitHub地址:https://github.com/Belval/pdf2image ,上面也有相关的配置说明。

1、安装pdf2image: pip install pdf2image

2、Windows安装配置poppler(这里只介绍Windows,Mac和Linux去上面Github地址里面参考官网)

Windows用户必须为Windows安装poppler (http://blog.alivate.com.au/poppler-windows/),然后将bin/文件夹添加到PATH(开始>输入env>编辑系统环境变量>环境变量...>系统变量>Path)

注意:这里配置之后需要重启一下电脑才会生效,不然会报如下错误:

ERROE:FileNotFoundError: [WinError 2] The system cannot find the file specified

During handling of the above exception, another exception occurred:

3、pip install pillow (如果你还没有安装过的话)

from pdf2image import convert_from_path,convert_from_bytesimport tempfilefrom pdf2image.exceptions import (PDFInfoNotInstalledError,PDFPageCountError,PDFSyntaxError)def pdf2image2(pdfPath, imagePath, pageNum):#方法一:images = convert_from_path(pdfPath, dpi=96)for image in images:if not os.path.exists(imagePath):os.makedirs(imagePath)image.save(imagePath+'/'+'psReport_%s.png' % images.index(image), 'PNG')#方法二:images = convert_from_bytes(open('/home/belval/example.pdf', 'rb').read())for image in images:if not os.path.exists(imagePath):os.makedirs(imagePath)image.save(imagePath+'/'+'psReport_%s.png' % images.index(image), 'PNG')#方法三,也是最推荐的方法with tempfile.TemporaryDirectory() as path:images_from_path = convert_from_path(pdfPath, output_folder=path, dpi=96)for image in images_from_path:if not os.path.exists(imagePath):os.makedirs(imagePath)image.save(imagePath+'/'+'psReport_%s.png' % images_from_path.index(image), 'PNG')print(images_from_path)

以下是参数定义:

convert_from_path(pdf_path, dpi=200, output_folder=None, first_page=None, last_page=None, fmt='ppm', thread_count=1, userpw=None, use_cropbox=False, strict=False, transparent=False, single_file=False, output_file=str(uuid.uuid4()), poppler_path=None)

convert_from_bytes(pdf_file, dpi=200, output_folder=None, first_page=None, last_page=None, fmt='ppm', thread_count=1, userpw=None, use_cropbox=False, strict=False, transparent=False, single_file=False, output_file=str(uuid.uuid4()), poppler_path=None)

pdf_path -->要转换的PDF文档路径

dpi -->DPI中的图像质量(默认为200),Windows默认为96dpi

output_folder -->将生成的图像写入文件夹(而不是直接写入内存)若是path不做指定的话,path的默认地址是:C:\Users\pzhang7\AppData\Local\Temp\生成的uuid4。

first_page -->从哪一页开始转换,默认是PDF的第一页

last_page -->转换到哪一页,默认是PDF的最后一页

fmt --> 输出图像格式默认格式是ppm,还可以设置为png和jpeg等

thread_count -->允许生成多少个线程进行处理,一般不超过4个线程;

userpw -->PDF的密码(若有密码的话需要添加)

use_cropbox --> 使用cropbox而不是mediabox

strict -->参数允许您使用自定义类型PDFSyntaxError捕获pdftoppm语法错误

transparent -->参数允许生成没有背景的图像,而不是通常的白色图像(为此需要pdftocairo)

single_file -->使用pdftoppm / pdftocairo中的-singlefile选项

output_file --> 输出文件名是什么

poppler_path -->查找poppler二进制文件的路径,允许用户使用poppler_path指定poppler的安装路径;默认不指定的话需要将bin添加到系统PATH

pdf2image应该也可以对指定区域进行截取,暂时还没详细研究其方法,因为已经找到更快的方法解决问题了,对比如下所示:

比较PyMuPDF和pdf2image

以下是对一份75页的PDF,输出DPI=96的时间性能对比,pdf2image使用的是默认线程数,下面的对比并没有设置多线程,使用多线程会快一点,当线程数设为5的时候,速度是9秒。

可以看出使用pyMuPDF_Fitz明显快一倍多,最终选取了这种方式。

3、Wand将PDF转换成图片

和pdf2image一样,wand都是包装接口(bindings),而实际进行转换的工具是ImageMagick.

Wind官网:

http://docs.wand-py.org/en/0.5.6/

ImageMagick官网:

https://imagemagick.org/script/download.php#windows

from wand.image import Imagefilename="somefile.pdf"with(Image(filename=filename, resolution=120)) as source:images = source.sequencepages = len(images)for i in range(pages):n = i + 1newfilename = filename[:-4] + str(n) + '.jpeg'Image(images[i]).save(filename=newfilename)

由于问题已经解决,而且性能也还不错,就没有具体去研究Wind这种方式了,感兴趣的可以去看看。

万水千山总是情,点个“在看”行不行

pdf转换成jpg python_Python将PDF转成图片PNG和JPG相关推荐

  1. 如何将PDF转换Word?迅读PDF转换器,教你一招速成

    开工后,职场打工人又开始忙碌起来.刚毕业不久的小李,可谓"开工不顺",上班第一天就被要求整理产品资料,而且都是PDF格式的.这可难倒小李了,以前只需点击文件就进入Word编辑,现在 ...

  2. pdf转换成jpg python_python 把pdf转成图片文件

    Wand是ctypes基于Python 的简单ImageMagick绑定. 1. 安装wand包:pip install Wand 注意:在选择ImageMagick32位还是64位,这个需要和pyt ...

  3. pdf转换html语言,怎样把pdf转换成html?

    原标题:怎样把pdf转换成html? HTML是万维网浏览器使用的一种语言,它消除了不同计算机之间信息交流的障碍.它是目前网络上应用最为广泛的语言,也是构成网页文档的主要语言.文本标记语言html在浏 ...

  4. 除PDF转换,写论文还需PDF编辑?迅读PDF大师告诉你答案

    论文是毕业的一道门槛,无合格的毕业论文,就意味着无法获得学位证书.现在已经是1月,相信很多大学生,尤其是研究生,已经开始筹备毕业论文了.提起写论文,没有人会不参考知网,而知网上的历史文献基本都是PDF ...

  5. PDF转换技巧之如何使用PDF转换器经验分享

    当年为了搞论文,在网上找了很多资料,但都是pdf和caj格式的,都没办法直接编辑,后来网上求助得知了这款转换神器,迅捷pdf转换器,从此就像打开了新世界的大门.各位还在纠结怎么转的快看过吧.各种转转转 ...

  6. 一款免费的PDF转换工具-LightPDF完美版(PDF编辑器) 最新版

    LightPDF完美版(PDF编辑器)是一款免费的pdf编辑转换工具,可以在pdf和word.ppt以及png等文件格式之间进行互相转换,非常的便捷.LightPDF破解版不需要注册,打开软件选择需要 ...

  7. pdf转换成jpg python_Python 将pdf转成图片的方法

    本篇文章记录如何使用python将pdf文件切分成一张一张图片,包括环境配置.版本兼容问题. 环境配置(mac) 安装ImageMagick brew install imagemagick 这里有个 ...

  8. pdf转换成jpg python_Python将PDF转成图片

    新建pdfconverter.py 文件,并将以下代码复制粘贴: # -*- coding: utf-8 -*- import io from wand.image import Image from ...

  9. pdf 改变页面大小 python_python – 裁剪.pdf文件的页面

    pypdf在我所期望的这个领域.使用以下脚本: #!/usr/bin/python # from pyPdf import PdfFileWriter, PdfFileReader input1 = ...

  10. 批量PDF转换成Office文件 PDF转换器下载

    2019独角兽企业重金招聘Python工程师标准>>> 迅捷PDF转换成Word转换器采用了最新的一代的增强版核心技术,除了加强原超线程批量转换技术之外,新版本还提升了软件的多文件格 ...

最新文章

  1. jetty9请求form表单太小限制
  2. scala学习笔记-面向对象编程之Trait
  3. java 打包下载文件_java下载打包下载文件
  4. idea maven web工程明明添加了maven lib的依赖,但启动web容器时始终报No Class Found?...
  5. Targeted Resumes How to Write a Targeted Resume By Alison Doyle
  6. fis php,在node.js上安装fis后显示fis不是内部命令,安装fis的环境变量配置问题
  7. PHP中的Traits用法详解
  8. unity的函数生命周期
  9. 基于RSSI及KNN算法的WiFi室内定位实现
  10. android webview浏览器下载文件,Android 浏览器 —— 使用 WebView 实现文件下载
  11. 《管理学》第八章 领导
  12. 金融区块链标准规范解读
  13. 【Maven】简介信息
  14. 论文研读-基于种群分布的两阶段自适应知识迁移多目标进化多任务
  15. 极兔速递 一面面试题
  16. 直播凸显内容优势 网易新闻月活过亿有”深”意
  17. vue 获取当年当前季度
  18. 【STM32H7教程】第24章 STM32H7的Cache解读(非常重要)
  19. Fork/Join框架之双端队列
  20. 电子化招投标系统有哪些功能特点?

热门文章

  1. 电容的耐压值选择---陶瓷电容、钽电容、电解电容
  2. 阿里语音识别(语音转文字)java调用全程手把手详解-适合中小学生快速上手
  3. 真实的软件测试日常工作是咋样的?
  4. 逻辑英语与语法俱乐部比较
  5. 世界杯直播背后看不见的战斗
  6. 菜鸟历程1腾讯云服务器 10元学生套餐购买
  7. SEM和SEO有什么区别,哪种更好一些
  8. 中国银行计算机笔试题库,中国银行笔试真题-计算机部分
  9. 自动化测试的流程是什么
  10. Si24R1,CI24R1,nRF24L01简单解析对比