LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

pdf-extract-api:一个基于现代光学字符识别OCR技术的PDF文档提取和解析API

admin
2025年1月18日 16:52 本文热度 44
 

🆔  项目名称:pdf-extract-api 

⭐️  项目功能:文档提取和解析API

📁  项目简介:一个基于现代光学字符识别(OCR)技术的文档提取和解析API。

能够将任何图像或PDF文件转换为高精度的Markdown文本或JSON结构文档,支持表格数据、数字和数学公式的提取。

🌐  项目地址:https://github.com/CatchTheTornado/pdf-extract-api

代码下载附件:text-extract-api-0.2.0.zip


文本提取 API

以超高精度将任何图像、PDF 或 Office 文档转换为 Markdown 文本或 JSON 结构化文档,包括表格数据、数字或数学公式。

该 API 是使用 FastAPI 构建的,并使用 Celery 进行异步任务处理。Redis 用于缓存 OCR 结果。

 

特征:

  • 无需云/外部依赖项:基于 PyTorch 的 OCR (EasyOCR) + Ollama 通过不将数据发送到您的开发/服务器环境之外进行运输和配置,docker-compose

  • 使用不同的 OCR 策略(包括 llama3.2-visioneasyOCR)以非常高的准确性将 PDF/Office 转换为 Markdown

  • 使用 Ollama 支持的模型(例如。LLama 3.1)将 PDF/Office 转换为 JSON

  • LLM 改进 OCR 结果LLama 在修复 OCR 文本中的拼写和文本问题方面非常出色

  • 删除 PII此工具可用于从文档中删除个人身份信息 - 请参阅examples

  • 使用 Celery 的分布式队列处理)

  • 使用 Redis 进行缓存 - 可以在 LLM 处理之前轻松缓存 OCR 结果,

  • 存储策略 可切换的存储策略 (Google Drive、Local File System ...

  • 用于发送任务和处理结果的 CLI 工具

屏幕截图

将 MRI 报告转换为 Markdown + JSON。

python client/cli.py ocr_upload --file examples/example-mri.pdf --prompt_file examples/example-mri-2-json-prompt.txt

在运行示例之前,请参阅入门

 

将 Invoice 转换为 JSON 并删除 PII

python client/cli.py ocr_upload --file examples/example-invoice.pdf --prompt_file examples/example-invoice-remove-pii.txt 

在运行示例之前,请参阅入门

 

开始

您可能希望直接在您的计算机上运行应用程序以进行开发,或者使用 Apple GPU(Docker 目前不支持)。

先决条件

要启动并运行它,请执行以下步骤:

下载并安装 Ollama 下载并安装 Docker

在远程主机上设置 Ollama

要连接到外部 Ollama 实例,请设置环境变量:,例如:OLLAMA_HOST=http://address:port

OLLAMA_HOST=http(s)://127.0.0.1:5000

如果要禁用本地 Ollama 模型,请使用 env ,例如DISABLE_LOCAL_OLLAMA=1

DISABLE_LOCAL_OLLAMA=1 make install

注意:禁用本地 Ollama 后,请确保在外部实例上下载所需的模型。

目前,该变量不能用于在 Docker 中禁用 Ollama。解决方法是从 或 中删除服务。DISABLE_LOCAL_OLLAMAollamadocker-compose.ymldocker-compose.gpu.yml

在未来的版本中,将添加对在 Docker 环境中使用变量的支持。

克隆存储库

首先,克隆存储库并将当前目录更改为它:

git clone https://github.com/CatchTheTornado/text-extract-api.gitcd text-extract-api

设置Makefile

默认应用程序创建虚拟 python 环境: 。您可以通过在本地设置中禁用此功能,方法是在运行脚本之前添加:.venvDISABLE_VENV=1

DISABLE_VENV=1 make install 
DISABLE_VENV=1 make run 

手动设置

配置环境变量:

cp .env.localhost.example .env.localhost

您可能只想使用默认值 - 应该没问题。设置 ENV 变量后,只需执行:

python3 -m venv .venvsource .venv/bin/activate
pip install -e .chmod +x run.sh
run.sh

此命令将安装所有依赖项 - 包括 Redis(通过 Docker,因此无论如何它都不是完全无 docker 的运行方法:)text-extract-api

(MAC) - 依赖项

brew update && brew install libmagic poppler pkg-config ghostscript ffmpeg automake autoconf

(Mac) - 您需要启动 celery worker

source .venv/bin/activate && celery -A text_extract_api.celery_app worker --loglevel=info --pool=solo

然后,您可以运行一些 CLI 命令,例如:

python client/cli.py ocr_upload --file examples/example-mri.pdf --ocr_cache --prompt_file=examples/example-mri-remove-pii.txt

扩展 parallell 处理

要同时运行多个任务 - 要进行并发处理,请运行以下命令以启动单个工作进程:

celery -A text_extract_api.tasks worker --loglevel=info --pool=solo & # to scale by concurrent processing please run this line as many times as many concurrent processess you want to have running

在线演示

要试用我们的托管版本的应用程序,您可以跳过入门,在我们的云中试用 CLI 工具:

在浏览器中打开:demo.doctractor.com

... 或在终端上运行:

python3 -m venv .venvsource .venv/bin/activate
pip install -e .export OCR_UPLOAD_URL=https://doctractor:Aekie2ao@api.doctractor.com/ocr/uploadexport RESULT_URL=https://doctractor:Aekie2ao@api.doctractor.com/ocr/result/
python client/cli.py ocr_upload --file examples/example-mri.pdf --ocr_cache --prompt_file=examples/example-mri-remove-pii.txt

Demo 源码

注意: 在免费演示中,我们不保证任何处理时间。API 是开放的,因此请不要发送任何秘密文件,也不要发送任何包含个人信息的文件,如果您这样做 - 您将自行承担风险和责任。

 

在 Discord 上加入我们

如有任何问题、帮助请求或只是反馈 - 请在 Discord 上加入我们

Docker 入门

先决条件

  • 码头工人

  • Docker Compose

克隆存储库

git clone https://github.com/CatchTheTornado/text-extract-api.gitcd text-extract-api

Makefile

您可以使用 and 命令为 设置 Docker 环境。您可以找到执行此操作所需的手动步骤,如下所述。make installmake runtext-extract-api

手动设置

在根目录中创建文件并设置必要的环境变量。您可以将该文件用作模板:.env.env.example

# defaults for docker instancescp .env.example .env

# defaults for local runcp .env.example.localhost .env

然后修改文件内的变量:

#APP_ENV=production # sets the app into prod mode, otherwise dev mode with auto-reload on code changesREDIS_CACHE_URL=redis://localhost:6379/1
STORAGE_PROFILE_PATH=./storage_profiles
LLAMA_VISION_PROMPT="You are OCR. Convert image to markdown."# CLI settingsOCR_URL=http://localhost:8000/ocr/upload
OCR_UPLOAD_URL=http://localhost:8000/ocr/upload
OCR_REQUEST_URL=http://localhost:8000/ocr/request
RESULT_URL=http://localhost:8000/ocr/result/
CLEAR_CACHE_URL=http://localhost:8000/ocr/clear_cach
LLM_PULL_API_URL=http://localhost:8000/llm_pull
LLM_GENEREATE_API_URL=http://localhost:8000/llm_generate
CELERY_BROKER_URL=redis://localhost:6379/0
CELERY_RESULT_BACKEND=redis://localhost:6379/0
OLLAMA_HOST=http://localhost:11434
APP_ENV=development  # Default to development mode

注意: 为了正确保存输出文件,您可能需要根据storage_profiles/default.yamldocker-compose.yml

构建并运行 Docker 容器

使用 Docker Compose 构建并运行 Docker 容器:

docker-compose up --build

... 对于 GPU 支持,请运行:

docker-compose -f docker-compose.gpu.yml -p text-extract-api-gpu up --build

注意: 在 Mac 上时 - Docker 不支持 Apple GPU。在这种情况下,您可能希望在没有 Docker Compose 的情况下以本机方式运行应用程序,请查看如何使用 GPU 支持以本机方式运行它

这将启动以下服务:

  • FastAPI App:运行 FastAPI 应用程序。

  • Celery Worker:处理异步 OCR 任务。

  • Redis:缓存 OCR 结果。

  • Ollama:运行 Ollama 模型。

云 - 付费版

如果本地太麻烦,请向我们询问 text-extract-api 的托管/云版本,我们可以为您设置,只需按使用量付费。

CLI 工具

注意:在 Mac 上时,您可能需要先创建虚拟 Python 环境:

python3 -m venv .venvsource .venv/bin/activate# now you've got access to `python` and `pip` within your virutal env.pip install -e . # install main project requirements

该项目包括一个用于与 API 交互的 CLI。要使其正常工作,请先运行:

cd client
pip install -e .

拉取 LLama3.1 和 LLama3.2-vision 模型

您可能希望测试 LLama 支持的不同模型

python client/cli.py llm_pull --model llama3.1
python client/cli.py llm_pull --model llama3.2-vision

这些模型是 支持的大多数功能所必需的。text-extract-api

上传 OCR 文件(转换为 Markdown)

python client/cli.py ocr_upload --file examples/example-mri.pdf --ocr_cache

或者

python client/cli.py ocr_request --file examples/example-mri.pdf --ocr_cache

不同之处在于,第一次调用使用 - multipart form data upload,第二次调用是通过 base64 编码的 JSON 属性发送文件的请求 - 可能更适合较小的文件。ocr/uploadocr/request

上传用于 OCR 的文件(由 LLM 处理)

重要提示:要使用 LLM,您必须首先运行 llm_pull 以获取请求所需的特定模型。

例如,您必须运行:

python client/cli.py llm_pull --model llama3.1
python client/cli.py llm_pull --model llama3.2-vision

并且仅在运行此特定提示查询之后:

python client/cli.py ocr_upload --file examples/example-mri.pdf --ocr_cache --prompt_file=examples/example-mri-remove-pii.txt --language en

注意: language 参数用于 OCR 策略,以加载所选语言的模型权重。您可以将多种语言指定为列表:等。en,de,pl

该命令可以使用 :ocrstorage_profiles

  • storage_profile: 用于保存结果 - 默认使用配置文件 ();如果未保存空文件default./storage_profiles/default.yaml

  • storage_filename: 输出文件名 - 存储配置文件中集合的相对路径 - 默认情况下是文件夹的相对路径;可以使用占位符进行动态格式化: , , , - 用于日期格式, , , - 用于时间格式root_path/storage{file_name}{file_extension}{Y}{mm}{dd}{HH}{MM}{SS}

上传文件进行 OCR(由 LLM 处理),将结果存储在磁盘上

python client/cli.py ocr_upload --file examples/example-mri.pdf --ocr_cache --prompt_file=examples/example-mri-remove-pii.txt  --storage_filename "invoices/{Y}/{file_name}-{Y}-{mm}-{dd}.md"

按任务 ID 获取 OCR 结果

python client/cli.py result --task_id {your_task_id_from_upload_step}

列出存档的文件结果storage_profile

python client/cli.py list_files 

要使用特定 (在本例中) 存储配置文件,请运行:google drive

python client/cli.py list_files  --storage_profile gdrive

加载存档的文件结果storage_profile

python client/cli.py load_file --file_name "invoices/2024/example-invoice-2024-10-31-16-33.md"

删除存档的文件结果storage_profile

python client/cli.py delete_file --file_name "invoices/2024/example-invoice-2024-10-31-16-33.md" --storage_profile gdrive

或者对于默认配置文件(本地文件系统):

python client/cli.py delete_file --file_name "invoices/2024/example-invoice-2024-10-31-16-33.md" 

清除 OCR 缓存

python client/cli.py clear_cache

测试 LLama

python llm_generate --prompt "Your prompt here"

API 客户端

您可能希望使用十进制的 API 客户端来使用text-extract-api

打字稿

Typescript 有一个专用的 API 客户端 - text-extract-api-client 和同名的包:npm

npm install text-extract-api-client

用法:

import { ApiClient, OcrRequest } from 'text-extract-api-client';

const apiClient = new ApiClient('https://api.doctractor.com/', 'doctractor', 'Aekie2ao');

const formData = new FormData();

formData.append('file', fileInput.files[0]);

formData.append('prompt', 'Convert file to JSON and return only JSON'); // if not provided, no LLM transformation will gonna happen - just the OCR

formData.append('strategy', 'llama_vision');

formData.append('model', 'llama3.1')

formData.append('ocr_cache', 'true');


apiClient.uploadFile(formData).then(response => {

    console.log(response);

});

端点

通过文件上传/多格式数据实现 OCR 端点

  • 网址:/ocr/upload

  • 方法:POST

  • 参数

    • file:要处理的 PDF、图像或 Office 文件。

    • strategy:要使用的 OCR 策略 ( 或 )。llama_visioneasyocr

    • ocr_cache:是否缓存 OCR 结果(true 或 false)。

    • prompt:提供时,将用于 Ollama 处理 OCR 结果

    • model:当与提示符一起提供时 - 此模型将用于 LLM 处理

    • storage_profile: 用于保存结果 - 默认使用配置文件 ();如果未保存空文件default./storage_profiles/default.yaml

    • storage_filename: 输出文件名 - 存储配置文件中集合的相对路径 - 默认情况下是文件夹的相对路径;可以使用占位符进行动态格式化: , , , - 用于日期格式, , , - 用于时间格式root_path/storage{file_name}{file_extension}{Y}{mm}{dd}{HH}{MM}{SS}

    • language:OCR 的一个或多个(或 )语言代码,用于加载语言权重enen,pl,de

例:

curl -X POST -H "Content-Type: multipart/form-data" -F "file=@examples/example-mri.pdf" -F "strategy=easyocr" -F "ocr_cache=true" -F "prompt=" -F "model=" "http://localhost:8000/ocr/upload"

通过 JSON 请求的 OCR 端点

  • 网址:/ocr/request

  • 方法:POST

  • 参数(JSON 正文):

    • file:Base64 编码的 PDF 文件内容。

    • strategy:要使用的 OCR 策略 ( 或 )。llama_visioneasyocr

    • ocr_cache:是否缓存 OCR 结果(true 或 false)。

    • prompt:如果提供,将用于 Ollama 处理 OCR 结果。

    • model:当与提示一起提供时 - 此模型将用于 LLM 处理。

    • storage_profile:用于保存结果 - 默认使用配置文件 ();如果未保存空文件。default/storage_profiles/default.yaml

    • storage_filename:输出文件名 - 存储配置文件中集的相对路径 - 默认情况下是文件夹的相对路径;可以使用占位符进行动态格式设置:、、、、 - 用于日期格式,、 、 - 用于时间格式。root_path/storage{file_name}{file_extension}{Y}{mm}{dd}{HH}{MM}{SS}

    • language:OCR 的一个或多个(或 )语言代码,用于加载语言权重enen,pl,de

例:

curl -X POST "http://localhost:8000/ocr/request" -H "Content-Type: application/json" -d '{

  "file": "<base64-encoded-file-content>",

  "strategy": "easyocr",

  "ocr_cache": true,

  "prompt": "",

  "model": "llama3.1",

  "storage_profile": "default",

  "storage_filename": "example.pdf"

}'

OCR 结果端点

  • 网址:/ocr/result/{task_id}

  • 方法:GET

  • 参数

    • task_id:OCR 终端节点返回的任务 ID。

例:

curl -X GET "http://localhost:8000/ocr/result/{task_id}"

清除 OCR 缓存端点

  • 网址:/ocr/clear_cache

  • 方法:POST

例:

curl -X POST "http://localhost:8000/ocr/clear_cache"

Ollama Pull Endpoint

  • 网址:/llm/pull

  • 方法:POST

  • 参数

    • model:首先拉取要使用的模型

例:

curl -X POST "http://localhost:8000/llm/pull" -H "Content-Type: application/json" -d '{"model": "llama3.1"}'

Ollama Endpoint

  • 网址:/llm/generate

  • 方法:POST

  • 参数

    • prompt:提示输入 Ollama 模型。

    • model:您喜欢查询的模型

例:

curl -X POST "http://localhost:8000/llm/generate" -H "Content-Type: application/json" -d '{"prompt": "Your prompt here", "model":"llama3.1"}'

列出存储文件:

  • 网址: /storage/list

  • 方法: 获取

  • 参数

    • storage_profile:用于列出文件的存储配置文件的名称(默认值:)。default

下载存储文件:

  • 网址:/storage/load

  • 方法: 获取

  • 参数

    • file_name:要从存储加载的文件名

    • storage_profile:用于列出文件的存储配置文件的名称(默认值:)。default

删除存储文件:

  • 网址:/storage/delete

  • 方法: 删除

  • 参数

    • file_name:要从存储加载的文件名

    • storage_profile:用于列出文件的存储配置文件的名称(默认值:)。default

存储配置文件

该工具可以使用不同的存储策略和存储配置文件自动保存结果。存储配置文件由 yaml 配置文件设置。/storage_profiles

本地文件系统

strategy: local_filesystem

settings:

  root_path: /storage # The root path where the files will be stored - mount a proper folder in the docker file to match it

  subfolder_names_format: "" # eg: by_months/{Y}-{mm}/

  create_subfolders: true

Google 云端硬盘

strategy: google_drive

settings:

## how to enable GDrive API: https://developers.google.com/drive/api/quickstart/python?hl=pl

  service_account_file: /storage/client_secret_269403342997-290pbjjlb06nbof78sjaj7qrqeakp3t0.apps.googleusercontent.com.json

  folder_id:

其中 是具有授权凭证的文件。请阅读如何启用 Google Drive API 并在此处准备此授权文件。service_account_filejson

注意:服务帐户与您用于 Google Workspace 的帐户不同(文件在 UI 中不可见)

Amazon S3 – 云对象存储

strategy: aws_s3

settings:

  bucket_name: ${AWS_S3_BUCKET_NAME}

  region: ${AWS_REGION}

  access_key: ${AWS_ACCESS_KEY_ID}

  secret_access_key: ${AWS_SECRET_ACCESS_KEY}

AWS S3 访问密钥的要求

  1. 访问密钥所有权
    访问密钥必须属于具有 S3 操作权限的 IAM 用户或角色。

  2. IAM 策略示例
    附加到用户或角色的 IAM 策略必须允许必要的操作。以下是授予对 S3 存储桶的访问权限的策略示例:

{

    "Version": "2012-10-17",

    "Statement": [

        {

            "Effect": "Allow",

            "Action": [

                "s3:PutObject",

                "s3:GetObject",

                "s3:ListBucket",

                "s3:DeleteObject"

            ],

            "Resource": [

                "arn:aws:s3:::your-bucket-name",

                "arn:aws:s3:::your-bucket-name/*"

            ]

        }

    ]

}


接下来,使用所需的 AWS 凭证填充相应的文件(例如 .env、.env.localhost):.env

AWS_ACCESS_KEY_ID=your-access-key-id

AWS_SECRET_ACCESS_KEY=your-secret-access-key

AWS_REGION=your-region

AWS_S3_BUCKET_NAME=your-bucket-name

许可证

本项目根据 MIT 许可证获得许可。有关详细信息,请参阅 LICENSE 文件。

联系

如有任何问题,请通过以下方式与我们联系:info@catchthetornado.com


该文章在 2025/1/18 17:26:23 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2025 ClickSun All Rights Reserved