使用 python 的 fitz 库将 pdf 文件转换为 HTML 或图像文件
最编程
2024-03-21 21:28:22
...
import os
import pytesseract
import cv2 as cv
import fitz
from PIL import Image
from tqdm import tqdm
class PdfHandler:
def run(self):
'''执行入口'''
# 将指定pdf文件转换成html文件
self.pdf_to_html('test.pdf','test.html')
# 解析html文件
self.parse_html('test.html')
# 将pdf文件转换成图片
self.pdf_to_img('test.pdf','img_dir',5,5,0)
# 解析图片
for img_name in os.listdir('img_dir'):
abs_img_name = f'img_dir/{img_name}'
self.parse_img(abs_img_name)
def pdf_to_html(self,pdf_path,html_path):
'''
pdf文件转换成html文件
:param pdf_path: pdf文件路径
:param html_path: html文件路径
:return:
'''
# 打开pdf文件,并新建html文件
with fitz.open(pdf_path) as pdf,open(html_path,'w',encoding='utf-8',newline='') as html_file:
html_content = '''
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>pdf转换后的html文件</title>
</head>
<body>
'''
# 遍历每一页pdf,并显示进度条
for page in tqdm(pdf):
html_content += page.get_text('html') # 提取每页内容为html
html_content += '</body></html>'
html_file.write(html_content) # 写入html文件
def pdf_to_img(self,pdf_path,img_path,zoom_x,zoom_y,rotation_angle):
'''
pdf文件每页内容都转换成图片
:param pdf_path:
:param img_path:
:param zoom_x:
:param zoom_y:
:param rotation_angle:
:return:
'''
# 如果没有存储文件的目录,则创建
if not os.path.exists(img_path):
os.mkdir(img_path)
# 打开PDF文件
with fitz.open(pdf_path) as pdf:
# 逐页读取PDF
for page_index in tqdm(range(0, pdf.pageCount)):
page = pdf[page_index]
# 设置缩放和旋转系数,zoom_x, zoom_y取相同值,表示等比例缩放
trans = fitz.Matrix(zoom_x, zoom_y).prerotate(rotation_angle)
pm = page.getPixmap(matrix=trans, alpha=False)
# 开始写图像
page_num = page_index + 1 # 页码从1开始
pm.writePNG(f'{img_path}/{page_num}.png') # 第1张图片名:1.png,以此类推
def parse_img(self,img_name):
'''
利用opencv+pytesseract解析图片中的文字
:param img_name: 具体图片名
:return:
'''
img = cv.imread(img_name)
text = pytesseract.image_to_string(Image.fromarray(img), lang='eng') # lang可以根据文本内容来定,简体中文:chi_sim
print(text)
def parse_html(self,html_name):
'''
解析html文件,比如xpath等
:param html_name: html文件名
:return:
'''
pass