improve-pdf
介绍:
使用python脚本对pdf进行优化,提高pdf清晰度,使文字更加清晰,观感更佳。仅适用黑白扫描版pdf,且文字较清晰,若模糊会更加模糊。
原理:
pdf转成png图片
再使用opencv对图片局部阈值二值化处理
并去除孤立噪点,优化图片观感
最后转回pdf并合并,最终达到优化提高pdf清晰度的目的
(可选)使用potrace处理png转成svg矢量图,使文字线条平滑,观感大幅度提高,接近ocr pdf 。
脚本使用方法:
1.安装依赖
pip install opencv-python
pip install pymupdf
2.将pdf文件放入文件夹中,将doc_path改为pdf文件路径(不要使用中文路径,会报错)
doc_path = r"your pdf path" # 相对路径删去r
3.运行脚本
推荐使用单任务多进程,默认满核运行处理速度更快,可自行修改,注意进程数不要超过cpu核心数
4.核心代码
def change_image(self, index):
try:
img_files = sorted(os.listdir(self.img_path), key=self.numerical_sort)
for i in index:
i = img_files[i]
if i.endswith(".png"):
img = cv2.imread(os.path.join(self.img_path, i), cv2.IMREAD_COLOR)
GrayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
binary2 = cv2.adaptiveThreshold(
GrayImage,
255,
cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
cv2.THRESH_BINARY,
55,
15,
)
cv2.imwrite(os.path.join(self.change_path, i), binary2)
print(f"正在二值化第{i}张图片")
except Exception as e:
print(f"二值化图片时出现错误: {e}")
def erasure_image(self, threshold, index):
try:
img_files = sorted(os.listdir(self.change_path), key=self.numerical_sort)
for i in index:
i = img_files[i]
if i.endswith(".png"):
img = cv2.imread(
os.path.join(self.change_path, i), cv2.IMREAD_COLOR
)
GrayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
contours, hierarch = cv2.findContours(
GrayImage, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE
)
for j in range(len(contours)):
area = cv2.contourArea(contours[j])
if area < threshold:
cv2.drawContours(
img, [contours[j]], -1, (255, 255, 255), thickness=-1
)
continue
cv2.imwrite(
os.path.join(self.erasure_path, i),
img,
[cv2.IMWRITE_PNG_COMPRESSION, 9],
)
print(f"正在去除第{i}张图片黑点")
except Exception as e:
print(f"去除黑点时出现错误: {e}")
效果展示