mirror of
https://github.com/RYDE-WORK/Langchain-Chatchat.git
synced 2026-01-19 13:23:16 +08:00
新功能: - 优化 PDF 文件的 OCR,过滤无意义的小图片 by @liunux4odoo #2525 - 支持 Gemini 在线模型 by @yhfgyyf #2630 - 支持 GLM4 在线模型 by @zRzRzRzRzRzRzR - elasticsearch更新https连接 by @xldistance #2390 - 增强对PPT、DOC知识库文件的OCR识别 by @596192804 #2013 - 更新 Agent 对话功能 by @zRzRzRzRzRzRzR - 每次创建对象时从连接池获取连接,避免每次执行方法时都新建连接 by @Lijia0 #2480 - 实现 ChatOpenAI 判断token有没有超过模型的context上下文长度 by @glide-the - 更新运行数据库报错和项目里程碑 by @zRzRzRzRzRzRzR #2659 - 更新配置文件/文档/依赖 by @imClumsyPanda @zRzRzRzRzRzRzR - 添加日文版 readme by @eltociear #2787 修复: - langchain 更新后,PGVector 向量库连接错误 by @HALIndex #2591 - Minimax's model worker 错误 by @xyhshen - ES库无法向量检索.添加mappings创建向量索引 by MSZheng20 #2688
60 lines
2.4 KiB
Python
60 lines
2.4 KiB
Python
from langchain.document_loaders.unstructured import UnstructuredFileLoader
|
|
from typing import List
|
|
import tqdm
|
|
|
|
|
|
class RapidOCRPPTLoader(UnstructuredFileLoader):
|
|
def _get_elements(self) -> List:
|
|
def ppt2text(filepath):
|
|
from pptx import Presentation
|
|
from PIL import Image
|
|
import numpy as np
|
|
from io import BytesIO
|
|
from rapidocr_onnxruntime import RapidOCR
|
|
ocr = RapidOCR()
|
|
prs = Presentation(filepath)
|
|
resp = ""
|
|
|
|
def extract_text(shape):
|
|
nonlocal resp
|
|
if shape.has_text_frame:
|
|
resp += shape.text.strip() + "\n"
|
|
if shape.has_table:
|
|
for row in shape.table.rows:
|
|
for cell in row.cells:
|
|
for paragraph in cell.text_frame.paragraphs:
|
|
resp += paragraph.text.strip() + "\n"
|
|
if shape.shape_type == 13: # 13 表示图片
|
|
image = Image.open(BytesIO(shape.image.blob))
|
|
result, _ = ocr(np.array(image))
|
|
if result:
|
|
ocr_result = [line[1] for line in result]
|
|
resp += "\n".join(ocr_result)
|
|
elif shape.shape_type == 6: # 6 表示组合
|
|
for child_shape in shape.shapes:
|
|
extract_text(child_shape)
|
|
|
|
b_unit = tqdm.tqdm(total=len(prs.slides),
|
|
desc="RapidOCRPPTLoader slide index: 1")
|
|
# 遍历所有幻灯片
|
|
for slide_number, slide in enumerate(prs.slides, start=1):
|
|
b_unit.set_description(
|
|
"RapidOCRPPTLoader slide index: {}".format(slide_number))
|
|
b_unit.refresh()
|
|
sorted_shapes = sorted(slide.shapes,
|
|
key=lambda x: (x.top, x.left)) # 从上到下、从左到右遍历
|
|
for shape in sorted_shapes:
|
|
extract_text(shape)
|
|
b_unit.update(1)
|
|
return resp
|
|
|
|
text = ppt2text(self.file_path)
|
|
from unstructured.partition.text import partition_text
|
|
return partition_text(text=text, **self.unstructured_kwargs)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
loader = RapidOCRPPTLoader(file_path="../tests/samples/ocr_test.pptx")
|
|
docs = loader.load()
|
|
print(docs)
|