目录
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 shutildef 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.0zoom_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 += 1return 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 = -1return 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 osdef sort_key(s):if s:try:c = re.findall('^\d+', s)[0]except:c = -1return 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 = 1for img in imgs:print('+++++++++> {}/{},{} '.format(processCount,len(imgs),img))processCount += 1dakai = 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 shutildef 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.sizefor pos in product(range(width), range(height)):if sum(img.getpixel(pos)[:3]) > 600: img.putpixel(pos, (255,255,255))img.save(des_path)