fix pdf parser bug

This commit is contained in:
Wenjie Zhang 2024-09-29 16:13:06 +08:00
parent ee84c4f391
commit e968a3d9f8
5 changed files with 40 additions and 5 deletions

View File

@ -7,6 +7,7 @@ Flask_Cors>=4.0.1
llama_index>=0.11.8 llama_index>=0.11.8
openai>=1.44.1 openai>=1.44.1
paddleocr>=2.8.1 paddleocr>=2.8.1
paddlepaddle>=2.4.0
pandas>=2.2.2 pandas>=2.2.2
Pillow>=10.4.0 Pillow>=10.4.0
pymilvus>=2.4.4 pymilvus>=2.4.4
@ -19,4 +20,5 @@ zhipuai>=2.1.2
neo4j>=5.22.0 neo4j>=5.22.0
sentencepiece==0.1.99 sentencepiece==0.1.99
llama-index-readers-file llama-index-readers-file
opencv-python-headless
docx2txt docx2txt

View File

@ -1,6 +1,7 @@
import os import os
import json import json
import time import time
from src.plugins import pdf2txt
from src.utils import hashstr, setup_logger, is_text_pdf from src.utils import hashstr, setup_logger, is_text_pdf
from src.models.embedding import get_embedding_model from src.models.embedding import get_embedding_model
@ -108,7 +109,7 @@ class DataBaseManager:
"file_id": "file_" + hashstr(file + str(time.time())), "file_id": "file_" + hashstr(file + str(time.time())),
"filename": os.path.basename(file), "filename": os.path.basename(file),
"path": file, "path": file,
"type": file.split(".")[-1], "type": file.split(".")[-1].lower(),
"status": "waiting", "status": "waiting",
"created_at": time.time() "created_at": time.time()
} }
@ -122,7 +123,12 @@ class DataBaseManager:
db.files[idx]["status"] = "processing" db.files[idx]["status"] = "processing"
try: try:
nodes = chunk(new_file["path"], params=params) if new_file["type"] == "pdf":
texts = self.read_text(new_file["path"])
nodes = chunk(texts, params=params)
else:
nodes = chunk(new_file["path"], params=params)
self.knowledge_base.add_documents( self.knowledge_base.add_documents(
docs=[node.text for node in nodes], docs=[node.text for node in nodes],
collection_name=db.metaname, collection_name=db.metaname,

View File

@ -18,7 +18,7 @@ def chunk(text_or_path, params=None):
if os.path.isfile(text_or_path) and "uploads" in text_or_path: if os.path.isfile(text_or_path) and "uploads" in text_or_path:
parser = SimpleFileNodeParser() parser = SimpleFileNodeParser()
file_type = Path(text_or_path).suffix file_type = Path(text_or_path).suffix.lower()
if file_type in [".txt", ".json", ".md"]: if file_type in [".txt", ".json", ".md"]:
docs = FlatReader().load_data(Path(text_or_path)) docs = FlatReader().load_data(Path(text_or_path))
elif file_type in [".docx"]: elif file_type in [".docx"]:

View File

@ -4,8 +4,9 @@ import fitz # fitz就是pip install PyMuPDF
from PIL import Image from PIL import Image
from copy import deepcopy from copy import deepcopy
from tqdm import tqdm from tqdm import tqdm
from pathlib import Path
from argparse import ArgumentParser from argparse import ArgumentParser
from src.utils import logger from src.utils import logger, is_text_pdf
import numpy as np # Added import for numpy import numpy as np # Added import for numpy
GOLBAL_STATE = {} GOLBAL_STATE = {}
@ -15,6 +16,9 @@ def pdf2txt(pdf_path, return_text=False):
if not os.path.exists(pdf_path): if not os.path.exists(pdf_path):
raise FileNotFoundError(f"File not found: {pdf_path}") raise FileNotFoundError(f"File not found: {pdf_path}")
if is_text_pdf(pdf_path):
return pdfreader(pdf_path)
# Importing these modules here to avoid unnecessary imports in other files # Importing these modules here to avoid unnecessary imports in other files
from paddleocr import PPStructure, save_structure_res from paddleocr import PPStructure, save_structure_res
from paddleocr.ppstructure.recovery.recovery_to_doc import sorted_layout_boxes, convert_info_docx from paddleocr.ppstructure.recovery.recovery_to_doc import sorted_layout_boxes, convert_info_docx
@ -108,6 +112,29 @@ def convert_imgs(pdf_path, output_dir):
def get_state(task_id): def get_state(task_id):
return GOLBAL_STATE.get(task_id, {}) return GOLBAL_STATE.get(task_id, {})
def pdfreader(file_path):
"""读取PDF文件并返回text文本"""
assert os.path.exists(file_path), "File not found"
assert file_path.endswith(".pdf"), "File format not supported"
from llama_index.readers.file import PDFReader
doc = PDFReader().load_data(file=Path(file_path))
# 简单的拼接起来之后返回纯文本
text = "\n\n".join([d.get_content() for d in doc])
return text
def plainreader(file_path):
"""读取普通文本文件并返回text文本"""
assert os.path.exists(file_path), "File not found"
with open(file_path, "r") as f:
text = f.read()
return text
if __name__ == "__main__": if __name__ == "__main__":
parser = ArgumentParser() parser = ArgumentParser()
parser.add_argument('--pdf-path', type=str, required=True, help='Path to the PDF file') parser.add_argument('--pdf-path', type=str, required=True, help='Path to the PDF file')

View File

@ -118,7 +118,7 @@ def upload_file():
if file: if file:
upload_dir = os.path.join(startup.config.save_dir, "data/uploads") upload_dir = os.path.join(startup.config.save_dir, "data/uploads")
os.makedirs(upload_dir, exist_ok=True) os.makedirs(upload_dir, exist_ok=True)
filename = f"{hashstr(file.filename, 4, with_salt=True)}_{file.filename}" filename = f"{hashstr(file.filename, 4, with_salt=True)}_{file.filename}".lower()
file_path = os.path.join(upload_dir, filename) file_path = os.path.join(upload_dir, filename)
file.save(file_path) file.save(file_path)
return jsonify({'message': 'File successfully uploaded', 'file_path': file_path}), 200 return jsonify({'message': 'File successfully uploaded', 'file_path': file_path}), 200