olmOCR大模型:支持結構化精準提取復雜PDF文件內容

基于streamlit與olmOCR大模型實現的pdf提取工具

import os
import json
import subprocess
import pandas as pd
from pathlib import Path
import shutil
import time
import re
import streamlit as st# 創建工作目錄
WORKSPACE_DIR = "olmocr_workspace"
os.makedirs(WORKSPACE_DIR, exist_ok=True)def modify_html_for_better_display(html_content):"""修改HTML以便在Streamlit中更好地顯示"""if not html_content:return html_content# 增加容器寬度html_content = html_content.replace('<div class="container">', '<div class="container" style="max-width: 100%; width: 100%;">')# 增加文本大小html_content = html_content.replace('<style>', '<style>\nbody {font-size: 16px;}\n.text-content {font-size: 16px; line-height: 1.5;}\n')# 調整圖像和文本部分的大小比例html_content = html_content.replace('<div class="row">', '<div class="row" style="display: flex; flex-wrap: wrap;">')html_content = html_content.replace('<div class="col-md-6">', '<div class="col-md-6" style="flex: 0 0 50%; max-width: 50%; padding: 15px;">')# 增加頁面之間的間距html_content = html_content.replace('<div class="page">', '<div class="page" style="margin-bottom: 30px; border-bottom: 1px solid #ccc; padding-bottom: 20px;">')# 增加圖像大小html_content = re.sub(r'<img([^>]*)style="([^"]*)"', r'<img\1style="max-width: 100%; height: auto; \2"', html_content)# 添加縮放控制zoom_controls = """<div style="position: fixed; bottom: 20px; right: 20px; background: #fff; padding: 10px; border-radius: 5px; box-shadow: 0 0 10px rgba(0,0,0,0.2); z-index: 1000;"><button onclick="document.body.style.zoom = parseFloat(document.body.style.zoom || 1) + 0.1;" style="margin-right: 5px;">放大</button><button onclick="document.body.style.zoom = parseFloat(document.body.style.zoom || 1) - 0.1;">縮小</button></div>"""html_content = html_content.replace('</body>', f'{zoom_controls}</body>')return html_contentdef process_pdf(pdf_file):"""處理PDF文件并返回結果"""if pdf_file is None:return "請上傳PDF文件", "", None, None# 創建一個唯一的工作目錄timestamp = int(time.time())work_dir = os.path.join(WORKSPACE_DIR, f"job_{timestamp}")os.makedirs(work_dir, exist_ok=True)# 復制PDF文件pdf_path = os.path.join(work_dir, "input.pdf")with open(pdf_path, "wb") as f:f.write(pdf_file.read())# 構建命令并執行cmd = ["python", "-m", "olmocr.pipeline", work_dir, "--pdfs", pdf_path]try:# 執行命令,等待完成process = subprocess.run(cmd,stdout=subprocess.PIPE,stderr=subprocess.PIPE,text=True,check=True)# 命令輸出log_text = process.stdout# 檢查結果目錄results_dir = os.path.join(work_dir, "results")if not os.path.exists(results_dir):return f"處理完成,但未生成結果目錄\n\n日志輸出:\n{log_text}", "", None, None# 查找輸出文件output_files = list(Path(results_dir).glob("output_*.jsonl"))if not output_files:return f"處理完成,但未找到輸出文件\n\n日志輸出:\n{log_text}", "", None, None# 讀取JSONL文件output_file = output_files[0]with open(output_file, "r") as f:content = f.read().strip()if not content:return f"輸出文件為空\n\n日志輸出:\n{log_text}", "", None, None# 解析JSONresult = json.loads(content)extracted_text = result.get("text", "未找到文本內容")# 生成HTML預覽try:preview_cmd = ["python", "-m", "olmocr.viewer.dolmaviewer", str(output_file)]subprocess.run(preview_cmd, check=True)except Exception as e:log_text += f"\n生成HTML預覽失敗: {str(e)}"# 查找HTML文件html_files = list(Path("dolma_previews").glob("*.html"))html_content = ""if html_files:try:with open(html_files[0], "r", encoding="utf-8") as hf:html_content = hf.read()# 修改HTML以更好地顯示html_content = modify_html_for_better_display(html_content)except Exception as e:log_text += f"\n讀取HTML預覽失敗: {str(e)}"# 創建元數據表格metadata = result.get("metadata", {})meta_rows = []for key, value in metadata.items():meta_rows.append([key, value])df = pd.DataFrame(meta_rows, columns=["屬性", "值"])return log_text, extracted_text, html_content, dfexcept subprocess.CalledProcessError as e:return f"命令執行失敗: {e.stderr}", "", None, Noneexcept Exception as e:return f"處理過程中發生錯誤: {str(e)}", "", None, None# 設置Streamlit應用
st.title("一個黑客創業者:基于streamlit和olmOCR PDF文本提取工具")# 文件上傳
uploaded_file = st.file_uploader("上傳PDF文件", type="pdf")if uploaded_file is not None:st.button("處理PDF", on_click=lambda: process_and_display(uploaded_file))def process_and_display(pdf_file):log_text, extracted_text, html_content, df = process_pdf(pdf_file)st.header("處理日志")st.text(log_text)st.header("提取的文本")st.text_area("", value=extracted_text, height=200)if html_content:st.header("HTML預覽")st.components.v1.html(html_content, height=800, scrolling=True)if df is not None and not df.empty:st.header("文檔元數據")st.dataframe(df)

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

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

相關文章

五模型對比!Transformer-GRU、Transformer、CNN-GRU、GRU、CNN五模型多變量時間序列預測

目錄 預測效果基本介紹程序設計參考資料 預測效果 基本介紹 光伏功率預測&#xff01;五模型對比&#xff01;Transformer-GRU、Transformer、CNN-GRU、GRU、CNN五模型多變量時間序列預測(Matlab2023b 多輸入單輸出) 1.程序已經調試好&#xff0c;替換數據集后&#xff0c;僅運…

druid開啟防火墻之后的bug

bug以及解決方案 不允許執行多個語句不允許有注釋部分數據有誤識別&#xff0c;拋出異常&#xff0c;導致原本正常執行的語句被中斷 解決方案 application.yaml中對于druid配置如下&#xff1a; wall:enabled: true # 開啟防火墻config:multi-statement-allow: true # 允許多個…

SQLMesh 系列教程:Airbnb數據分析項目實戰

在本文中&#xff0c;我們將探討如何利用dbt項目的代碼庫來實現一個簡單的SQLMesh項目。本文的基礎是基于Udemy講師為dbt課程創建的示例項目&#xff0c;可以在這個GitHub repo中獲得。這個dbt項目是相對完整的示例&#xff0c;我們將使用它作為模板來演示SQLMesh&#xff08;下…

單片機寫的小液晶屏驅動+漢字滾屏

單片機寫的小液晶屏驅動漢字滾屏 stm32f401freertos內置HZK16 單片機漢字滾屏

【Golang那些事】go1.22和1.23 更新重點及測評

好久沒有寫文章了&#xff0c;攢了一年的Golang版本特性的技術點以及踩過的坑&#xff0c;那就在新年第一篇的文章中做一個總結吧&#xff1a; 一、關于迭代器 (一)迭代器去掉了共享共享內存 一個經典的面試題 說到Golang經典的面試題&#xff0c;大家可能都刷到過很多&…

python力扣438.找到字符串中所有字母異位詞

給定兩個字符串 s 和 p&#xff0c;找到 s 中所有 p 的 異位詞的子串&#xff0c;返回這些子串的起始索引。不考慮答案輸出的順序。 示例 1: 輸入: s “cbaebabacd”, p “abc” 輸出: [0,6] 解釋: 起始索引等于 0 的子串是 “cba”, 它是"abc" 的異位詞。 起始索引…

【大模型實戰篇】使用GPTQ量化QwQ-32B微調后的推理模型

1. 量化背景 之所以做量化&#xff0c;就是希望在現有的硬件條件下&#xff0c;提升性能。量化能將模型權重從高精度&#xff08;如FP32&#xff09;轉換為低精度&#xff08;如INT8/FP16&#xff09;&#xff0c;內存占用可減少50%~75%。低精度運算&#xff08;如INT8&#xf…

【MySQL】架構

MySQL架構 和其它數據庫相比&#xff0c;MySQL有點與眾不同&#xff0c;它的架構可以在多種不同場景中應用并發揮良好作用。主要體現在存儲引擎的架構上&#xff0c;插件式的存儲引擎架構將查詢處理和其它的系統任務以及數據的存儲提取相分離。這種架構可以根據業務的需求和實…

JavaScript 金額運算精度丟失問題及解決方案

JavaScript 金額運算精度丟失問題及解決方案 1. 前言2. 為什么 JavaScript 計算金額會精度丟失&#xff1f;2.1 JavaScript 使用 IEEE 754 雙精度浮點數2.2 浮點運算錯誤示例**錯誤示例 1&#xff1a;0.1 0.2 ≠ 0.3****錯誤示例 2&#xff1a;浮點乘法精度問題** 3. 解決方案…

Docker安裝,并pullMySQL和redis

卸載原Docker 您的 Linux 發行版可能提供非官方的 Docker 軟件包&#xff0c;這可能與 Docker 提供的官方軟件包沖突。在安裝 Docker Engine 正式版之前&#xff0c;您必須先卸載這些軟件包。 sudo dnf remove docker \ docker-client \ docker-client-latest \ docker-common…

國內首臺太空采礦機器人亮相,宇宙資源開發邁入新階段

隨著地球資源的日益枯竭&#xff0c;人類將目光投向了浩瀚的宇宙。太空采礦作為一項前沿科技&#xff0c;正逐步從科幻走向現實。近日&#xff0c;中國礦業大學成功研制出國內首臺太空采礦機器人&#xff0c;標志著我國在太空資源開發領域邁出了重要一步。 太空采礦并非新鮮概念…

簡介PyCDE:Python CIRCT Design Entry

簡介PyCDE&#xff1a;Python CIRCT Design Entry 引言 在硬件設計和驗證領域&#xff0c;隨著設計復雜性的增加&#xff0c;傳統的方法往往難以滿足現代設計的需求。PyCDE&#xff08;Python CIRCT Design Entry&#xff09;作為CIRCT項目的一部分&#xff0c;旨在為硬件設計…

市場熱點復盤20240319

以下是對當前市場熱點板塊的分析總結&#xff0c;按邏輯分類如下&#xff1a; 一、機器人產業鏈核心標的 1. 減速器與核心部件 襄陽軸承&#xff1a;直接受益人形機器人減速器軸承需求&#xff0c;技術國內領先。金帝股份&#xff1a;聚焦機器人手指關節諧波減速機保持架&am…

目標檢測——清洗數據

清洗VOC格式數據集代碼示例 import os import xml.etree.ElementTree as ETdef process_annotations(image_folder, annotation_folder):# 遍歷標簽文件夾中的所有XML文件for xml_file in os.listdir(annotation_folder):if not xml_file.endswith(.xml):continuexml_path os…

Kubeasz工具快速部署K8Sv1.27版本集群(二進制方式)

文章目錄 一、基本信息二、服務器初始化操作三、使用Kubeasz部署K8S集群四、驗證集群 一、基本信息 1、部署需要滿足前提條件&#xff1a; 注意1&#xff1a;確保各節點時區設置一致、時間同步&#xff1b;注意2&#xff1a;確保在干凈的系統上開始安裝&#xff1b;注意3&…

RG-S3760應用協議配置

RG-S3760應用協議配置 1. dhcp 服務配置 提問&#xff1a;如何在設備上開啟dhcp 服務&#xff0c;讓不同VLAN 下的電腦獲得相應的IP 地址&#xff1f; 回答&#xff1a; 步驟一&#xff1a;配置VLAN 網關IP 地址&#xff0c;及將相關端口劃入相應的VLAN 中 S3760#con t S…

Java 文件和IO流基礎(生動形象版)

系列文章目錄 Java文件和IO流基礎部分 文件VSIO流 文章目錄 系列文章目錄前言一、文件的定義和理解&#xff1a; 1.專業定義&#xff1a; 2.文件系統和路徑&#xff1a; 二、IO流的定義和分類 1.定義&#xff1a;2.流的分類&#xff1a;修飾器模式的核心作用&#xff1a;基礎結…

Linux驅動學習筆記(四)

高級字符設備進階 1.一個完整的IO過程包含以下幾個步驟&#xff1a;1應用程序向操作系統發起IO調用請求(系統調用)&#xff1b;2操作系統準備數據&#xff0c;把IO設備的數據加載到內核緩沖區&#xff1b;3操作系統拷貝數據&#xff0c;把內核緩沖區的數據從內核空間拷貝到應用…

el-table的行向上移動向下移動,刪除選定行

<template><el-table :data"tableData" border style"width: 100%"><!-- 其他列 --><el-table-column label"ID"><template slot-scope"scope">{{ scope.$index }}</template></el-table-colu…

人工智能之數學基礎:矩陣的降維

本文重點 在現實世界中,我們經常會遇到高維數據。例如,圖像數據通常具有很高的維度,每個像素點都可以看作是一個維度。高維數據不僅會帶來計算和存儲上的困難,還可能會導致 “維數災難”,即隨著維度的增加,數據的稀疏性和噪聲也會增加,從而影響數據分析的效果。因此,我…