MambaInvoice / app.py
Jiang Xiaolan
update
23a6a28
raw
history blame
4.32 kB
import os
import sys
import subprocess
import streamlit as st
import io
import pypdfium2
from PIL import Image
import logging
# 设置日志记录器
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
def clone_repo():
# 从环境变量中获取 GitHub Token
github_token = os.getenv('GH_TOKEN')
if github_token is None:
logger.error("GitHub token is not set. Please set the GH_TOKEN secret in your Space settings.")
return False
# 使用 GitHub Token 进行身份验证并克隆仓库
clone_command = f'git clone https://{github_token}@github.com/mamba-ai/invoice_agent.git'
if os.path.exists('invoice_agent'):
logger.warning("Repository already exists.")
repo_dir = 'invoice_agent'
# 将仓库路径添加到 Python 模块搜索路径中
logger.warning(f"Adding {os.path.abspath(repo_dir)} to sys.path")
sys.path.append(os.path.abspath(repo_dir))
return True
else:
logger.info("Cloning repository...")
result = subprocess.run(clone_command, shell=True, capture_output=True, text=True)
if result.returncode == 0:
logger.warning("Repository cloned successfully.")
repo_dir = 'invoice_agent'
# 将仓库路径添加到 Python 模块搜索路径中
sys.path.append(os.path.abspath(repo_dir))
logger.warning(f"Adding {os.path.abspath(repo_dir)} to sys.path")
return True
else:
logger.error(f"Failed to clone repository: {result.stderr}")
return False
if clone_repo():
# 克隆成功后导入模块
import invoice_agent.agent as ia
# from invoice_agent.agent import load_models, get_ocr_predictions, get_json_result
def open_pdf(pdf_file):
stream = io.BytesIO(pdf_file.getvalue())
return pypdfium2.PdfDocument(stream)
@st.cache_data()
def get_page_image(pdf_file, page_num, dpi=96):
doc = open_pdf(pdf_file)
renderer = doc.render(
pypdfium2.PdfBitmap.to_pil,
page_indices=[page_num - 1],
scale=dpi / 72,
)
png = list(renderer)[0]
png_image = png.convert("RGB")
return png_image
@st.cache_data()
def page_count(pdf_file):
doc = open_pdf(pdf_file)
return len(doc)
st.set_page_config(layout="wide")
models = ia.load_models()
st.title("""
受領した請求書を自動で電子化 (Demo)
""")
col1, _, col2 = st.columns([.45, 0.1, .45])
in_file = st.sidebar.file_uploader(
"PDFファイルまたは画像:",
type=["pdf", "png", "jpg", "jpeg", "gif", "webp"],
)
if in_file is None:
st.stop()
filetype = in_file.type
whole_image = False
if "pdf" in filetype:
page_count = page_count(in_file)
page_number = st.sidebar.number_input(f"ページ番号 {page_count}:", min_value=1, value=1, max_value=page_count)
pil_image = get_page_image(in_file, page_number)
else:
pil_image = Image.open(in_file).convert("RGB")
text_rec = st.sidebar.button("認識開始")
if pil_image is None:
st.stop()
with col1:
st.write("## アップロードされたファイル")
st.image(pil_image, caption="アップロードされたファイル", use_column_width=True)
if text_rec:
with col2:
st.write("## 結果")
# Placeholder for status indicator
status_placeholder = st.empty()
with st.spinner('現在ファイルを解析中です'):
# Simulate model running time
# time.sleep(5) # Replace this with actual model running code
predictions = ia.get_ocr_predictions(pil_image, models)
# Simulate OCR result as a JSON object
json_predictions = ia.get_json_result(predictions)
# After model finishes
status_placeholder.success('ファイルの解析が完了しました!')
# Display the result
st.write("解析後の内容:")
st.json(json_predictions)
# st.write(predictions)