You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python解析CIS基准PDF转Excel:跨页关键词文本提取问题求助

跨页关键词文本提取问题

核心问题是提取跨页的两个关键词之间的文本。部分CIS规则会跨页延续,但现有Python脚本无法处理该场景,尝试过通过TXT文件中转去除PDF格式,问题仍未解决。

以下是相关代码:

import os
import PyPDF2
import re
import tkinter as tk
from tkinter import filedialog
import openpyxl

# 定义要搜索的关键词列表
keywords = ["description", "rationale", "impact", "audit", "remediation", "cis control"]

def extract_text_from_pdf(pdf_path, txt_path, excel_path):
    try:
        with open(pdf_path, 'rb') as pdf_file:
            pdf_reader = PyPDF2.PdfReader(pdf_file)
            num_pages = len(pdf_reader.pages)

            workbook = openpyxl.Workbook()
            worksheet = workbook.active

            # 构造不带": "且将空格替换为下划线的新关键词
            new_keywords = [keyword.replace(": ", "").replace(" ", "_") for keyword in keywords]

            # 添加列标题作为第一行
            worksheet.append(["Num Page and rule"] + new_keywords)

            for page_num in range(num_pages):
                page = pdf_reader.pages[page_num]
                text = page.extract_text()

                # 提取前两行
                first_two_lines = text.split('\n', 2)[:2]
                first_two_lines_text = ' '.join(line.strip() for line in first_two_lines)

                # 搜索关键词之间的文本,支持上下文解析
                keyword_data = {}
                for i in range(len(keywords) - 1):
                    start_keyword = keywords[i]
                    end_keyword = keywords[i + 1]
                    pattern = re.compile(f'{start_keyword}(.*?){end_keyword}', re.DOTALL | re.IGNORECASE)
                    matches = pattern.findall(text)
                    keyword_data[start_keyword] = matches

                # 单独处理'cis control'关键词
                cis_control_matches = re.findall(r'cis\s*control\s*\((.*?)\)', text, re.DOTALL | re.IGNORECASE)
                keyword_data['cis control'] = cis_control_matches

                # 将提取的文本添加到工作表
                max_rows = max(len(keyword_data[keyword]) for keyword in keywords)
                for row in range(max_rows):
                    values = [first_two_lines_text]
                    for keyword in keywords:
                        keyword_column = keyword.replace(" ", "_")
                        if row < len(keyword_data[keyword]):
                            values.append(keyword_data[keyword][row].strip())
                        else:
                            values.append("")
                    worksheet.append(values)

            workbook.save(excel_path)
            print(f"已从'{pdf_path}'提取文本并保存到'{excel_path}'。")
    except Exception as e:
        print(f"错误: {e}")

def browse_pdf():
    file_path = filedialog.askopenfilename(filetypes=[("PDF文件", "*.pdf")])
    if file_path:
        txt_file_path = os.path.splitext(file_path)[0] + ".txt"
        excel_file_path = os.path.splitext(file_path)[0] + ".xlsx"
        extract_text_from_pdf(file_path, txt_file_path, excel_file_path)

# 创建文件浏览窗口
file_path = filedialog.askopenfilename(filetypes=[("PDF文件", "*.pdf")])
if file_path:
    txt_file_path = os.path.splitext(file_path)[0] + ".txt"
    excel_file_path = os.path.splitext(file_path)[0] + ".xlsx"
    extract_text_from_pdf(file_path, txt_file_path, excel_file_path)

内容的提问来源于stack exchange,提问作者Victor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 20:23:09