批量检验PDF之在双层PDF中是否包含特定内容
文章目录
问题提出:
批量处理双层pdf,验证所给内容是否在文件中存在。
两种处理方法:
A方法
1.先提取PDF第一页内容出来用一个txt或者excel文件包含,第一列是文件名,第二列是文件第一页的文字内容
2.使用特定内容再该excel中进行手动搜索查询
B方法
使用特定内容在相应的文件中查找(第一页查找或者遍历所有页码查找)返回查找结果。
个人觉得b方法处理起来更方便便捷,a方法对于批量大文件pdf提取内容可能过大还得自己手动人工搜索可能费时费力,b方法对于给定内容出现多次可以有效检验,就是确保该数据在pdf出现过,如果是单一出现的情况可能,未查询到的还得人工检验,因为双层pdf可能识别不准确,可能出现了但是识别不准确导致未查询到,这个也只能做一个辅助工具检验。也许对于很多东西人工检验更为准确。
提出需求:
1.批量处理该代码文件所在目录下的PDF文件
2.使用excel或者txt中的数据在双层pdf中查找,两列数据,A列是对应文件名,B列是需要在PDF中查找的内容。
3.在对应pdf双层文件中查找并且进行结果反馈:生成一个txt或者excel,第一列是文件名,第二列是结果,结果分两种,成功返回找到内容的页码代表在pdf中找到,F代表未在PDF中的所有页码找到。
废话不多说,重新阐述需求:
就是根据一个数据excel和很多pdf进行操作之后生成另外一个结果excel
具体操作过程:
1.访问给定的数据excel文件,从中获取文件名和寻找内容。
2.然后根据获取内容在给定的文件中查询改内容。
3.未找到该文件就返回文件不存在,匹配成功返回内容所在页码,未匹配成功就返回匹配失败。
4.最后将返回结果存入结果excel文件。
实现:(实现B方法)
import os
import pandas as pd
import fitz # PyMuPDF
# 读取Excel文件
df = pd.read_excel('data.xlsx')
# 存储结果的DataFrame
results_df = pd.DataFrame(columns=['File Name', 'Result'])
# 遍历DataFrame中的每一行
for index, row in df.iterrows():
file_name = row.iloc[0] # 假设'A'列是第一列
search_content = row.iloc[1]
pdf_path = f"./{file_name}.pdf" # 假设PDF文件名与A列相同
# 检查PDF文件是否存在
if not os.path.exists(pdf_path):
new_row = pd.DataFrame({'File Name': [file_name], 'Result': ['File not found']})
results_df = pd.concat([results_df, new_row], ignore_index=True)
continue
# 打开PDF文件
doc = fitz.open(pdf_path)
found = False
all_pages = len(doc)
found_pages = []
# 遍历PDF的每一页
for page_num in range(all_pages):
page = doc.load_page(page_num)
text = page.get_text()
if search_content in text:
found = True
found_pages.append(page_num + 1)
# 根据是否找到内容,记录结果
if found:
result = ', '.join(map(str, found_pages))
else:
result = 'F'
new_row = pd.DataFrame({'File Name': [file_name], 'Result': [result]})
results_df = pd.concat([results_df, new_row], ignore_index=True)
# 关闭PDF文件
doc.close()
# 将结果保存到新的Excel文件
results_df.to_excel('results.xlsx', index=False)
print("查询完成")
使用库说明连接
原文:各种处理pdf的库,原文包含各种库的特点说明,在处理时可以选择自己需要的库实现预期功能。
代码优化
# 读取Excel文件
try:
df = pd.read_excel('data.xlsx')
except Exception as e:
print(f"读取Excel文件时发生错误:{e}")
exit()
# 检查列名是否存在
file_name_column = '文件名' # 假设Excel中文件名列名为“文件名”
search_content_column = '搜索内容' # 假设Excel中搜索内容列为“搜索内容”
if file_name_column not in df.columns or search_content_column not in df.columns:
print(f"错误:Excel文件中未找到所需的列名。请确保包含'{file_name_column}'和'{search_content_column}'列。")
exit()
# 存储结果的DataFrame
results_df = pd.DataFrame(columns=['File Name', 'Result'])
# 遍历DataFrame中的每一行
for index, row in df.iterrows():
file_name = row[file_name_column] # 根据列名获取文件名
search_content = row[search_content_column] # 根据列名获取搜索内容
pdf_path = f"./{file_name}.pdf" # 假设PDF文件名与文件名列相同
1.对于无data.xlsx的情况进行了报错提示。
2.以及列名处理部分不是单纯的是第一列和第二列,可以更具自己输入列名进行查找操作,以及未找到所给列名时进行报错提示。
安装环境以及对应的库版本要求
安装时候注意版本兼容问题
- Python:
- 版本:Python 3.6 或更高版本。Python 3.6+ 是因为
pd.read_excel
函数在 pandas 0.24.0+ 版本中引入了对 xlsx 文件的更好支持。
- 版本:Python 3.6 或更高版本。Python 3.6+ 是因为
- Pandas:
- 版本:Pandas 0.24.0 或更高版本。这是用于数据处理和CSV文件读写的库。
- PyMuPDF(fitz):
- 版本:PyMuPDF 1.18.0 或更高版本。这是一个用于处理PDF文件的库,可以读取、写入和修改PDF文件。
- openpyxl:
- 版本:openpyxl 3.0 或更高版本。这是一个用于读写Excel 2010 xlsx/xlsm/xltx/xltm 文件的Python库,pandas在读取Excel文件时会用到它。
部分报错情况的解决办法:
本地安装报错的相关文章:Python包的本地安装(.whl)报错:.whl is not a supported wheel on this platform
本地安装需要的库(无网络)
离线安装需要的库(基于python3.11)
Package Version
--------------- -----------
et_xmlfile 2.0.0
numpy 2.1.3
openpyxl 3.1.5
pandas 2.2.3
PyMuPDF 1.24.14
python-dateutil 2.9.0.post0
pytz 2024.2
six 1.16.0
tzdata 2024.2
xlrd 2.0.1
线上安装报错:
Traceback (most recent call last):
File "D:\桌面文件所在处\PDF特定内容查找\a.py", line 3, in <module>
import fitz # PyMuPDF
^^^^^^^^^^^
ModuleNotFoundError: No module named 'fitz'
如果出现该错误信息表明你的Python环境中没有安装名为fitz
的模块,你可以通过以下步骤来安装PyMuPDF来解决:
-
打开你的命令行界面(例如CMD、PowerShell或终端)。
-
输入以下命令来安装PyMuPDF:
pip install PyMuPDF
或者,如果你使用的是Python 3.x并且系统中同时安装了Python 2.x,你可能需要使用以下命令:
pip3 install PyMuPDF
-
等待安装完成。
安装完成即可使用
输入以下命令来安装PyMuPDF:pip install PyMuPDF
或者,如果你使用的是Python 3.x并且系统中同时安装了Python 2.x,你可能需要使用以下命令:
pip3 install PyMuPDF
-
等待安装完成。
安装完成即可使用