求一款OCR处理PDF软件

我有很多pdf文件,里面的内容位置是一样的,但是文件名是随机的。
我每次都得逐个打开pdf,再把文件名改成这个pdf里面的某部分内容。
后面我发现了Microsoft Power Automate这个软件,我设置了一下可以用,但是他必须联网,我想有没有一个能离线使用的工具能达成这个效果:
OCR识别pdf里面的一部分内容,然后把pdf重命名

离线ocr属于pdf软件的基本功能了,市面上大部分流行的pdf软件都有这个功能。
其中比较有名的 Acrobat 和 abbyy

OCR简单,但是根据PDF内容重命名文件很有难度,尤其是OCR后的内容精准提取更有难度。

几十篇就手动操作吧,可以使用预览窗口快捷查看pdf,然后重命名。

一、rename_pdfs.py脚本

import fitz  # PyMuPDF
import os
import pytesseract
from PIL import Image
import io
import re

# 确保Tesseract路径正确
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'

def extract_text_from_pdf(pdf_path, page_num=0):
    doc = fitz.open(pdf_path)
    page = doc.load_page(page_num)
    
    # 提取PDF的文本和字体信息
    text_instances = page.get_text("dict")["blocks"]
    
    # 如果没有提取到文本,尝试OCR
    if not text_instances:
        pix = page.get_pixmap()
        img = Image.open(io.BytesIO(pix.tobytes("png")))
        text = pytesseract.image_to_string(img)
        doc.close()
        return text.strip()
    
    doc.close()
    return text_instances

def identify_title(text_instances):
    title = ""
    max_font_size = 0
    
    for block in text_instances:
        if block["type"] == 0:  # 文本块
            for line in block["lines"]:
                for span in line["spans"]:
                    if span["size"] > max_font_size:
                        max_font_size = span["size"]
                        title = span["text"]
    
    return title.strip()

def clean_filename(filename):
    # 移除不允许在文件名中使用的字符
    filename = re.sub(r'[\\/*?:"<>|]', "", filename)
    # 将空格替换为下划线
    filename = filename.replace(" ", "_")
    # 限制文件名长度
    return filename[:50]

def rename_pdf(pdf_folder):
    for filename in os.listdir(pdf_folder):
        if filename.endswith(".pdf"):
            pdf_path = os.path.join(pdf_folder, filename)
            print(f"正在处理文件: {filename}")

            # 提取PDF中的文本和字体信息
            extracted_info = extract_text_from_pdf(pdf_path)

            # 如果是OCR结果(字符串),直接使用前20个字符
            if isinstance(extracted_info, str):
                new_filename = clean_filename(extracted_info[:20])
            else:
                # 识别标题
                title = identify_title(extracted_info)
                new_filename = clean_filename(title)

            # 如果新文件名为空,使用原文件名
            if not new_filename:
                new_filename = os.path.splitext(filename)[0]

            new_path = os.path.join(pdf_folder, new_filename + ".pdf")

            # 重命名文件
            os.rename(pdf_path, new_path)
            print(f"文件重命名为: {new_filename}.pdf")


# 设置PDF文件夹路径
pdf_folder = r"d:\我的文档\桌面\rename_pdfs"

# 执行重命名操作
rename_pdf(pdf_folder)

# 运行脚本命令:python rename_pdfs.py

二、需要安装的依赖:

  1. 安装PyMuPDF pytesseract Pillow。
pip install PyMuPDF pytesseract Pillow
  1. 安装 Tesseract OCR。

三、说明

请将py中设置PDF文件夹路径部分修改为pdf存放文件夹。
pdf_folder = r"......"

你试试看,这样行不? :rofl: