Spaces:
Running
Running
from typing import List | |
from langchain.document_loaders.unstructured import UnstructuredFileLoader | |
from configs import PDF_OCR_THRESHOLD | |
from document_loaders.ocr import get_ocr | |
import tqdm | |
class RapidOCRPDFLoader(UnstructuredFileLoader): | |
def _get_elements(self) -> List: | |
def pdf2text(filepath): | |
import fitz # pyMuPDF里面的fitz包,不要与pip install fitz混淆 | |
import numpy as np | |
ocr = get_ocr() | |
doc = fitz.open(filepath) | |
resp = "" | |
b_unit = tqdm.tqdm(total=doc.page_count, desc="RapidOCRPDFLoader context page index: 0") | |
for i, page in enumerate(doc): | |
b_unit.set_description("RapidOCRPDFLoader context page index: {}".format(i)) | |
b_unit.refresh() | |
text = page.get_text("") | |
resp += text + "\n" | |
img_list = page.get_image_info(xrefs=True) | |
for img in img_list: | |
if xref := img.get("xref"): | |
bbox = img["bbox"] | |
# 检查图片尺寸是否超过设定的阈值 | |
if ((bbox[2] - bbox[0]) / (page.rect.width) < PDF_OCR_THRESHOLD[0] | |
or (bbox[3] - bbox[1]) / (page.rect.height) < PDF_OCR_THRESHOLD[1]): | |
continue | |
pix = fitz.Pixmap(doc, xref) | |
img_array = np.frombuffer(pix.samples, dtype=np.uint8).reshape(pix.height, pix.width, -1) | |
result, _ = ocr(img_array) | |
if result: | |
ocr_result = [line[1] for line in result] | |
resp += "\n".join(ocr_result) | |
# 更新进度 | |
b_unit.update(1) | |
return resp | |
text = pdf2text(self.file_path) | |
from unstructured.partition.text import partition_text | |
return partition_text(text=text, **self.unstructured_kwargs) | |
if __name__ == "__main__": | |
loader = RapidOCRPDFLoader(file_path="../tests/samples/ocr_test.pdf") | |
docs = loader.load() | |
print(docs) | |