WPS有这个功能,但WPS的显示效果比较差,且有水印。如果要效果好点,必须要会员。
所以就自己写了个脚本,分享给有需要的人。
话不多说,直接上代码。有疑问的同学可留言区交流。
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import os
import fitz # 依赖 pip install PyMuPDF
import cv2
import numpy as np
def pdf2png(pdffile):
try:
imagePath = os.path.join(os.getcwd(), "image")
pdfDoc = fitz.open(pdffile)
tar_h = 0 # 目标图片的总高度
for pg in range(pdfDoc.page_count):
# 获取所有的图片,并以此计算出大图片的总高度
page = pdfDoc[pg]
# 此处若是不做设置,默认图片大小为:792X612, dpi=96
pix = page.get_pixmap(dpi=300, alpha=False)
tar_h += pix.height
src = pdfDoc[0].get_pixmap(dpi=300, alpha=False) # 生成第一个图片
tar_pix = fitz.Pixmap(src.colorspace, (0, 0, src.width, tar_h), src.alpha) # 生成目标图片,高等于所有图片的总高,宽等于一张图片的宽度
for pg in range(pdfDoc.page_count):
page = pdfDoc[pg]
src = page.get_pixmap(dpi=300, alpha=False)
src.set_origin(0, src.height * pg)
tar_pix.copy(src, src.irect) # copy input to new loc
pdffile = os.path.basename(pdffile)
if not os.path.exists(imagePath): # 判断存放图片的文件夹是否存在
os.makedirs(imagePath) # 若图片文件夹不存在就创建
print(">>> 准备保存的文件名为:",os.path.join(imagePath , pdffile.replace("pdf", "png")))
tar_pix.save(os.path.join(imagePath , pdffile.replace("pdf", "png"))) # 将图片写入指定的文件夹内
except IOError:
print('pdf转png失败')
else:
print("pdf转png成功")
return os.path.join(imagePath , pdffile.replace("pdf", "png"))
def delwhiteline(imgfile):
delta = 75 # 最大留白 74pix 行
# imgray = cv2.imread(imgfile, cv2.IMREAD_GRAYSCALE) # 读取灰度图像
# 由于cv2文件名称中不允许有中文,所以用numpy先读取数据再转化处理
im = cv2.imdecode(np.fromfile(imgfile, dtype=np.uint8),cv2.IMREAD_COLOR)
imgray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
(row, col) = imgray.shape
whiteLineIndex = [] # 记录空白行的像素行号
whiteLineFlag = False # 发现空白行标记
#准备删除空行
# 将每行、每列的灰度值进行相加
row_gray = np.sum(imgray,axis=1)
for r in range(1,row,delta):
if np.sum(row_gray[r:r+delta]) == delta*col*255:
# 表明找到了空行
whiteLineFlag = True
else:
continue
i = 0
while(whiteLineFlag):
if r+delta + i < row and row_gray[r+delta + i] == col*255:
whiteLineIndex.append(r+delta + i)
i = i + 1
else:
whiteLineFlag = False
whiteLineIndex = list(set(whiteLineIndex))
# 删除空白行
new_img=np.delete(im,whiteLineIndex,axis=0)
# 准备删除空列
delta = 95 # 图片两边只有95px为空
col_gray = np.sum(imgray,axis=0)
#先取到开始的空列
whiteLineFlag = True
whiteLineIndex.clear() # 清空之前的索引
i = 0
while (whiteLineFlag):
if delta + i < col and col_gray[delta + i] == row * 255:
whiteLineIndex.append(delta + i)
i = i + 1
else:
whiteLineFlag = False
# 先取到末尾的空列
whiteLineFlag = True
i = 0
while (whiteLineFlag):
if col - delta - i > 0 and col_gray[col - delta - i] == row * 255:
whiteLineIndex.append(col - delta - i)
i = i + 1
else:
whiteLineFlag = False
# 删除空白列
new_img=np.delete(new_img,whiteLineIndex,axis=1)
return new_img
if __name__ == '__main__':
# 获取到当前文件夹下的所有pdf文件
all_file = []
currentDir = os.getcwd()
for f in os.listdir(currentDir): # listdir返回文件中所有目录
f_name = os.path.join(currentDir, f)
if os.path.isfile(f_name):
if f.endswith(".pdf"):
all_file.append(f_name)
for docfile in all_file:
print(">>> 准备处理文件:\n ",docfile)
# 由pdf生成png文件
fileobj = pdf2png(docfile)
# 删除png文件中的空白
new_img = delwhiteline(fileobj)
if (os.path.exists(fileobj)):
os.remove(fileobj)
#cv2.imwrite("result.jpg", new_img)
cv2.imencode('.png', new_img)[1].tofile(fileobj) # 解决cv2不能保存为中文名的问题