快速预览图片类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 paddlepaddlepip 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)

三、读取高频词

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

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,开发语言,python)