代码
import os
import pdfplumber
import re
import pandas as pd
# 正则表达式模式
patterns = {
"招标人": r"招\s*标\s*人:\s*(.*?)\n",
"代理机构": r"代\s*理\s*机\s*构:\s*(.*?)\n",
"地址": r"地\s*址:\s*(.*?)\n",
"联系人": r"联\s*系\s*人:\s*(.*?)\n",
"电话": r"电\s*话:\s*(.*?)\n",
"邮箱": r"(?:邮\s*箱|邮\s*件|E-mail):\s*(.*?)\n",
}
def extract_info_from_pdf(pdf_path):
with pdfplumber.open(pdf_path) as pdf:
text = ""
for page in pdf.pages:
text += page.extract_text() + "\n" # 提取每一页的文本
if not text:
return {"标题": "未找到", **{key: "未找到" for key in patterns}}
# 提取标题(假设标题为第一页的前几行文本)
first_page_text = pdf.pages[0].extract_text()
lines = first_page_text.split('\n')
title_lines = []
for line in lines:
if line.strip():
title_lines.append(line.strip())
if len(title_lines) >= 4: # 可以根据需要调整行数
break
title = ' '.join(title_lines).strip()
# 提取其他信息
extracted_info = {"标题": title}
for key, pattern in patterns.items():
match = re.search(pattern, text, re.MULTILINE)
extracted_info[key] = match.group(1).strip() if match else "未找到"
return extracted_info
# 批量处理PDF文件
pdf_directory = 'pdf' # PDF文件所在目录
output = []
for pdf_file in os.listdir(pdf_directory):
if pdf_file.endswith('.pdf'):
pdf_path = os.path.join(pdf_directory, pdf_file)
info = extract_info_from_pdf(pdf_path)
info["文件名"] = pdf_file
output.append(info)
# 将数据保存到Excel表格中
df = pd.DataFrame(output)
excel_path = os.path.join(pdf_directory, 'extracted_info.xlsx')
df.to_excel(excel_path, index=False)
print(f"信息已保存到 {excel_path}")
分析
标题
标题从第一页中匹配
招标人、代理机构、地址、联系人、电话、邮箱
全文匹配,因为有的可能不是在最后一页
邮箱有可能是邮箱、邮件、E-mail,所以代码中的正则表达式用
"邮箱": r"(?:邮\s*箱|邮\s*件|E-mail):\s*(.*?)\n",
邮箱或邮件或E-mail
再者邮箱二字之间可能有空格用 \s* 来进行匹配
不止邮箱,其他的字段中也可能有空格,都用 \s* 来进行匹配
结果展示
保存到execl表格中,看着方便
保存的时候带着pdf的文件名,方便查找
比如16.pdf这个文件的邮箱未找到
我们就可以打开16.pdf文件进行查找
经过观察,文件中未提到邮箱,邮件,E-mail等信息,即没有邮箱