2021-07-29 使用python将pdf转图片、在图片上进行标注
針對python基礎的學習停止了接近一周,主要是因為三天的團建和一項新的實習小任務,任務雖小但是對于新手來說著實有點難度,在反復訂正和修改之后最終成功實現了要求。以下是一些值得記錄的工作筆記、學習心得。
一、pdf文件轉圖片
import fitzdef zoom_method(ori_dir, prefix, src):doc = fitz.open(ori_dir)page = doc[0]zoom_x = 2.75zoom_y = 2.75trans = fitz.Matrix(zoom_x, zoom_y).preRotate(int(0))pm = page.getPixmap(matrix=trans, alpha=False)pm.writePNG(f"{src}/{prefix}.png")img_ori_dir = f"{src}/{prefix}.png"return img_ori_dir使用的第一個方法是PYmuPDF,但是import的包名字叫fitz。
首先需要用fitz.open函數打開文件的絕對路徑,因為我的pdf中只有一頁即圖片,所以直接設置page等于doc[0]。需要調整的參數是zoom,在反復調整中發現zoom = 2.75時比較符合原尺寸。
將圖片寫入相對路徑,打開路徑即可看到轉出的圖片。
import osdef mutool_method(ori_dir, prefix, src):command = f"mutool draw -r 200 -o {src}/{prefix}.png {ori_dir}"os.system(f'D: && cd mupdf && {command}')img_ori_dir = f'{src}/{prefix}.png'return img_ori_dir在老師的建議下,我還嘗試了第二個方法:調用mutool小工具,下載地址:Index of Downloads (mupdf.com)
這個小工具需要通過終端運行,因此需要導入os包,編寫好對應指令,進入mutool所在的文件夾再進行使用,否則會報不是批處理文件的錯誤(或者在環境變量里增加路徑)。
通過mutool draw和mutool extract都可以得到pdf中圖片,draw可以自定參數200dpi,extract好像沒有這個功能,我在官方文檔的extract部分里也沒有找到如何以特定名字保存的特定文件夾(也可能是我太菜了……),因此采用了mutool draw的函數對pdf轉圖片。
在近250個pdf文件中,有一個文件無法用mutool工具進行轉變,在PYmuPDF中也有報告(但是成功轉變),推測是由于圖片太大,精度太高導致。所以mutool轉圖片可能有其他因素影響導致轉變失敗,我個人更加傾向于使用PYmuPDF。
還需要注意的是,由于os.system實現機制的問題,需要將三個cmd指令同時輸入到os.system中,否則會報錯。
在網上查到還有其他的很多方法,但是沒來得及一一嘗試,在此附上鏈接:
pdf轉圖片_三行科創的技術博客_51CTO博客
寫代碼的過程中借鑒了許多大神,也在此附上鏈接:
python中os.system cd無效_Sallyyxf的博客-CSDN博客
python中PDF轉png圖片_t852947739的博客-CSDN博客
獲取mutool以輸出“結構化文本(作為xml)”_三行代碼 (sov5.cn)
二、在圖片上進行標注
老師的要求是,框出識別后評分最低的部分并在框的上面打出識別結果。對圖像的整體的識別結果中存在json文件里,json文件的讀取和寫入會在其他文章中進行補充。在此主要介紹以PIL為方法在圖片上畫矩形。
from PIL import Image, ImageDraw, ImageFont, ImageFiledef make_sign(position, words, canvas):left = position['left']upper = position['top']width = position['width']height = position['height']path_to_ttf = 'C:/Users/86178/Desktop/tt/pfht.ttf'font = ImageFont.truetype(path_to_ttf, size=height)canvas.rectangle([left, upper, left + width, upper + height], outline=5000)canvas.text((left, upper-height-3), words, font=font, fill=5000)在python的坐標中,與人們習慣的坐標不同(圖片晚上補充),因此畫框和打字時都以左上角的位置為準。
img = Image.open(img_ro_dir) canvas = ImageDraw.Draw(img)canvas為ImageDraw引擎創建的畫布,提前聲明可以減少畫布創建,加快程序運行速度。還需要注意的是,當設置框和字體的顏色時,可以直接用字符串表示顏色,但是當對大批量的圖片進行標注時,可能會報錯提示墨水不足,最多256之類的。但是當我們使用RBG形式來標識顏色,即上面代碼所表示的,則不會有報錯。同時,由于python默認字體為latin什么的,沒有中文表示,因此輸出的文字為中文時,可以導入中文字體包進行打印。
2021-08-04更新
在上文我說用字符串表示顏色,在大批量圖片標注時報錯墨水不足,用RBG形式修改即可正確是錯誤的。實際上導致這個錯誤的原因是圖片的位深度為8位,需要將圖片的位深度轉變為24位即可解決。與RBG形式無關。同時,上面代碼也不是RBG形式,而是用整數表示顏色。
還有,標注圖片時,需如果發現線條出現空心狀,可以查看圖片屬性是不是有32位深度,將32位深度轉換為24位深度即可。
轉換位深度代碼如下:
if img.getbands() == ('R', 'G', 'B', 'A') or img.getbands() == ('P',) or img.getbands() == ('L',):img_temp = img.convert('RGB')img.getbands()獲取圖片的位深度,'P'和'L'一個是png格式8位位深度表示,一個是jpeg格式。
總結
以上是生活随笔為你收集整理的2021-07-29 使用python将pdf转图片、在图片上进行标注的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2023什么蓝牙耳机值得入手?值得入手的
- 下一篇: 浅谈汽车颜色与人的性格之间的关系