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

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

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

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

操作:

1、PDF转PNG图片

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

针对截图此处所找到的方法如上一篇文章:

1、PyMuPDF将PDF转换成图片

pip install PyMuPDF

import sys, fitz, os, datetime

def 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=96

zoom_x = 1.33333333 #(1.33333333-->1056x816) (2-->1584x1224)

zoom_y = 1.33333333

mat = 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)

image.gif

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

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

官方示例代码如下:

image

#下面的这段代码就是想要从一页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)

image.gif

实际用到的例子是:

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

import sys, fitz, os, datetime

def 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=96

zoom_x = 1.33333333 #(1.33333333-->1056x816) (2-->1584x1224)

zoom_y = 1.33333333

mat = 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 document

for pg in range(pdfDoc.pageCount): # iterate through the pages

page = pdfDoc[pg]

rotate = int(0)

# 每个尺寸的缩放系数为1.3,这将为我们生成分辨率提高2.6的图像

# 此处若是不做设置,默认图片大小为:792X612, dpi=96

zoom_x = 1.33333333 #(1.33333333-->1056x816) (2-->1584x1224)

zoom_y = 1.33333333

# 缩放系数1.3在每个维度 .preRotate(rotate)是执行一个旋转

mat = fitz.Matrix(zoom_x, zoom_y).preRotate(rotate)

rect = page.rect # 页面大小

mp = rect.tl + (rect.bl - (0,75/zoom_x)) # 矩形区域 56=75/1.3333

clip = 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 PNG

if __name__ == "__main__":

pdfPath = '../path/demo.pdf'

imagePath = '../path/image'

#pyMuPDF_fitz(pdfPath, imagePath)#只是转换图片

pyMuPDF2_fitz(pdfPath, imagePath)#指定想要的区域转换成图片

当然上面这种是综合下来最快的,另外再介绍一种方法pdf2image

2、pdf2image 将PDF转换成图片

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

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

1、安装pdf2image: pip install pdf2image

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

Windows用户必须为Windows安装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_bytes

import tempfile

from pdf2image.exceptions import (

PDFInfoNotInstalledError,

PDFPageCountError,

PDFSyntaxError

)

def pdf2image2(pdfPath, imagePath, pageNum):

#方法一:

#convert_from_path('a.pdf', dpi=500, "output",fmt="JPEG",output_file="ok"

#,thread_count=4)

#这会将a.pdf转换成在output文件夹下形如ok_线程id-页码.jpg的一些文件。

#若不指定thread_count则默认为1,并且在文件名中显示id. 这种转换是直接写入到磁盘上的,

#因此不会占用太多内存。

#下面的写法直接写入到内存,默认是C:\Users\pppp\AppData\Local\Temp\生成的uuid4名字

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

3、 比较PyMuPDF和pdf2image

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

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

4、Wand将PDF转换成图片

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

Wind官网:http://docs.wand-py.org/en/0.5.6/

from wand.image import Image

filename="somefile.pdf"

with(Image(filename=filename, resolution=120)) as source:

images = source.sequence

pages = len(images)

for i in range(pages):

n = i + 1

newfilename = filename[:-4] + str(n) + '.jpeg'

Image(images[i]).save(filename=newfilename)

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

pdf转换成jpg python_【PyMuPDF和pdf2image】Python将PDF转成图片PNG和JPG相关推荐

  1. 各种PDF转换问题(三).将AutoCAD图纸转为PDF文档

    目前国内企业生产的自动化程度并不是很高,大多数都无法使用三维图直接进行加工生产,所以二维图对于大多数企业来说,仍然是最根本的生产依据.那么,在企业中,二维图转PDF就是一个很重要的小步骤,因为后续的打 ...

  2. 【PDF转换电子书】云展网教程 | 如何制作PDF文件上传云展网?

    云展网仅支持PDF文件上传,但是没有PDF文件怎么办呢?以下推荐几种制作PDF文件的方法: 方法一:图片转换为PDF文件 有图片文件,可以把图片文件转换为PDF文件. 方法二:使用专业PDF制作工具制 ...

  3. delphi pdf 转换 html5,Delphi使用Word ActiveX将doc转换为pdf

    我使用以下.vbs脚本执行此操作.如果你需要Delphi代码,那么转换就很容易了: Const wdDoNotSaveChanges = 0 Const wdRevisionsViewFinal = ...

  4. 高中学历能学python_高中生学编程--Python学习.pdf

    目录 前言 高中生如何学习编程 一.Python语言的入门 二.计算机系统的简单介绍 三.计算机语言的介绍 四.Python语言简单介绍 五.Python的语言基础 六.Python的程序流程 七.P ...

  5. python提取pdf内容_别再问如何用Python提取PDF内容了!

    导读 大家好,在之前的办公自动化系列文章中我们已经详细介绍了

  6. 怎么把PDF转换成Excel表格?两分钟教会你如何转换

    如何将PDF文件转换成Excel表格的格式呢?大家在办公过程中还是会经常使用到PDF文件的,因为这种格式的文件表现出来特征非常稳定,因此我们很多时候下载或者是接收到的文件都是PDF文件,但是我们需要使 ...

  7. 如何把pdf转换成excel转换器免费版

    pdf转换成excel转换器转换PDF到Excel是容易的,但你需要一个有效,并且能支持各种PDF各种版本功能强大PDF转换到Adobe Excel最佳解决方案. 迅捷PDF转换成Excel转换器[h ...

  8. 教你如何将PDF转换成其他格式!

    在我们的日常工作和生活中,通过电脑处理相关工作的主要文件形式主要有Word.Excel.PPT.TXT.图片等形式,这几种文件格式基本可以满足我们日常工作需求.但是这几年开始,又有一种比较流行的文件格 ...

  9. pdf转换成excel转换器破解版下载

    PDF作为便捷的文档格式,将传统文档的文本.格式.字体.颜色.分辨率等都所有信息封装在一个特殊整合文件中,功能上大大超越了现有的各种流行文本格式,是新一代电子文本不可正义的文档模式,如此完美的文档格式 ...

  10. 比较好的pdf转换成txt转换器

    比较好的pdf转换成txt转换器 随着PDF文件格式在网络上的流行,越来越多文学作品以及学术论文等信息都被设置成PDF文件格式.对于不少爱好阅读的网友来说,下载这部分的PDF资料进行参考学习是非常重要 ...

最新文章

  1. 英语发音规则---N字母
  2. 网站的线下活动如何组织
  3. Android开发究竟该如何学习,含泪整理面经
  4. TestNG和Maven配置指南
  5. select,epoll的比较
  6. win10 后台运行jar包_小编演示win10系统双击运行jar文件的教程
  7. [转][中文/英文]VC6 sp6补丁下载|VS6 sp6补丁下载 [防VC6卡死]
  8. 中国生物能源行业市场规模预测及未来战略规划建议报告2022-2028年
  9. 截图文字识别工具(OCR),图片上的文字也能轻松复制
  10. 查看服务器显卡GPU型号
  11. java的try后面跟括号
  12. 煤矿用计算机,煤矿安全生产中计算机的运用
  13. 基于java网盘搜索的设计与实现
  14. 微前端 Micro-Frontends - 概念
  15. 百万CT网上卖,东软医疗这样推动行业阳光采购
  16. 将Latex tex文档转换成 word文档(上)
  17. VS中MD和MT的区别
  18. Android中添加万普广告墙、推送广告等
  19. linux 查看软件安装时间,centos7 查看软件安装时间
  20. 【思特奇杯·云上蓝桥-算法集训营】第1周 猴子分香蕉 java

热门文章

  1. Xposed模块不生效的解决办法
  2. 为什么同时需要IP地址和MAC地址
  3. 电话程控交换机安装经验
  4. 生死看淡,不服就GAN(七)----用更稳定的生成模型WGAN生成cifar
  5. 文件系统大目录下的操作性能效率提升
  6. Eclipse开发环境搭建
  7. 【转载】客单价是什么意思?如何提高客单价?
  8. 【BJOI2019】勘破神机【数论】
  9. 【Arduino学习】01.开发板选择和环境的搭建
  10. uboot研读笔记 | 13 - uboot编译构建Makefile分析研读(2016.03版本)