跳到主要内容

PDF4me Python SDK 入门

pdf4me 包裹 PyPI 是官方的异步 Python SDK 为了 PDF4me REST API它包含 106 个类型化的异步函数,分布在 18 个模块中,涵盖转换、优化、合并、拆分、加盖戳记、电子签名等功能。 OCR表格填写、数据提取、条形码 ZUGFeRD 电子发票,以及 AI基于 - 从发票、收据、合同、银行对账单、税务文件和工资单中提取文档。

包装信息

场地价值
软件包名称pdf4me
当前版本1.0.2 (发布于 2026 年 9 月 14 日)
执照MIT
Python 支持>=3.11 (已在 3.11、3.12、3.13、3.14 版本上测试)
发展状况生产/稳定
框架异步IO
来源github.com/pdf4me/pdf4me-clientapi-python
PyPIpypi.org/project/pdf4me

客户端底层是由微软生成的。 Kiota 在……之上 httpx[http2]因此,每个操作都是完全类型化的,返回类型化的结果,并且每个客户端都重用一个连接池。

先决条件

  • Python 3.11 或更高版本。
  • A PDF4me 账户和 API 钥匙。
  • pip (或者 uvpoetry或任何 PyPI(兼容的安装程序)。

安装

python -m pip install pdf4me

安装 pdf4me 拉进来 httpx[http2] 以及微软 Kiota 运行时包(microsoft-kiota-abstractionsmicrosoft-kiota-http以及 JSON、表单、文本和多部分序列化后端)。

认证

设置你的 API 环境中的关键因素:

export PDF4ME_API_KEY="your-api-key"

以下示例在运行时从该变量读取键。您也可以直接将其传递给 Pdf4meClient(api_key) 如果您更喜欢从密钥管理器加载它, .env 文件或其他来源。

快速入门

最小的实用程序:打开一个客户端,运行一个操作,将结果写入磁盘。

import asyncio
import os
from pathlib import Path

from pdf4me import Pdf4meClient
from pdf4me.optimize import optimize


async def main() -> None:
api_key = os.environ.get("PDF4ME_API_KEY")
if not api_key:
raise SystemExit("Set PDF4ME_API_KEY before running this example.")

source = Path("input.pdf")
async with Pdf4meClient(api_key) as client:
result = await optimize(
client, source.read_bytes(), doc_name=source.name
)
Path("optimized.pdf").write_bytes(result)
print("Saved optimized.pdf")


if __name__ == "__main__":
asyncio.run(main())

三点需要注意:

  1. 一个客户,多个电话。async with Pdf4meClient(...) 上下文管理底层 httpx 连接池。在连接池内,每次调用都重用同一个客户端。 main 而不是每次操作都打开一个。
  2. Actions 是自由函数,而不是客户端方法。 从其模块导入每个操作(from pdf4me.optimize import optimizefrom pdf4me.pdf import get_pdf_metadata并将客户端作为第一个参数传递。这样可以保持界面平坦,并允许你在编辑器中对未使用的模块进行 tree-shaking 操作。
  3. 输入字节,输出字节。 产生文件返回的操作 bytes生成元数据的操作会返回类型化的数据类。由于没有磁盘暂存,因此可以在操作之间传递结果而无需访问文件系统。

还有两种常见的呼叫

盖章 PDF

from pdf4me.edit import StampAlignX, stamp

stamped = await stamp(client, data, text="DRAFT", align_x=StampAlignX.Center)
Path("stamped.pdf").write_bytes(stamped)

PDF 元数据:

from pdf4me.pdf import get_pdf_metadata

metadata = await get_pdf_metadata(client, data, doc_name="input.pdf")
print(metadata.page_count)

每个值都以枚举形式传递(例如 StampAlignX.Center) 是一个类型化的常量,所以你的 IDE 它能自动补全合法值,并且 mypy 或 pyright 能在编辑时捕获拼写错误。

盒子里包含哪些内容(18 个模块,共 106 个操作)

模块行动导入示例
pdf4me.ai_document_extraction14from pdf4me.ai_document_extraction import extract_invoice_data
pdf4me.barcode7from pdf4me.barcode import create_barcode, read_barcodes
pdf4me.convert13from pdf4me.convert import html_to_pdf, url_to_pdf, word_to_pdf
pdf4me.edit7from pdf4me.edit import stamp, add_page_number, add_html_header_footer
pdf4me.excel1from pdf4me.excel import excel_to_pdf
pdf4me.extract8from pdf4me.extract import extract_text, extract_attachments
pdf4me.find_search2from pdf4me.find_search import find_and_replace_text
pdf4me.forms2from pdf4me.forms import fill_pdf_form, get_form_fields
pdf4me.generate6from pdf4me.generate import generate_document_single
pdf4me.image13from pdf4me.image import resize_image, add_watermark_to_image
pdf4me.merge_split5from pdf4me.merge_split import merge_pdfs, split_pdf_by_barcode
pdf4me.optimize1from pdf4me.optimize import optimize
pdf4me.organize5from pdf4me.organize import rotate_pdf, extract_pages
pdf4me.pdf16from pdf4me.pdf import get_pdf_metadata, sign_pdf
pdf4me.pdf4me1from pdf4me.pdf4me import ping
pdf4me.security2from pdf4me.security import protect_document, unlock_pdf
pdf4me.word2from pdf4me.word import add_tracked_changes
pdf4me.zugferd1from pdf4me.zugferd import create_zugferd_invoice

以上导入路径仅用于说明模块接口。请参阅…… PDF4me REST API 参考 有关每个操作的完整参数列表以及源代码库的 pdf4me/ 包含您版本导出的确切符号名称的包树。

接下来该去哪里?

故障排除

ModuleNotFoundError: No module named 'pdf4me' 该软件包安装在与运行脚本的解释器不同的解释器中。请确认。 python -m pip show pdf4me 在同一个虚拟环境中。如果您使用 pyenv 或者 conda首先激活环境。

SystemExit: Set PDF4ME_API_KEY before running this example. 您的进程无法访问该环境变量。请重启您的 shell。 export或者直接传递密钥 Pdf4meClient("your-api-key")在Windows系统上,请记住…… set 在 CMD 内部执行的操作不会跨会话持久化;请使用 setx 具有永久价值。

httpx.HTTPStatusError: 401 UnauthorizedAPI 密钥存在但被拒绝。请在以下位置重新生成密钥: PDF4me 仪表板 再试一次。

一段时间不活动后,首次通话速度较慢。 HTTP/2 空闲时保持连接重置。保持 Pdf4meClient 在批处理作业的整个生命周期内保持打开状态,而不是为每个文件打开一个新窗口。

asyncio.run() cannot be called from a running event loop 你已进入 Jupyter 或者使用一个已经运行事件循环的框架。 await main() 在笔记本单元格的顶层,或者将你的代码包装在框架自身的异步入口点中。