前言:在最近的測試中遇到一個與PDF相關的測試需求,其中有一個過程是將PDF轉換成圖片,然后對圖片進行測試。
粗略的試了好幾種方式,其中語言嘗試了Python和Java,總體而言所找到的Python方式相對比Java更快一些,更簡單一些。
下面首先分享一下Python將PDF轉換成圖片,Java后續有時間在進行分享。
需求:我需要先將PDF轉換成為PNG圖片,並截取圖片的一部分存儲,然后作為測試目標進行測試。
操作:
1、PDF轉PNG圖片
2、對PNG圖片進行指定區域截圖,在另存到指定文件夾下
針對截圖此處所找到的方法如上一篇文章:Python圖片裁剪的兩種方式——Pillow和OpenCV
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
作者:軟測小生
鏈接:https://www.jianshu.com/p/f57cc64b9f5e
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。