🆔 项目名称: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-vision、easyOCR)以非常高的准确性将 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_OLLAMA
ollama
docker-compose.yml
docker-compose.gpu.yml
在未来的版本中,将添加对在 Docker 环境中使用变量的支持。
克隆存储库
首先,克隆存储库并将当前目录更改为它:
git clone https://github.com/CatchTheTornado/text-extract-api.gitcd text-extract-api
设置Makefile
默认应用程序创建虚拟 python 环境: 。您可以通过在本地设置中禁用此功能,方法是在运行脚本之前添加:.venv
DISABLE_VENV=1
DISABLE_VENV=1 make install
手动设置
配置环境变量:
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 入门
先决条件
克隆存储库
git clone https://github.com/CatchTheTornado/text-extract-api.gitcd text-extract-api
用Makefile
您可以使用 and 命令为 设置 Docker 环境。您可以找到执行此操作所需的手动步骤,如下所述。make install
make run
text-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.yaml
docker-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 支持以本机方式运行它
这将启动以下服务:
云 - 付费版
如果本地太麻烦,请向我们询问 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/upload
ocr/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
该命令可以使用 :ocr
storage_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_vision
easyocr
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 的一个或多个(或 )语言代码,用于加载语言权重en
en,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_vision
easyocr
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 的一个或多个(或 )语言代码,用于加载语言权重en
en,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
参数
例:
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
例:
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/delete
方法: 删除
参数
存储配置文件
该工具可以使用不同的存储策略和存储配置文件自动保存结果。存储配置文件由 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_file
json
注意:服务帐户与您用于 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 访问密钥的要求
访问密钥所有权
访问密钥必须属于具有 S3 操作权限的 IAM 用户或角色。
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 编辑过