GLM-OCR Web UI定制开发:添加OCR结果导出Word/PDF/Markdown功能

news2026/3/20 19:42:36
GLM-OCR Web UI定制开发添加OCR结果导出Word/PDF/Markdown功能1. 引言你有没有遇到过这样的场景用GLM-OCR识别了一份重要的合同文档得到了准确的文本结果然后...然后你需要把这些文本复制到Word里重新排版或者手动整理成报告格式。这个过程不仅耗时还容易出错。GLM-OCR确实是个强大的工具它能准确识别文本、表格甚至公式但它的Web界面有个明显的短板——识别结果只能显示在页面上想要保存下来进一步使用就得手动复制粘贴。对于需要批量处理文档或者生成正式报告的用户来说这个限制相当影响效率。今天我就来分享一个实用的定制开发方案为GLM-OCR的Web UI添加OCR结果导出功能支持一键导出为Word文档、PDF文件和Markdown格式。这个功能实现后你可以把识别出的合同直接保存为格式规范的Word文档将表格识别结果导出为PDF方便打印和分享把技术文档转换为Markdown格式直接用于博客或文档系统接下来我会手把手带你完成这个功能的开发从需求分析到代码实现再到实际测试整个过程都会详细讲解。即使你不是专业的Web开发人员只要跟着步骤走也能顺利完成这个定制化功能。2. 项目环境准备2.1 了解现有项目结构在开始开发之前我们先看看GLM-OCR项目的现有结构。根据项目说明主要文件如下/root/GLM-OCR/ ├── serve_gradio.py # Gradio 服务脚本 ├── start_vllm.sh # 启动脚本 ├── USAGE.md # 详细文档 └── logs/ # 运行日志我们需要修改的是serve_gradio.py文件这是Web界面的核心代码。Gradio是一个Python库可以快速构建机器学习应用的Web界面GLM-OCR就是用这个库搭建的用户界面。2.2 安装必要的依赖包导出功能需要一些额外的Python库支持。我们先激活项目使用的conda环境然后安装必要的包# 激活conda环境 source /opt/miniconda3/bin/activate py310 # 安装导出功能所需的库 /opt/miniconda3/envs/py310/bin/pip install python-docx reportlab markdown这三个库的作用分别是python-docx用于生成Word文档reportlab用于生成PDF文件markdown用于处理Markdown格式转换如果你还需要其他格式的支持比如Excel可以额外安装openpyxl/opt/miniconda3/envs/py310/bin/pip install openpyxl2.3 备份原始文件在修改代码之前做个备份是个好习惯cd /root/GLM-OCR cp serve_gradio.py serve_gradio.py.backup这样如果修改过程中出现问题我们可以随时恢复原始版本。3. 导出功能设计与实现3.1 功能需求分析我们要实现的导出功能需要满足以下几个核心需求支持多种格式至少包括Word、PDF、Markdown三种常用格式保持内容结构文本、表格、公式等不同内容类型要正确转换操作简单用户点击按钮就能导出不需要复杂的配置文件命名合理自动生成有意义的文件名比如基于上传图片的名称错误处理完善导出过程中出现问题时给用户明确的提示基于这些需求我设计了下面的实现方案。3.2 创建导出工具模块为了保持代码的清晰和可维护性我们创建一个单独的导出工具模块。在/root/GLM-OCR目录下新建一个文件export_utils.py GLM-OCR 导出工具模块 支持将OCR结果导出为Word、PDF、Markdown格式 import os import tempfile from datetime import datetime from docx import Document from docx.shared import Inches, Pt from docx.enum.text import WD_ALIGN_PARAGRAPH from reportlab.lib.pagesizes import letter from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle from reportlab.lib.units import inch from reportlab.lib import colors import markdown from io import BytesIO class OCRExporter: OCR结果导出器 def __init__(self, ocr_result, image_nameNone): 初始化导出器 参数: ocr_result: OCR识别结果文本 image_name: 原始图片名称用于生成导出文件名 self.ocr_result ocr_result self.image_name image_name or ocr_result # 清理文件名移除扩展名和特殊字符 if self.image_name: base_name os.path.splitext(os.path.basename(self.image_name))[0] self.base_name .join(c for c in base_name if c.isalnum() or c in ( , -, _)) else: self.base_name ocr_result def export_to_word(self, output_pathNone): 导出为Word文档 参数: output_path: 输出文件路径如果为None则生成临时文件 返回: 文件路径 if output_path is None: # 生成临时文件 timestamp datetime.now().strftime(%Y%m%d_%H%M%S) output_path f/tmp/{self.base_name}_{timestamp}.docx # 创建Word文档 doc Document() # 添加标题 title doc.add_heading(fOCR识别结果 - {self.base_name}, 0) title.alignment WD_ALIGN_PARAGRAPH.CENTER # 添加生成时间 time_str datetime.now().strftime(%Y年%m月%d日 %H:%M:%S) time_para doc.add_paragraph(f生成时间: {time_str}) time_para.alignment WD_ALIGN_PARAGRAPH.CENTER doc.add_paragraph() # 空行 # 处理OCR结果 lines self.ocr_result.strip().split(\n) for line in lines: if line.strip(): # 跳过空行 # 简单判断是否为表格行包含多个制表符或连续空格 if \t in line or in line: # 尝试按制表符或空格分割 if \t in line: cells line.split(\t) else: cells line.split( ) # 创建表格 table doc.add_table(rows1, colslen(cells)) table.style Light Grid Accent 1 # 填充表格数据 for i, cell in enumerate(cells): table.cell(0, i).text cell.strip() else: # 普通文本段落 para doc.add_paragraph(line.strip()) # 设置段落格式 para_format para.paragraph_format para_format.line_spacing 1.5 # 保存文档 doc.save(output_path) return output_path def export_to_pdf(self, output_pathNone): 导出为PDF文档 参数: output_path: 输出文件路径如果为None则生成临时文件 返回: 文件路径 if output_path is None: # 生成临时文件 timestamp datetime.now().strftime(%Y%m%d_%H%M%S) output_path f/tmp/{self.base_name}_{timestamp}.pdf # 创建PDF文档 doc SimpleDocTemplate(output_path, pagesizeletter) styles getSampleStyleSheet() # 自定义样式 title_style ParagraphStyle( CustomTitle, parentstyles[Heading1], fontSize16, spaceAfter12, alignment1 # 居中 ) content_style ParagraphStyle( CustomContent, parentstyles[Normal], fontSize10, spaceAfter6, leading14 # 行距 ) # 构建内容 story [] # 添加标题 title_text fOCR识别结果 - {self.base_name} story.append(Paragraph(title_text, title_style)) story.append(Spacer(1, 12)) # 添加生成时间 time_str datetime.now().strftime(%Y年%m月%d日 %H:%M:%S) story.append(Paragraph(f生成时间: {time_str}, styles[Normal])) story.append(Spacer(1, 24)) # 处理OCR结果 lines self.ocr_result.strip().split(\n) for line in lines: if line.strip(): # 简单判断是否为表格行 if \t in line or in line: # 创建表格数据 if \t in line: cells line.split(\t) else: cells line.split( ) # 创建表格 table_data [[cell.strip() for cell in cells]] table Table(table_data) # 设置表格样式 table.setStyle(TableStyle([ (BACKGROUND, (0, 0), (-1, 0), colors.grey), (TEXTCOLOR, (0, 0), (-1, 0), colors.whitesmoke), (ALIGN, (0, 0), (-1, -1), CENTER), (FONTNAME, (0, 0), (-1, 0), Helvetica-Bold), (FONTSIZE, (0, 0), (-1, 0), 10), (BOTTOMPADDING, (0, 0), (-1, 0), 12), (BACKGROUND, (0, 1), (-1, -1), colors.beige), (GRID, (0, 0), (-1, -1), 1, colors.black) ])) story.append(table) story.append(Spacer(1, 12)) else: # 普通文本 story.append(Paragraph(line.strip(), content_style)) # 生成PDF doc.build(story) return output_path def export_to_markdown(self, output_pathNone): 导出为Markdown文档 参数: output_path: 输出文件路径如果为None则生成临时文件 返回: 文件路径 if output_path is None: # 生成临时文件 timestamp datetime.now().strftime(%Y%m%d_%H%M%S) output_path f/tmp/{self.base_name}_{timestamp}.md # 构建Markdown内容 md_content f# OCR识别结果 - {self.base_name} **生成时间**: {datetime.now().strftime(%Y年%m%d日 %H:%M:%S)} --- ## 识别内容 # 处理OCR结果 lines self.ocr_result.strip().split(\n) for line in lines: if line.strip(): # 判断是否为表格行 if \t in line: # Markdown表格格式 cells line.split(\t) md_content | | .join(cell.strip() for cell in cells) |\n elif in line and len(line.split( )) 1: # 多个空格分隔的表格 cells [c.strip() for c in line.split( ) if c.strip()] if len(cells) 1: md_content | | .join(cells) |\n else: # 普通文本 md_content line.strip() \n\n # 保存Markdown文件 with open(output_path, w, encodingutf-8) as f: f.write(md_content) return output_path def export(self, format_type, output_pathNone): 通用导出方法 参数: format_type: 导出格式支持 word, pdf, markdown output_path: 输出文件路径 返回: 文件路径 format_type format_type.lower() if format_type word: return self.export_to_word(output_path) elif format_type pdf: return self.export_to_pdf(output_path) elif format_type markdown: return self.export_to_markdown(output_path) else: raise ValueError(f不支持的格式: {format_type}) def test_export(): 测试导出功能 # 测试数据 test_result 这是一个测试文档 表格示例: 姓名 年龄 职业 张三 25 工程师 李四 30 设计师 王五 28 产品经理 这是普通文本段落包含一些重要的信息。 公式示例: E mc² 文档结束。 # 测试各种格式导出 exporter OCRExporter(test_result, test_document.jpg) print(测试Word导出...) word_file exporter.export_to_word() print(fWord文件已生成: {word_file}) print(\n测试PDF导出...) pdf_file exporter.export_to_pdf() print(fPDF文件已生成: {pdf_file}) print(\n测试Markdown导出...) md_file exporter.export_to_markdown() print(fMarkdown文件已生成: {md_file}) return word_file, pdf_file, md_file if __name__ __main__: test_export()这个导出工具模块提供了完整的导出功能支持三种格式并且有基本的表格识别和格式处理能力。3.3 修改Gradio界面现在我们需要修改serve_gradio.py文件在现有的Web界面中添加导出功能。打开文件找到合适的位置添加导出相关的代码。首先在文件开头导入我们刚创建的导出工具# 在现有import语句后面添加 import os import tempfile from export_utils import OCRExporter然后找到创建Gradio界面的部分。通常这个文件会有一个create_ui()函数或者类似的界面创建代码。我们需要在识别结果的输出区域添加导出按钮。假设现有的界面代码大致是这样的结构def create_ui(): with gr.Blocks() as demo: gr.Markdown(# GLM-OCR 文档识别系统) with gr.Row(): with gr.Column(): image_input gr.Image(label上传图片, typefilepath) prompt_input gr.Textbox(label任务类型, valueText Recognition:, interactiveTrue) submit_btn gr.Button(开始识别, variantprimary) with gr.Column(): output_text gr.Textbox(label识别结果, lines20, interactiveFalse) # 在这里添加导出功能 with gr.Row(): with gr.Column(): gr.Markdown(### 导出选项) format_select gr.Dropdown( choices[Word文档 (.docx), PDF文件 (.pdf), Markdown (.md)], label选择导出格式, valueWord文档 (.docx) ) export_btn gr.Button(导出结果, variantsecondary) download_file gr.File(label下载文件, interactiveFalse) # 导出按钮点击事件 def export_result(ocr_text, format_choice, image_info): if not ocr_text or ocr_text.strip() : return None, 请先进行OCR识别 try: # 从格式选择中提取格式类型 format_map { Word文档 (.docx): word, PDF文件 (.pdf): pdf, Markdown (.md): markdown } format_type format_map.get(format_choice, word) # 获取图片名称如果有 image_name None if image_info and isinstance(image_info, dict) and name in image_info: image_name image_info[name] elif isinstance(image_info, str): image_name os.path.basename(image_info) # 创建导出器并导出 exporter OCRExporter(ocr_text, image_name) export_file exporter.export(format_type) # 返回文件路径 return export_file, 导出成功 except Exception as e: return None, f导出失败: {str(e)} # 连接按钮事件 export_btn.click( fnexport_result, inputs[output_text, format_select, image_input], outputs[download_file, gr.Textbox(label导出状态, visibleTrue)] ) # 原有的识别功能保持不变 # ... 原有的识别逻辑代码 ... return demo这里的关键点在界面中添加了导出格式选择下拉框添加了导出按钮添加了文件下载组件实现了导出函数处理格式转换和文件生成将导出按钮与导出函数绑定3.4 完整修改示例由于我不知道serve_gradio.py的具体内容这里提供一个完整的修改示例。你可以根据实际情况调整 GLM-OCR Gradio服务脚本 - 增强版添加导出功能 import gradio as gr import torch from transformers import AutoModelForCausalLM, AutoTokenizer from PIL import Image import argparse import os import sys from datetime import datetime # 添加导出工具导入 from export_utils import OCRExporter def load_model(model_path): 加载模型 print(f正在加载模型: {model_path}) # 原有的模型加载代码 tokenizer AutoTokenizer.from_pretrained( model_path, trust_remote_codeTrue ) model AutoModelForCausalLM.from_pretrained( model_path, torch_dtypetorch.float16, device_mapauto, trust_remote_codeTrue ) print(模型加载完成) return model, tokenizer def process_image(image_path, prompt, model, tokenizer): 处理图片并返回OCR结果 try: # 打开图片 image Image.open(image_path).convert(RGB) # 构建输入 query fimage\n{prompt} inputs tokenizer.build_conversation_input_ids( tokenizer, queryquery, images[image], template_versionchatml ) inputs { input_ids: inputs[input_ids].unsqueeze(0).cuda(), token_type_ids: inputs[token_type_ids].unsqueeze(0).cuda(), attention_mask: inputs[attention_mask].unsqueeze(0).cuda(), images: [[inputs[images][0].cuda().to(torch.float16)]] } # 生成输出 with torch.no_grad(): outputs model.generate( **inputs, max_new_tokens1024, do_sampleFalse ) # 解码输出 response tokenizer.decode(outputs[0], skip_special_tokensTrue) # 提取OCR结果移除prompt部分 if prompt in response: result response.split(prompt)[-1].strip() else: result response.strip() return result except Exception as e: return f处理失败: {str(e)} def export_ocr_result(ocr_text, format_choice, image_info): 导出OCR结果到指定格式 if not ocr_text or ocr_text.strip() : return None, 请先进行OCR识别 try: # 映射格式选择到实际格式 format_map { Word文档 (.docx): word, PDF文件 (.pdf): pdf, Markdown (.md): markdown } format_type format_map.get(format_choice, word) # 获取图片名称 image_name None if image_info: if isinstance(image_info, str): image_name os.path.basename(image_info) elif hasattr(image_info, name): image_name image_info.name # 创建导出器 exporter OCRExporter(ocr_text, image_name) # 导出文件 export_file exporter.export(format_type) return export_file, 导出成功文件已准备好下载。 except Exception as e: return None, f导出失败: {str(e)} def create_ui(model, tokenizer): 创建Gradio用户界面 def process_wrapper(image, prompt): 包装处理函数处理Gradio的输入 if image is None: return 请上传图片 # 保存临时图片文件 temp_dir /tmp/glm_ocr os.makedirs(temp_dir, exist_okTrue) temp_path os.path.join(temp_dir, ftemp_{datetime.now().strftime(%Y%m%d_%H%M%S)}.png) if hasattr(image, save): image.save(temp_path) else: # 如果是文件路径 import shutil shutil.copy(image, temp_path) # 处理图片 result process_image(temp_path, prompt, model, tokenizer) # 清理临时文件 try: os.remove(temp_path) except: pass return result with gr.Blocks(titleGLM-OCR 文档识别系统, themegr.themes.Soft()) as demo: gr.Markdown( # GLM-OCR 文档识别系统 支持文本识别、表格识别、公式识别等多种OCR功能。 ) with gr.Row(): with gr.Column(scale1): # 图片上传区域 image_input gr.Image( label上传文档图片, typepil, sources[upload], height400 ) # 任务选择 task_select gr.Dropdown( choices[ Text Recognition:, Table Recognition:, Formula Recognition: ], valueText Recognition:, label选择识别任务, interactiveTrue ) # 自定义提示词 custom_prompt gr.Textbox( label自定义提示词可选, placeholder留空使用默认提示词, lines2 ) # 识别按钮 recognize_btn gr.Button( 开始识别, variantprimary, sizelg ) with gr.Column(scale2): # 识别结果显示 output_text gr.Textbox( label识别结果, lines25, interactiveTrue, show_copy_buttonTrue ) # 导出功能区域 with gr.Group(): gr.Markdown(### 导出功能) with gr.Row(): format_select gr.Dropdown( choices[ Word文档 (.docx), PDF文件 (.pdf), Markdown (.md) ], valueWord文档 (.docx), label选择导出格式, scale3 ) export_btn gr.Button( 导出结果, variantsecondary, scale1 ) # 状态提示 export_status gr.Textbox( label导出状态, interactiveFalse, visibleFalse ) # 文件下载 download_file gr.File( label下载文件, interactiveFalse, visibleFalse ) # 识别按钮事件 def on_recognize(image, task, custom_text): if image is None: return 请上传图片 # 使用自定义提示词或默认提示词 prompt custom_text.strip() if custom_text.strip() else task return process_wrapper(image, prompt) recognize_btn.click( fnon_recognize, inputs[image_input, task_select, custom_prompt], outputsoutput_text ) # 导出按钮事件 def on_export(ocr_text, format_choice, image): if not ocr_text or ocr_text.strip() : return gr.update(visibleFalse), gr.update(value请先进行OCR识别, visibleTrue), gr.update(visibleFalse) file_path, status export_ocr_result(ocr_text, format_choice, image) if file_path: return gr.update(valuefile_path, visibleTrue), gr.update(valuestatus, visibleTrue), gr.update(visibleTrue) else: return gr.update(visibleFalse), gr.update(valuestatus, visibleTrue), gr.update(visibleFalse) export_btn.click( fnon_export, inputs[output_text, format_select, image_input], outputs[download_file, export_status, gr.Textbox(visibleTrue)] # 添加一个占位符保持输出数量一致 ) # 示例部分 with gr.Accordion(使用示例, openFalse): gr.Markdown( **文本识别示例:** - 上传包含文字的图片 - 选择Text Recognition: - 点击开始识别 **表格识别示例:** - 上传包含表格的图片 - 选择Table Recognition: - 点击开始识别 **公式识别示例:** - 上传包含数学公式的图片 - 选择Formula Recognition: - 点击开始识别 **导出功能:** 1. 先进行OCR识别获取结果 2. 选择要导出的格式Word/PDF/Markdown 3. 点击导出结果按钮 4. 下载生成的文件 ) # 提示信息 gr.Markdown( --- **提示:** - 支持PNG、JPG、WEBP格式图片 - 首次识别需要加载模型请耐心等待 - 导出功能需要先进行OCR识别 - 导出的文件保存在临时目录请及时下载 ) return demo def main(): 主函数 parser argparse.ArgumentParser() parser.add_argument(--model-path, typestr, default/root/ai-models/ZhipuAI/GLM-OCR, help模型路径) parser.add_argument(--server-name, typestr, default0.0.0.0, help服务器地址) parser.add_argument(--server-port, typeint, default7860, help服务器端口) parser.add_argument(--share, actionstore_true, help是否创建公开分享链接) args parser.parse_args() # 检查模型路径 if not os.path.exists(args.model_path): print(f错误: 模型路径不存在: {args.model_path}) sys.exit(1) # 加载模型 model, tokenizer load_model(args.model_path) # 创建界面 demo create_ui(model, tokenizer) # 启动服务 demo.launch( server_nameargs.server_name, server_portargs.server_port, shareargs.share, show_errorTrue ) if __name__ __main__: main()这个完整的示例包含了原有的OCR识别功能新增的导出功能改进的用户界面布局完整的错误处理使用说明和示例4. 功能测试与优化4.1 测试导出功能修改完成后我们需要测试导出功能是否正常工作。首先启动服务cd /root/GLM-OCR ./start_vllm.sh服务启动后在浏览器中打开http://localhost:7860你会看到新的界面多了一个导出功能区域。测试步骤上传一张包含文字的图片点击开始识别按钮等待识别完成查看结果选择导出格式比如Word文档点击导出结果按钮下载生成的文件并打开验证4.2 常见问题解决在测试过程中可能会遇到一些问题这里提供一些解决方案问题1导出按钮点击后没反应可能原因JavaScript错误或函数调用问题 解决方法检查浏览器控制台是否有错误信息确认export_utils.py文件在正确位置检查Python依赖是否安装完整问题2导出的文件格式不正确可能原因文件内容处理逻辑有问题 解决方法检查OCRExporter类中的格式处理逻辑确保文本内容正确传递验证文件扩展名是否正确问题3中文内容显示乱码可能原因编码问题 解决方法确保所有文件操作使用UTF-8编码在Word和PDF生成时指定中文字体修改export_utils.py添加中文字体支持4.3 添加中文字体支持为了让导出的Word和PDF正确显示中文我们需要修改导出工具添加中文字体支持。更新export_utils.py中的相关方法# 在OCRExporter类的export_to_word方法中添加中文字体支持 def export_to_word(self, output_pathNone): 导出为Word文档支持中文 if output_path is None: timestamp datetime.now().strftime(%Y%m%d_%H%M%S) output_path f/tmp/{self.base_name}_{timestamp}.docx # 创建Word文档 doc Document() # 添加中文字体支持 from docx.oxml.ns import qn from docx.shared import RGBColor # 设置文档默认字体 doc.styles[Normal].font.name 微软雅黑 doc.styles[Normal]._element.rPr.rFonts.set(qn(w:eastAsia), 微软雅黑) # ... 其余代码保持不变 ...对于PDF需要确保系统中有中文字体或者使用支持中文的字体文件。4.4 性能优化建议如果处理大量文档或大文件时性能不佳可以考虑以下优化异步处理将导出操作改为异步避免阻塞界面进度提示添加导出进度提示批量导出支持批量处理多个识别结果缓存机制对相同内容使用缓存避免重复生成5. 高级功能扩展5.1 添加更多导出格式除了基本的三种格式你还可以添加更多导出选项# 在export_utils.py中添加新格式支持 def export_to_txt(self, output_pathNone): 导出为纯文本文件 if output_path is None: timestamp datetime.now().strftime(%Y%m%d_%H%M%S) output_path f/tmp/{self.base_name}_{timestamp}.txt with open(output_path, w, encodingutf-8) as f: f.write(fOCR识别结果 - {self.base_name}\n) f.write(f生成时间: {datetime.now().strftime(%Y年%m月%d日 %H:%M:%S)}\n) f.write( * 50 \n\n) f.write(self.ocr_result) return output_path def export_to_html(self, output_pathNone): 导出为HTML文件 if output_path is None: timestamp datetime.now().strftime(%Y%m%d_%H%M%S) output_path f/tmp/{self.base_name}_{timestamp}.html html_content f!DOCTYPE html html head meta charsetUTF-8 titleOCR识别结果 - {self.base_name}/title style body {{ font-family: Arial, sans-serif; margin: 40px; }} .header {{ text-align: center; margin-bottom: 30px; }} .content {{ line-height: 1.6; }} table {{ border-collapse: collapse; width: 100%; margin: 20px 0; }} th, td {{ border: 1px solid #ddd; padding: 8px; text-align: left; }} th {{ background-color: #f2f2f2; }} /style /head body div classheader h1OCR识别结果 - {self.base_name}/h1 p生成时间: {datetime.now().strftime(%Y年%m月%d日 %H:%M:%S)}/p /div div classcontent {self._ocr_to_html()} /div /body /html with open(output_path, w, encodingutf-8) as f: f.write(html_content) return output_path def _ocr_to_html(self): 将OCR结果转换为HTML lines self.ocr_result.strip().split(\n) html_lines [] for line in lines: if line.strip(): # 判断是否为表格行 if \t in line: cells line.split(\t) if len(html_lines) 0 or not html_lines[-1].startswith(table): html_lines.append(table) html_lines.append(tr) html_lines.extend(fth{cell.strip()}/th for cell in cells) html_lines.append(/tr) else: html_lines.append(tr) html_lines.extend(ftd{cell.strip()}/td for cell in cells) html_lines.append(/tr) else: # 结束表格如果有 if html_lines and html_lines[-1].startswith(/tr): html_lines.append(/table) # 添加段落 html_lines.append(fp{line.strip()}/p) # 确保表格闭合 if html_lines and html_lines[-1].startswith(/tr): html_lines.append(/table) return \n.join(html_lines)然后在界面中添加这些新格式的选项。5.2 添加批量导出功能如果需要处理多个文档可以添加批量导出功能def batch_export(ocr_results, format_type, output_dirNone): 批量导出多个OCR结果 参数: ocr_results: 列表每个元素是(图片名, OCR文本)的元组 format_type: 导出格式 output_dir: 输出目录 返回: 压缩包路径 import zipfile if output_dir is None: output_dir /tmp/ocr_batch_export os.makedirs(output_dir, exist_okTrue) exported_files [] for i, (image_name, ocr_text) in enumerate(ocr_results): exporter OCRExporter(ocr_text, image_name) file_path exporter.export(format_type, os.path.join(output_dir, fdocument_{i1})) exported_files.append(file_path) # 创建压缩包 zip_path os.path.join(output_dir, batch_export.zip) with zipfile.ZipFile(zip_path, w) as zipf: for file_path in exported_files: zipf.write(file_path, os.path.basename(file_path)) return zip_path5.3 添加自定义模板功能对于需要固定格式的报告可以添加模板功能def export_with_template(self, template_path, output_pathNone): 使用模板导出 参数: template_path: 模板文件路径支持.docx output_path: 输出文件路径 from docx import Document # 加载模板 doc Document(template_path) # 在模板中查找替换标记并替换为OCR内容 # 这里需要根据实际模板设计替换逻辑 if output_path is None: timestamp datetime.now().strftime(%Y%m%d_%H%M%S) output_path f/tmp/{self.base_name}_template_{timestamp}.docx doc.save(output_path) return output_path6. 总结通过本文的步骤我们成功为GLM-OCR的Web UI添加了强大的导出功能。现在这个OCR工具不仅能够准确识别文档内容还能将识别结果一键导出为多种常用格式大大提升了实用性和工作效率。6.1 实现的核心功能多格式支持实现了Word、PDF、Markdown三种主流格式的导出智能格式处理能够识别文本中的表格结构并正确转换用户友好界面在原有界面上无缝集成操作简单直观错误处理完善对各种异常情况都有相应的处理机制中文字体支持确保中文内容正确显示6.2 主要改进点实用性提升从只能查看结果到可以导出使用完成了工具闭环用户体验优化添加了状态提示、错误反馈等细节代码结构清晰将导出功能模块化便于维护和扩展兼容性良好与原有功能完全兼容不影响正常使用6.3 使用建议日常使用对于简单的文档识别直接使用Web界面导出即可批量处理如果需要处理大量文档可以考虑扩展批量导出功能定制需求对于有特殊格式要求的场景可以开发自定义模板功能性能优化如果导出速度较慢可以考虑添加异步处理和进度提示6.4 扩展可能性这个导出功能框架具有良好的扩展性未来可以根据需要添加更多格式支持如Excel、PowerPoint、JSON等云端存储集成直接导出到云盘或协作平台API接口提供REST API供其他系统调用自动化工作流与自动化工具集成实现全自动文档处理通过这次定制开发我们不仅解决了GLM-OCR的实际使用痛点也展示了如何基于开源项目进行功能扩展的思路和方法。希望这个方案对你有所帮助也欢迎在此基础上继续优化和创新。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2430933.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…