日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

2021-07-29 使用python将pdf转图片、在图片上进行标注

發布時間:2024/1/18 python 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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转图片、在图片上进行标注的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。