PDF解析示例代碼學習

以下是結合多種技術實現的PDF解析詳細示例(Python實現),涵蓋文本、表格和掃描件處理場景:


一、環境準備與依賴安裝

# 核心依賴庫 pip install pdfplumber tabula-py pytesseract opencv-python mysql-connector-python


二、完整解析流程示例

import pdfplumber import tabula import pytesseract import cv2 import re import mysql.connector from mysql.connector import Error from PIL import Image import hashlib # ========== 1. 通用PDF解析 ========== ?:ml-citation{ref="6,7" data="citationList"} def parse_pdf(pdf_path): result = {"text": [], "tables": [], "images": []} # 文本提取(含坐標信息) with pdfplumber.open(pdf_path) as pdf: for page in pdf.pages: # 基礎文本提取 text = page.extract_text(x_tolerance=1, y_tolerance=1) if text: result["text"].append({ "page": page.page_number, "content": text_clean(text), "bbox": page.bbox }) # 表格識別與提取 ?:ml-citation{ref="3" data="citationList"} tables = page.find_tables() if tables: result["tables"].extend([ {"table_data": table.extract(), "position": table.bbox} for table in tables ]) # 掃描件處理模塊 ?:ml-citation{ref="6" data="citationList"} if not result["text"]: result.update(process_scanned_pdf(pdf_path)) return result # ========== 2. 掃描件OCR處理 ========== ?:ml-citation{ref="6" data="citationList"} def process_scanned_pdf(pdf_path, dpi=300): ocr_results = [] images = convert_pdf_to_images(pdf_path, dpi) # 使用pdf2image庫轉換 for img in images: processed_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) text = pytesseract.image_to_string(processed_img, lang='chi_sim+eng') ocr_results.append(text_clean(text)) return {"ocr_text": ocr_results} # ========== 3. 數據標準化處理 ========== ?:ml-citation{ref="7" data="citationList"} def text_clean(raw_text): # 多級清洗流程 text = re.sub(r'\s{2,}', ' ', raw_text) # 壓縮空白字符 text = re.sub(r'[\x00-\x1F\x7F-\x9F]', '', text) # 刪除控制字符 return text.strip() # ========== 4. 結構化字段提取 ========== ?:ml-citation{ref="4,7" data="citationList"} def extract_structured_data(texts): patterns = { "date": r'\d{4}年\d{1,2}月\d{1,2}日', "amount": r'金額:(\d+\.\d{2})元', "parties": r'甲方:(.*?)\n乙方:(.*?)\n' } structured_data = {} for pattern_name, regex in patterns.items(): matches = [] for text in texts: matches.extend(re.findall(regex, text)) structured_data[pattern_name] = matches return structured_data # ========== 5. 數據庫存儲 ========== ?:ml-citation{ref="8" data="citationList"} def save_to_mysql(data, pdf_hash): try: conn = mysql.connector.connect( host='localhost', database='pdf_archive', user='root', password='' ) cursor = conn.cursor() insert_query = """ INSERT INTO documents (file_hash, raw_text, structured_data) VALUES (%s, %s, %s) """ cursor.execute(insert_query, ( pdf_hash, "\n".join(data['text']), json.dumps(data['structured']) )) conn.commit() except Error as e: print(f"數據庫錯誤: {e}") finally: if conn.is_connected(): cursor.close() conn.close() # ========== 6. 主執行流程 ========== if __name__ == "__main__": pdf_file = "sample_contract.pdf" # 生成文件指紋 ?:ml-citation{ref="6" data="citationList"} with open(pdf_file, "rb") as f: file_hash = hashlib.sha256(f.read()).hexdigest() # 執行解析 parsed_data = parse_pdf(pdf_file) structured = extract_structured_data(parsed_data['text']) parsed_data['structured'] = structured # 數據持久化 save_to_mysql(parsed_data, file_hash) 

三、關鍵處理策略說明

  1. ?混合解析機制?

    • 優先嘗試直接文本提取(可編輯PDF)?6
    • 自動降級到OCR處理(掃描件)?6
    • 保留原始坐標信息用于后期驗證?4
  2. ?表格識別增強?
    使用PDF頁面的物理布局檢測表格邊界(page.find_tables()),配合tabula進行精確提取?3

  3. ?多語言OCR支持?
    通過lang='chi_sim+eng'參數實現中英文混合識別,需提前安裝Tesseract中文訓練包?6

  4. ?數據驗證機制?

    • 通過file_hash字段實現重復文件過濾?6
    • 同時保存原始文本和結構化數據用于數據追溯?8

四、數據庫表結構設計

CREATE TABLE `documents` ( `id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, `file_hash` CHAR(64) NOT NULL UNIQUE, `raw_text` LONGTEXT, `structured_data` JSON, `ocr_flag` TINYINT(1) DEFAULT 0, `create_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;


五、異常處理建議

  1. ?編碼兼容性?
    添加數據庫連接參數charset='utf8mb4'支持生僻字存儲?8

  2. ?大文件分塊處理?
    使用生成器逐頁處理超過50頁的PDF文檔:

    def batch_process(pdf_path, batch_size=10): with pdfplumber.open(pdf_path) as pdf: total_pages = len(pdf.pages) for i in range(0, total_pages, batch_size): yield pdf.pages[i:i+batch_size]

  3. ?容錯機制?
    在解析循環中添加異常捕獲:

    try: text = page.extract_text() except PDFSyntaxError as e: logging.warning(f"Page {page_num} parse failed: {str(e)}") continue


該示例實現了從基礎文本提取到復雜表格識別的完整流程,并包含掃描件處理方案,實際應用中需根據具體文檔結構調整正則表達式模式和表格識別參數?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/78986.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/78986.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/78986.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Docker容器網絡與NAT

一、背景 之前分享關于NAT網絡地址轉換的相關文章,docker中的網絡正好使用到了NAT,順帶著把這個分享一下,分析docker容器的網絡數據包流出、數據流入原理分析。 知識回顧: docker運行一個容器之后,會給這個容器一個獨立的netns網絡…

Spring Boot 熱部署詳解,包含詳細的配置項說明

Spring Boot 熱部署詳解 1. 熱部署簡介 熱部署(Hot Deployment)允許在應用運行時修改代碼或配置文件,無需重啟應用即可使更改生效。Spring Boot 通過 spring-boot-devtools 模塊實現這一功能,其核心依賴于 LiveReload 技術和自動…

詳細解讀 box-sizing: border-box;

代碼解讀 * {box-sizing: border-box; } 解釋: * - 這是CSS的通用選擇器,表示匹配文檔中的所有元素 box-sizing: border-box; - 設置元素的盒模型計算方式為border-box 盒模型說明: 默認情況下,CSS使用content-box盒模型&…

《一文講透》第7期:KWDB 巧用標簽與索引優化查詢性能

引言 在工業物聯網快速發展的今天,各類智能傳感器設備已廣泛應用于智能制造、能源電力、智慧城市等關鍵領域。這些設備以極高的采樣頻率持續產生監測數據,使得單條產線每秒產生數十萬條傳感器數據已成為行業常態,這對數據存儲系統的寫入吞吐…

哈希擴展——一致性哈希

目錄 一、什么是一致性哈希 二、一致性哈希原理 2.1 hash 環 三、服務器擴容場景 3.1 服務器增加 3.2 服務器減少 3.3 使用虛擬節點 四、 一致性哈希的使用場景 一、什么是一致性哈希 一致性哈希是一種哈希算法,用于將數據分布到不同的節點或存儲區域&…

arcgis幾何與游標(1)

本節我們對幾何進行展開學習 ArcPy 的幾何對象 在 ArcPy 中,幾何對象是表示地理空間數據的核心。它包括點(Point)、多點(Multipoint)、線(Polyline)和面(Polygon)等類型…

分布式熱點網絡

核心設計理念: 在自然災害(地震、洪水、臺風)、極端環境(無人區)及網絡管制(欠費停機)等場景下,傳統中心化網絡易因核心節點失效導致全局癱瘓。本方案提出構建去中心化設備網絡&…

【5G學習】基本概念之多頻資源以及子載波和信道

在5G通信中,子載波、信道以及時域、頻域、碼域、空域是構建無線傳輸系統的核心概念。它們共同定義了信號的傳輸方式、資源分配和多維復用技術。以下是詳細解釋及其相互關系: 一、核心概念定義 1. 子載波(Subcarrier) 定義&#…

Coze 和 n8n 的詳細介紹及多維度對比分析,涵蓋功能、架構、適用場景、成本等關鍵指標

以下是 Coze 和 n8n 的詳細介紹及多維度對比分析,涵蓋功能、架構、適用場景、成本等關鍵指標: 一、Coze 詳細介紹 1. 基礎信息 類型:低代碼自動化平臺(SaaS)。開源性:閉源(企業版需付費&…

分發餅干問題——用貪心算法解決

目錄 一:問題描述 二:解決思路 貪心策略(C語言)算法復習總結3——貪心算法-CSDN博客 三:代碼實現 四:復雜度分析 一:問題描述 分發餅干問題是一個經典的可以使用貪心算法解決的問題&#xf…

【Python爬蟲】簡單案例介紹4

本文繼續接著我的上一篇博客【Python爬蟲】簡單案例介紹3-CSDN博客 目錄 3.4 完整代碼 3.4 完整代碼 此小節給出上述案例的完整代碼, # encodingutf-8 import re, json, requests, xlwt, csv import pandas as pd from lxml import etree from bs4 import Beauti…

使用ADB工具分析Android應用崩潰原因:以閃動校園為例

使用adb工具分析模擬器或手機里app出錯原因以閃動校園為例 使用ADB工具分析Android應用崩潰原因:以閃動校園為例 前言 應用崩潰是移動開發中常見的問題,尤其在復雜的Android生態系統中,找出崩潰原因可能十分棘手。本文將以流行的校園應用&q…

【藍橋云課】男女搭配 python

題目 題目 題解 import mathT int(input()) for _ in range(T):N, M, K map(int, input().split())people_num N M# 目前為止可以組成的隊數group_num min(N // 2, M)if people_num - group_num * 3 < K:group_num-math.ceil((K-(people_num - group_num * 3))/3)pr…

edge 更新到135后,Clash 打開后,正常網頁也會自動跳轉

發現了一個有意思的問題&#xff1a;edge 更新135后&#xff0c;以前正常使用的clash出現了打開deepseek也會自動跳轉&#xff1a; Search Resultshttps://zurefy.com/zu1.php#gsc.tab0&gsc.qdeepseek &#xff0c;也就是不需要梯子的網站打不開了&#xff0c;需要的一直正…

MCP協議實戰指南:在VS Code中實現PostgreSQL到Excel的自動化遷移

作者&#xff1a;后端小肥腸 &#x1f34a; 有疑問可私信或評論區聯系我。 &#x1f951; 創作不易未經允許嚴禁轉載。 姊妹篇&#xff1a; 從PDF到精準答案&#xff1a;Coze助力RAGFlow框架提升數據召回率_提升ragflow-CSDN博客 CozeTreeMind實測&#xff1a;秒出ISO標準流程圖…

大模型微調(PEFT)

大模型微調&#xff08;PEFT&#xff09; PEFT&#xff08;Parameter-Efficient Fine-Tuning&#xff09;一、PEFT 核心方法1. LoRA&#xff08;Low-Rank Adaptation&#xff09;2. Adapter3. Prefix Tuning4. Prompt Tuning5. QLoRA&#xff08;Quantized LoRA&#xff09; 二…

flutter 打包mac程序 dmg教程

? 前提條件 ? 你已經在 macOS 上安裝了 Android Studio Flutter SDK。 ? Flutter 支持 macOS 構建。 運行下面命令確認是否支持&#xff1a; Plain Text bash 復制編輯 flutter doctor ---## &#x1f9f1; 第一步&#xff1a;啟用 macOS 支持如果是新項目&#xff0c;…

鴻蒙開發-動畫

1. 動畫-動畫特效 // 定義接口 (每個列表項的數據結構) interface ImageCount {url: stringcount: number }// 需求1: 遮罩層顯隱 透明度opacity 0-1 層級zIndex -1~99 // 需求2: 圖片縮放 縮放scale 0-1Entry Component struct Index {// 基于接口, 準備數據State images…

js:循環查詢數組對象中的某一項的值是否為空

循環檢查 selinfo 數組中的每一個對象&#xff0c;判斷其中的 po_qty 和 price 是否為空&#xff08;null、undefined 或空字符串 ""&#xff09;&#xff0c;可以使用以下幾種方法&#xff1a; 方法1&#xff1a;使用 forEach 循環檢查每一項 const selinfo this.…

x-cmd install | jellex - 用 Python 語法在終端里玩轉 JSON 數據!

目錄 核心功能與特點安裝優勢亮點適用場景 還在為命令行下處理 JSON 數據煩惱嗎&#xff1f;jellex 來了&#xff01;它是一款基于終端的交互式 JSON 和 JSON Lines 數據處理工具&#xff0c;讓你用熟悉的 Python 語法&#xff0c;輕松過濾、轉換和探索 JSON 數據。 核心功能與…