Files
FunMD_Convert/api.md
2026-01-07 17:18:26 +08:00

11 KiB
Raw Permalink Blame History

FunMD 文档处理接口与测试说明

基本信息

  • 基地址(内网):http://192.168.110.58:8000
  • 前端内网测试链接:http://192.168.110.58:8000/ui/
  • 统一返回结构API v2成功 {"code":0,"msg":"ok","data":{...}},失败 {"code":<错误码>,"msg":<错误>,"data":null}HTTP 状态保持 200
  • 建议前端设置:localStorage.setItem('app.api.base','http://192.168.110.58:8000')
  • 重要约定:当 MinIO 桶为私有时,优先使用返回的 minio_presigned_url 进行下载;直链 minio_url 可能 403。

接口列表

健康检查

  • 方法:GET /health
  • 返回:{"status":"ok"}
  • 参考:docling/app/server.py:99

统一转换DOCX/PDF → Markdown/HTML/JSON

  • 方法:POST /api/convert
  • 表单字段:
    • filesource_url 二选一
    • export: markdown|html|json|doctags,默认 markdown
    • engine(可选):word2markdown|docling
    • save(可选):true|false
    • filename(可选):输出基名
  • 返回:
    • 未保存:data.content 为文本,data.media_type 指示类型
    • 已保存:data.minio_urldata.minio_presigned_url
  • 示例:
    # 本地 PDF 转 Markdown不保存
    curl -X POST http://192.168.110.58:8000/api/convert \
      -F file=@/path/to/file.pdf \
      -F export=markdown
    
    # 远程 URL 转 HTML保存
    curl -X POST http://192.168.110.58:8000/api/convert \
      -F source_url=https://example.com/page.pdf \
      -F export=html -F save=true -F filename=example
    
  • 参考:docling/app/server.py:2296

Markdown → DOCX/PDF高级样式支持

  • 方法:POST /md/convert
  • 输入三选一:md_file | markdown_text | markdown_url
  • 必填:target=docx|pdf
  • 可选(高级设置):
    • 布局:css_namecss_texttoc=true|falseheader_textfooter_text
    • 封面与 Logocover_url|cover_filelogo_url|logo_file
    • 封面文字:product_name|document_name|product_version|document_version
    • 版权:copyright_text
    • 保存:save=true|false
  • 行为说明:
    • save=false 时,封面/Logo 会内嵌为 data:,避免私有桶 403save=true 时返回 MinIO 链接。
  • 例:
    # 文本转 PDF封面、Logo、目录、页眉页脚
    curl -X POST http://192.168.110.58:8000/md/convert \
      -F markdown_text='# 标题\n\n内容' \
      -F target=pdf -F toc=true \
      -F header_text='Internal' -F footer_text='Confidential' \
      -F product_name='CMS' -F document_name='周报' \
      -F product_version='v1.0' -F document_version='2025-W48' \
      -F cover_file=@/path/to/cover.png -F logo_file=@/path/to/logo.png
    
    # 文件转 DOCX保存到 MinIO
    curl -X POST http://192.168.110.58:8000/md/convert \
      -F md_file=@/path/to/doc.md \
      -F target=docx -F save=true -F filename='周报'
    
  • 参考:docling/app/server.py:1198

本地文件夹批量处理(重写 MD 资源并上传)

  • 方法:POST /md/convert-folder
  • 表单字段:
    • folder_path(必填):本地文件夹绝对路径(后端机器)
    • prefix可选MinIO 前缀(如 assets
  • 返回:{ ok, count, files: [{ source, minio_url, minio_presigned_url, asset_ok, asset_fail, mappings }] }
  • 示例:
    curl -X POST http://192.168.110.58:8000/md/convert-folder \
      -F folder_path='/Users/fanyang/Desktop/Others/CMS/达梦数据-各类示范文档/数+产品手册-MD源文件/DMDRS_Build_Manual_DM8' \
      -F prefix='assets'
    
  • 参考:docling/app/server.py:2075

上传压缩包批量处理

  • 方法:POST /api/upload-archive
  • 表单字段:filezip/tar.gz/tgzprefix(可选)
  • 返回:{ code, msg, data: { count, files: [{ source, minio_url, minio_presigned_url, mappings }] } }
  • 示例:
    curl -X POST http://192.168.110.58:8000/api/upload-archive \
      -F file=@/path/to/archive.zip -F prefix='assets'
    
  • 参考:docling/app/server.py:2571

归档分阶段处理

  • 暂存上传:POST /api/archive/stage,返回 { id, name, size }
  • 批量处理:POST /api/archive/process,字段:id(必填)、prefix(可选)、versionId(可选)
  • 说明HTML 文件按“两阶段重写”策略处理HTML 资源上传到 MinIO 并重写 → 转换为 Markdown → 再次重写 MD 中的资源与链接),支持 data:image/*;base64, 图片上传并替换为 MinIO 链接
  • 参考:docling/app/server.py:2714,2728

MinIO 配置与测试

  • 设置配置:POST /config/minio

    • 字段:endpointpublicaccesssecretbucketsecure=true|falseprefixstore_final=true|falsepublic_read=true|false
    • 示例:
      curl -X POST http://192.168.110.58:8000/config/minio \
        -F endpoint='127.0.0.1:9000' -F public='127.0.0.1:9000' \
        -F access='minioadmin' -F secret='minioadmin123' \
        -F bucket='doctest' -F secure=false -F prefix='assets' \
        -F store_final=true -F public_read=true
      
    • 注意:请使用 MinIO API 端口 9000(而非 9001 控制台端口);若填写控制台地址或 :9001 将被拒绝
    • 参考:docling/app/server.py:488
  • 连通测试并应用策略:POST /config/minio/test

    • 同上字段,额外可携带 create_if_missing=true
    • 返回:{ ok, connected, bucket_exists, created, error?, hint? }
    • 参考:docling/app/server.py:577
  • 获取配置快照:GET /config(参考:docling/app/server.py:1047

  • 配置档案:GET /config/profilesPOST /config/save_profileGET /config/load_profile?name=xxx(参考:docling/app/server.py:1058,1068,1084

系统时间检查MinIO 时间偏差排查)

  • 方法:GET /system/time/check
  • 查询参数:endpointpublicsecure(可选,不传则使用当前运行时配置)
  • 返回:{ ok, server_time, local_time, diff_sec, hint }
  • 参考:docling/app/server.py:720

资源映射与代理下载(可选)

  • LinkmapGET /config/linkmapPOST /config/linkmap(参考:docling/app/server.py:1583,1587
  • 代理下载:POST /proxy/download(参考:docling/app/server.py:1635

前端集成要点

  • 基地址读取:frontend/src/services/api.ts:56-64localStorage app.api.base 优先,其次 VITE_API_BASE_URL
  • 提供的方法:
    • convertDoc/api/convertfrontend/src/services/api.ts:96
    • uploadArchive/api/upload-archivefrontend/src/services/api.ts:104
    • stageArchive/api/archive/stagefrontend/src/services/api.ts:185
    • processArchive/api/archive/processfrontend/src/services/api.ts:193
    • convertMd/md/convertfrontend/src/services/api.ts:157
    • convertFolder/md/convert-folderfrontend/src/services/api.ts:164
    • MinIO 配置:setMinioConfigfrontend/src/services/api.ts:112)、testMinioConfigfrontend/src/services/api.ts:128)、createBucketfrontend/src/services/api.ts:145
  • 私有桶注意:直链可能 403前端应优先使用 minio_presigned_urlUI 已支持)。

测试说明(覆盖所有能力)

1. 健康检查

  • 请求:GET /health
  • 断言:返回 {"status":"ok"}

2. DOCX/PDF → Markdown/HTML/JSON

  • 用例 A本地 PDF → Markdown不保存

    • POST /api/convertfile=@/path/to/file.pdfexport=markdown
    • 断言:code=0data.content 包含 Markdown 文本、data.media_typetext/markdown; charset=utf-8
  • 用例 B远程 PDF → HTML保存

    • POST /api/convertsource_url=http(s)://...pdfexport=htmlsave=truefilename=example
    • 断言:返回 minio_urlminio_presigned_url 可访问;中文路径正确编码。

3. Markdown → DOCX/PDF

  • 用例 C文本 → PDF高级参数save=false

    • 字段:markdown_texttarget=pdftoc=trueheader_textfooter_text、封面/Logo 文件与封面文字
    • 断言:返回 PDF 二进制可打开;封面与 Logo 可见。日志中的 word-break: break-word 警告不影响生成。
  • 用例 D文件 → DOCXsave=true

    • 字段:md_filetarget=docxsave=true
    • 断言:minio_presigned_url 可下载;中文文件名编码正确。
  • 用例 EURL → PDF

    • 字段:markdown_url=http(s)://...mdtarget=pdf
    • 断言:生成成功;封面与 Logo 正常加载(若私有桶则走签名链接)。

4. 批量处理

  • 用例 F本地文件夹批量重写并上传

    • POST /md/convert-folderfolder_path='/Users/fanyang/Desktop/Others/CMS/达梦数据-各类示范文档/数+产品手册-MD源文件/DMDRS_Build_Manual_DM8'prefix='assets'
    • 断言:count>0;各文件 asset_ok/asset_fail 合理;minio_presigned_url 可下载。
  • 用例 G上传压缩包批量处理

    • POST /api/upload-archivefile=@/path/to/archive.zipprefix='assets'
    • 断言:data.count 正确;各文件链接可用。

5. MinIO 配置与策略

  • 用例 H设置配置

    • POST /config/minio(真实参数)
    • 断言:返回 ok:true
  • 用例 I连通测试并应用策略

    • POST /config/minio/testpublic_read=true|falsecreate_if_missing=true
    • 断言:返回连通状态;私有桶下使用 minio_presigned_url 可访问。

6. 资源映射与代理(可选)

  • 用例 JGET/POST /config/linkmap 设置静态映射;POST /proxy/download 验证代理下载功能。

兼容性与注意事项

  • 路径编码:所有返回的对象路径已进行编码,适配中文、空格、括号等字符。
  • 私有桶:直链可能 403前端测试请使用 minio_presigned_url
  • 样式警告WeasyPrint 不支持 word-break: break-word,建议 overflow-wrap: break-wordword-break: break-all
  • 安全解压ZIP/TAR 采用路径穿越防护,解压目标限定在工作目录内;同时自动修复常见文件名乱码编码
  • HTML 资产重写:批量处理对 HTML 的资源链接进行两阶段重写并上传至 MinIO内嵌 Base64 图片自动上传并替换为可访问链接
  • 控制台端口限制:/config/minio/config/minio/test 会拒绝 :9001 或带 /browser/minio 的控制台地址;请使用 9000 API 端口

本地运行(后端与前端)

  • 后端FastAPI端口 8000
    • cd /Users/fanyang/Desktop/FunMD_Convert/docling
    • PYTHONPATH=. python -m uvicorn app.server:app --host 127.0.0.1 --port 8000
  • 前端Vite
    • cd /Users/fanyang/Desktop/FunMD_Convert/frontend
    • npm install
    • VITE_API_BASE_URL=http://127.0.0.1:8000 npm run dev
  • 访问:
    • 后端 UI 首页:http://127.0.0.1:8000/ui/
    • 前端开发页面Vite 控制台输出的本地地址(通常为 http://127.0.0.1:5173/

前端配置 API Base避免代理空响应

  • 打开前端页面右上角“数据库配置”弹窗,在“接口地址”一栏填写:http://127.0.0.1:8000,点击“保存配置”。
  • 保存后,前端会直连后端 8000 端口,不再通过 Vite 代理,避免长耗时请求在 5173 上出现 ERR_EMPTY_RESPONSE