通过统计词频来快速预览PDF报告。本文提供了文字PDF和图片PDF提取文字的两类方式。 对于是文字类的PDF可以快速的提取其中文字,但是有许多PDF是图片格式,并不能直接提取文字。本文采取PDF转图片,并通过OCR识别文字生成文本,进而统计文本的词频的方式进行快速预览。

一、PDF转图片 本文使用PyMuPDF模块进行转化。 1、 PyMuPD网上有许多资料,但是多数比较老,这个模块的API已有变动,本文做了更新。本模块安装需要pip install PyMuPDF,但是导入是fitz。该库不支持python3.10以上版本。 2、本文加了文件路径处理的功能find_pdf_files(directory)函数和以下部分。

filename = os.path.basename(pdf)

file_name, file_extension = os.path.splitext(filename)

image_path = f"{imagePath}\{file_name}{pg}.jpg"

代码

import datetime

import os

import fitz

#输出以.pdf结尾的文件的完整文件路径

def find_pdf_files(directory):

pdf_files = []

for root, dirs, files in os.walk(directory):

for file in files:

if file.endswith('.pdf'):

pdf_file_path = os.path.join(root, file)

pdf_files.append(pdf_file_path)

return pdf_files

def pyMuPDF_fitz(pdf, imagePath):

startTime_pdf2img = datetime.datetime.now() # 开始时间

print("imagePath=" + imagePath)

pdfDoc = fitz.open(pdf)

for pg in range(pdfDoc.page_count):

page = pdfDoc[pg]

rotate = int(0)

# 每个尺寸的缩放系数为1.3,这将为我们生成分辨率提高2.6的图像。

# 此处若是不做设置,默认图片大小为:792X612, dpi=96

zoom_x = 1.33333333 # (1.33333333-->1056x816) (2-->1584x1224)

zoom_y = 1.33333333

mat = fitz.Matrix(zoom_x, zoom_y).prerotate(rotate)

pix = page.get_pixmap(matrix=mat, alpha=False)

if not os.path.exists(imagePath): # 判断存放图片的文件夹是否存在

os.makedirs(imagePath) # 若图片文件夹不存在就创建

# 提取不带扩展名的文件名

filename = os.path.basename(pdf)

file_name, file_extension = os.path.splitext(filename)

image_path = f"{imagePath}\{file_name}{pg}.jpg"

pix._writeIMG(image_path,format_="jpg",jpg_quality=100) # 将图片写入指定的文件夹内

endTime_pdf2img = datetime.datetime.now() # 结束时间

print('pdf2img时间=', (endTime_pdf2img - startTime_pdf2img).seconds)

if __name__ == "__main__":

path=r"xx"

flist=find_pdf_files(path)

# 1、PDF地址

for pdf in flist:

# 2、需要储存图片 的目录

imagePath = r"xx"

pyMuPDF_fitz(pdf, imagePath)

二、OCR图片转文字 本文使用的是百度开源的paddleocr库 先pip3.10 install paddlepaddle再pip install paddleocr,注意这两个库暂时不支持python3.10以上的版本,主要是paddleocr依赖的PyMuPDF不支持python3.10以上版本。

代码为

from paddleocr import PaddleOCR

import os

import re

#输出结果转字符串

def text_noposition(data, left, right, bottom, top):

text_res = ""

# data[0]包含位置和文本信息

for i in data[0]:

# i[0][0][0]是横向,i[0][0][1]是位置的纵向

x, y = i[0][0][0], i[0][0][1]

if left < x < right and bottom < y < top:

# i[1][0]是文字

text_res = text_res + i[1][0]

return text_res

def convert_png_to_txt(dir_path,output_path):

# 初始化PaddleOCR

ocr = PaddleOCR(use_angle_cls=True, lang="ch")

output_text = ""

# 遍历指定目录下的所有.png文件

for filename in os.listdir(dir_path):

if filename.endswith('.jpg'):

file_path = os.path.join(dir_path, filename)

# 使用PaddleOCR提取图片中的文本

result = ocr.ocr(file_path, cls=True)

print(result)

# 使用text_noposition函数处理提取的文本

processed_text = text_noposition(result, left=0, right=10000, bottom=500, top=2000)

# 将处理后的文本追加到输出文本中

output_text += processed_text + "\n"

# 将输出文本写入.txt文件并关闭该文件

with open(output_path, "a") as file: # 可以根据需要更改文件名和路径

file.write(output_text)

file.close()

# 指定要处理的图片的目录

dir_path = r'D:\data\2024\PDF\xx'

# 文件输出路径

output_path = r'D:\data\2024\PDF\xx'

convert_png_to_txt(dir_path,output_path)

三、读取高频词

读取结果、使用结巴分词,并统计词频。

视文件编码不同,如果报错gbk编码问题,打开文件部分需要改为: f = open(file_path, encoding=‘utf-8’)

from collections import Counter

import jieba

import pandas as pd

def cut_with_filter(sentence, stopwords):

# 使用结巴分词的精确模式进行分词

seg_list = jieba.cut(sentence, cut_all=False)

# 去除停用词

filtered_seg_list = [word for word in seg_list if word not in stopwords]

return filtered_seg_list

if __name__ == '__main__':

file_path = r"D:\data\2023\pdf\pdf\结果.txt"

# 要分词的文本

f = open(file_path)

text = f.read()

#text = read_doc_file(file_path)

# 停用词列表,你可以根据需要自行添加或修改

stopwords = ["的", "了", "在", "是", "我", "有", "和", "就", "不", "人", "都", "一", "一个", "上", "也", "很", "到"]

word_list=cut_with_filter(text,stopwords)

chinese_list = [word for word in word_list if isinstance(word, str) and word.isalpha()]

# 统计每个词的词频

counter = Counter(chinese_list)

word_freq = dict(counter)

keys = pd.Series(list(word_freq.keys()))

values = pd.Series(list(word_freq.values()))

# 将分词结果和词频保存到DataFrame

df = pd.DataFrame({'词': keys, '词频': values})

print(df)

# 将DataFrame保存到Excel文件

df.to_excel('分词结果1.xlsx', index=False)

四、提取文字型PDF的文字

使用PyMuPDF库可以快速提取文字型PDF的文字。本文做了封装。

1、转化单个文件,使用pdf2txt函数,输入路径是PDF文件的路径 2、转化一个文件夹下,使用 pdf2txt_multi函数,输入路径是PDF所在的文件夹

import fitz

import os

#转化单个文件

def pdf2txt(input_file,output_file):

with fitz.open(input_file) as doc:

text = ""

for page in doc.pages():

text += page.get_text() # 注意这里使用了 get_text() 方法

with open(output_file, "w", encoding="utf-8") as f:

f.write(text)

return text

def pdf2txt_multi(input_folder, output_file):

# 遍历输入文件夹中的所有文件

for file_name in os.listdir(input_folder):

if file_name.endswith(".pdf"):

print(file_name)

# 构建输入文件路径

input_file = os.path.join(input_folder, file_name)

# 打开PDF文件,并写入txt文件

with fitz.open(input_file) as doc:

text = ""

for page in doc.pages():

text += page.get_text() # 注意这里使用了 get_text() 方法

with open(output_file, "w", encoding="utf-8") as f:

f.write(text)

return text

if __name__ == "__main__":

# 输入和输出文件路径,当要转化一个文件夹时是文件夹路径。

input_file =r"xx"

output_file = "output.txt"

pdf2txt_multi(input_file,output_file)

精彩文章

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。