Python实现pdf转图片、转文字、去水印
目录
1、将PDF转成多张图片
2、将图片目录中的所有图片转换成pdf
3、利用baidu_aip将多张图片转换成txt文本
4、去除pdf的水印
1、将PDF转成多张图片
安装:
pip install PyMuPDF -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install fitz -i https://pypi.tuna.tsinghua.edu.cn/simple
pdf_to_img("输入.pdf","图片目录");
将“输入.pdf”转换成多张图片,存放在"图片目录"下。
import fitz
import os
import shutil
def pdf_to_img(pdfPath,imgFile):
father_path = os.path.abspath(os.path.dirname(pdfPath) + os.path.sep + ".")
doc = fitz.open(pdfPath)
if(os.path.exists(imgFile)):
print("删除",imgFile)
shutil.rmtree(imgFile)
os.mkdir(imgFile)
print("正在转换中。。。。。。")
pageCount = 1
for pg in range(doc.page_count):
page = doc[pg]
rotate = int(0)
zoom_x = 2.0
zoom_y = 2.0
trans = fitz.Matrix(zoom_x, zoom_y).prerotate(rotate)
pm = page.get_pixmap(matrix=trans, alpha=False)
pm.save(imgFile + '\\%s.png' % (pg+1))
print('+++++++++> {}/{}, {}.png '.format(pageCount,doc.page_count,pg+1))
pageCount += 1
return imgFile
2、将图片目录中的所有图片转换成pdf
convert_dir_pdf("图片目录","合成.pdf");
将“图片目录”中的所有图片合并成“合成.pdf",通过这种方式,能够实现pdf的拆分与合并。
import fitz
import os
#排序图片
def sort_key(s):
if s:
try:c = re.findall('^\d+', s)[0]
except:c = -1
return int(c)
#imgs:所有图片完整路径的数组
def convert_pics_pdf(imgs, pdf_path):
doc = fitz.open()
for img in imgs:
print(img)
imgdoc = fitz.open(img)
pdfbytes = imgdoc.convert_to_pdf()
imgpdf = fitz.open("pdf", pdfbytes)
doc.insert_pdf(imgpdf)
doc.save(pdf_path)
#img_path:存放图片的目录
def convert_dir_pdf(img_path, pdf_path):
imgs = os.listdir(img_path)
imgs = sorted(imgs, key = sort_key)
for i in range(0,len(imgs)):
imgs[i] = os.path.join(img_path,imgs[i])
convert_pics_pdf(imgs,pdf_path)
3、利用baidu_aip将多张图片转换成txt文本
img_to_txt("图片目录","输出.txt"),将图片目录下的所有图片转换成txt文本输出到“输出.txt"中。
百度的转换接口用了几年,还是比较稳定的,识别率也不错。网络上其他也有好几种图片转文本的方式,安装步骤比较繁琐,如果只是偶尔用一下就没有必要了。
from tkinter import *
import tkinter as tk
from tkinter import filedialog
from aip import AipOcr
import os
def sort_key(s):
if s:
try:c = re.findall('^\d+', s)[0]
except:c = -1
return int(c)
def img_to_txt(imgPath,wordFile):
APP_ID = "23403595"
API_KEY = "MIvoIhkmsYHPiA2LOZmSu3o3"
SECRET_KEY = "E063BVdf2kemnjF4hv9lcG0Xg5Of065k"
client = AipOcr(APP_ID, API_KEY, SECRET_KEY)
imgs = os.listdir(imgPath)
imgs = sorted(imgs, key = sort_key)
print("=============> ",imgs)
wordFileName = open(wordFile, 'w',encoding='utf-8')
try:
processCount = 1
for img in imgs:
print('+++++++++> {}/{},{} '.format(processCount,len(imgs),img))
processCount += 1
dakai = open(imgPath + "/" + img, "rb")
duqu = dakai.read()
message = client.basicGeneral(duqu)
for duqu in message.get("words_result"):
words = duqu.get("words")
print(words)
wordFileName.write(words)
wordFileName.write("\r\n")
except Exception:
print('===>Error')
wordFileName.close()
print("完成")
4、去除pdf的水印
步骤:先将pdf转换为图片,再去除图片上的水印,再合成一个新的pdf文件。
水印需要具体情况具体分析,这里采用最简单粗暴的方式,原理是将图片中水印的颜色(一般是灰色)替换为底色。
img_erase("图片目录"):将图片目录中的所有图片去除水印,存放在”图片目录_cvt"目录中。
完整代码如下所示:
from itertools import product
from PIL import Image
import os
import shutil
def img_erase(img_path):
imgs = os.listdir(img_path)
newpath = img_path+'_cvt'
if(os.path.exists(newpath)):
print("删除",newpath)
shutil.rmtree(newpath)
os.mkdir(newpath)
for img in imgs:
print('++> ',img)
src_path = os.path.join(img_path,img)
des_path = os.path.join(newpath,img)
img = Image.open(src_path)
width, height = img.size
for pos in product(range(width), range(height)):
if sum(img.getpixel(pos)[:3]) > 600:
img.putpixel(pos, (255,255,255))
img.save(des_path)