跳到內容

Python API 參考資料

NextPDF Python 軟體開發套件(SDK)對外提供兩個用戶端、兩者共用的單一 ast 方法命名空間、每個回應所使用的一組定型 Pydantic 模型、一個 nextpdf 命令列介面(CLI),以及一個六類別的例外階層。本頁提供上述每個符號的參考說明。

從頂層套件匯入公開介面:

from nextpdf import (
AsyncNextPDF,
NextPDF,
AstBuildTimeoutError,
AstNoStructTreeError,
NextPDFAPIError,
NextPDFError,
NextPDFLicenseError,
QuotaExceededError,
)

每個擷取方法都以原始 PDF 位元組(bytes)作為第一個位置引數,並回傳定型的 Pydantic 模型。其後接著僅限關鍵字的選項。同步的 NextPDF.ast.* 方法與非同步的 AsyncNextPDF.ast.* 方法具有完全相同的簽章。非同步方法是需要以 await 等待的協程。

同步的 NextPDF 用戶端會包裝非同步用戶端,並將每個協程執行至完成。非同步的 AsyncNextPDF 用戶端同時也是非同步情境管理器。建議採用情境管理器形式,讓底層傳輸層能以可確定的方式關閉。

符號參數預設行為回傳拋出或失敗於備註
NextPDF(*, base_url, api_key, api_version='v1')僅限關鍵字的基底 URL、API 金鑰,以及選用的 API 版本。建構以遠端為後端的同步用戶端。NextPDFValueError,於 base_urlapi_key 為空時拋出。這些方法會以同步方式執行非同步工作,在 notebook 與正在執行的事件迴圈中皆可安全使用。
AsyncNextPDF(*, base_url='', api_key='', api_version='v1', backend=None)僅限關鍵字的基底 URL、API 金鑰、選用的 API 版本,以及選用的注入後端。未注入後端時,建構以遠端為後端的非同步用戶端。AsyncNextPDFValueError,於 base_urlapi_key 為空且未提供 backend 時拋出。傳入 backend= 可在測試中注入自訂或本機後端。
AsyncNextPDF.__aenter__()無。進入非同步情境並回傳用戶端。AsyncNextPDF無預期項目。使用 async with AsyncNextPDF(...) as client:
AsyncNextPDF.__aexit__(*_)被抑制的例外引數。在情境結束時呼叫 close()None無預期項目。即使主體拋出例外,也會釋放傳輸層資源。
AsyncNextPDF.close()無。關閉自有的遠端後端並釋放連線池。None無預期項目。具冪等性;注入的後端不會被關閉。

請勿將 API 金鑰留在原始碼中。請從環境變數(NEXTPDF_BASE_URLNEXTPDF_API_KEY)或祕密管理器讀取 base_urlapi_key

import os
from nextpdf import AsyncNextPDF
async def extract(pdf_bytes: bytes) -> int:
"""Return the page count of a PDF using the async client as a context manager."""
base_url = os.environ["NEXTPDF_BASE_URL"]
api_key = os.environ["NEXTPDF_API_KEY"]
async with AsyncNextPDF(base_url=base_url, api_key=api_key) as client:
document = await client.ast.get_document_ast(pdf_bytes)
return document.page_count
符號參數預設行為回傳拋出或失敗於備註
NextPDF.ast.get_document_ast()pdf_data: bytes;關鍵字 page_range_startpage_range_endtoken_budget為每一頁建構完整的語意 AST。AstDocumentAstNoStructTreeErrorAstBuildTimeoutErrorNextPDFLicenseErrorQuotaExceededError建構逾時時,請縮小頁面範圍。
NextPDF.ast.extract_cited_text()pdf_data: bytes;關鍵字 page_indexheadings_only擷取每個帶有引用錨點的文字區塊。list[CitedTextBlock]NextPDFAPIErrorQuotaExceededError設定 headings_only=True 即可只取得標題節點。
NextPDF.ast.extract_cited_tables()pdf_data: bytes;關鍵字 page_range(為 dict,含 startend)。擷取每個帶有儲存格層級引用錨點的表格。ExtractCitedTablesResponseNextPDFAPIErrorQuotaExceededError省略 page_range 即可掃描整份文件。
NextPDF.ast.get_ast_node()pdf_data: bytesnode_id: str依識別碼取得單一節點。GetAstNodeResponseNextPDFError,於找不到節點時拋出。node_id 的格式為 ast:{hash6}:{pageIdx}:{seq}
NextPDF.ast.search_ast_nodes()pdf_data: bytes;關鍵字 node_typepage_indextext_querymax_results=100回傳符合篩選條件的淺層節點。SearchAstNodesResponseNextPDFAPIErrortext_query 會進行不區分大小寫的子字串比對。
NextPDF.ast.get_ast_diff()original_pdf_data: bytesmodified_pdf_data: bytes在結構層級比較兩份文件。GetAstDiffResponseNextPDFAPIErrorQuotaExceededError回報新增、移除與變更的節點。

每個非同步方法都是協程,其參數、預設值、回傳型別與失敗模式皆與上方對應的同步方法相同。在 asyncio 執行環境中,請以 await 呼叫。

符號參數預設行為回傳拋出或失敗於備註
AsyncNextPDF.ast.get_document_ast()pdf_data: bytes;關鍵字 page_range_startpage_range_endtoken_budget為每一頁建構完整的語意 AST。AstDocumentAstNoStructTreeErrorAstBuildTimeoutErrorNextPDFLicenseErrorQuotaExceededErrorawait 取得結果。
AsyncNextPDF.ast.extract_cited_text()pdf_data: bytes;關鍵字 page_indexheadings_only擷取每個帶有引用錨點的文字區塊。list[CitedTextBlock]NextPDFAPIErrorQuotaExceededErrorawait 取得結果。
AsyncNextPDF.ast.extract_cited_tables()pdf_data: bytes;關鍵字 page_range擷取每個帶有儲存格層級引用錨點的表格。ExtractCitedTablesResponseNextPDFAPIErrorQuotaExceededErrorawait 取得結果。
AsyncNextPDF.ast.get_ast_node()pdf_data: bytesnode_id: str依識別碼取得單一節點。GetAstNodeResponseNextPDFError,於找不到節點時拋出。await 取得結果。
AsyncNextPDF.ast.search_ast_nodes()pdf_data: bytes;關鍵字 node_typepage_indextext_querymax_results=100回傳符合篩選條件的淺層節點。SearchAstNodesResponseNextPDFAPIErrorawait 取得結果。
AsyncNextPDF.ast.get_ast_diff()original_pdf_data: bytesmodified_pdf_data: bytes在結構層級比較兩份文件。GetAstDiffResponseNextPDFAPIErrorQuotaExceededErrorawait 取得結果。

以情境管理器形式使用非同步用戶端,並行批次執行兩項擷取:

import asyncio
from nextpdf import AsyncNextPDF
async def extract_pair(first: bytes, second: bytes) -> None:
"""Extract two PDFs concurrently with one shared async client."""
async with AsyncNextPDF(base_url="https://connect.example.com", api_key="set-from-secret") as client:
text_blocks, tables = await asyncio.gather(
client.ast.extract_cited_text(first),
client.ast.extract_cited_tables(second),
)
print(f"text blocks: {len(text_blocks)}; tables: {tables.table_count}")

每個回應都是 Pydantic 模型。你可以從 nextpdfnextpdf.models.ast 匯入這些模型類別。

符號種類主要欄位備註
AstDocument文件根節點schema_versionsource_hashpage_countroot: AstNodeestimated_tokens(屬性)。get_document_ast() 回傳。接受 schemaVersionsourceHashpageCount 別名。
AstNode樹狀節點idtype: NodeTypepage_indexbboxtext_contentattributeschildren: list[AstNode]pdf_object_numbermcid承載文件樹的遞迴節點。
AstNodeMeta回應中繼資料etagpages_processed已凍結;附加於節點與搜尋回應上。
AstNodeShallow搜尋命中idtype: NodeTypepage_indexbboxtext_contentattributeschildren_count已凍結;不含深層子節點。
BoundingBox值物件xywidthheight(各為 0.01.0)。正規化的頁面座標。
CitationAnchor值物件node_idpage_indexbbox: BoundingBoxconfidencecontent_hash每個區塊上的 provenance(來源資訊)記錄。
CitedTextBlock文字區塊textcitation: CitationAnchornode_typechunk_indexdepth位於 extract_cited_text() 清單中的每個項目。
CitedTableBlock表格區塊table_node_idpage_indexcitation_anchorrow_countcol_countrows已凍結;表示單一表格。
CitedTableCell表格儲存格rowcolrow_spancol_spantextbboxconfidence已凍結;表示單一儲存格。
NodeType列舉documentsectionheadingparagraphlisttablefigure,以及其他類型。節點類型值的字串列舉。
GetAstNodeResponse回應node: AstNodemeta: AstNodeMetaget_ast_node() 回傳。
SearchAstNodesResponse回應nodes: list[AstNodeShallow]total_matchestruncatedmetasearch_ast_nodes() 回傳。
ExtractCitedTablesResponse回應tables: list[CitedTableBlock]table_countpages_processedextract_cited_tables() 回傳。
AstDiffEntry差異項目typeadded/removed/changed)、node_idnode_typepage_indextext_preview差異中的一項變更。
AstDiffSummary差異總計added_node_countremoved_node_countchanged_node_count彙總計數。
GetAstDiffResponse回應original_page_countmodified_page_countsummary: AstDiffSummarydiff: list[AstDiffEntry]pages_processedget_ast_diff() 回傳。

從擷取出的文字區塊讀取引用錨點:

from nextpdf import CitedTextBlock
def describe(block: CitedTextBlock) -> str:
"""Render a text block with its page index and confidence."""
anchor = block.citation
return f"[page {anchor.page_index}, confidence {anchor.confidence:.2f}] {block.text[:80]}"

你可以從終端機執行 nextpdf 指令來擷取內容。請傳入 --base-url--api-key,或在環境變數中設定 NEXTPDF_BASE_URLNEXTPDF_API_KEY。除了 version 以外,每個指令都需要連線設定。當 PDF_PATH- 時,會從標準輸入讀取 PDF 位元組。

符號參數預設行為回傳拋出或失敗於備註
nextpdf extract textPDF_PATH--format {json,markdown,plain}--page--headings-only以 JSON 輸出帶有引用的文字區塊。寫到標準輸出或 --output 指定的檔案。發生任何 NextPDFError 時,以結束代碼 1 結束。--page 選擇單一以 0 為起始的頁面 Index(索引)。
nextpdf extract tablesPDF_PATH--format {json,csv}--page-start--page-end以 JSON 輸出表格。寫到標準輸出或 --output 指定的檔案。發生任何 NextPDFError 時,以結束代碼 1 結束。--format csv 會為每個表格各寫出一個 CSV 區塊。
nextpdf astPDF_PATH--page-start--page-end--token-budget以 JSON 輸出完整的語意 AST。寫到標準輸出或 --output 指定的檔案。發生任何 NextPDFError 時,以結束代碼 1 結束。使用 --token-budget 限制回應大小。
nextpdf infoPDF_PATH輸出文件中繼資料:頁數、結構描述版本、來源雜湊、估計權杖數,以及根節點摘要。將 JSON 寫到標準輸出或 --output 指定的檔案。發生任何 NextPDFError 時,以結束代碼 1 結束。輕量的檢視指令。
nextpdf version無。印出已安裝的 SDK 版本。寫到標準輸出。無預期項目。不會連線伺服器;不需要任何憑證。
python -m nextpdf.mcp無(讀取 NEXTPDF_BASE_URLNEXTPDF_API_KEY)。在標準 input/output 上執行 Model Context Protocol 伺服器。長時間執行的伺服器處理程序。RuntimeError,於環境變數未設定時拋出。需要 nextpdf[mcp] 額外套件。

從某個頁面範圍擷取表格並輸出為逗號分隔值(CSV):

Terminal window
nextpdf extract tables invoice.pdf --format csv --page-start 0 --page-end 2 --output tables.csv

例外階層位於 nextpdf.models.errors,並從 nextpdf 重新匯出。請先攔截你的程式碼能處理的最具體類別,再退回到基礎類別。伺服器以符合 RFC 9110 的 HTTP 狀態語意表示失敗。每個例外都帶有來源 status_code,並在適用時帶有 error_code

符號基礎類別status_code何時觸發備註
NextPDFErrorException選填所有 SDK 錯誤的基礎類別。帶有選用的 status_code。作為備援,最後再攔截。
NextPDFAPIErrorNextPDFError必填Connect 端點回傳了 HTTP 錯誤。額外帶有 error_code
NextPDFLicenseErrorNextPDFAPIError402該功能在伺服器上需要更高層級的授權。error_codelicense/tier-required
QuotaExceededErrorNextPDFAPIError429超過速率限制或配額。帶有 retry_after;重試前請遵守該值。
AstNoStructTreeErrorNextPDFAPIError422該 PDF 未加標籤,且未啟用啟發式備援。啟用啟發式模式,或提供已加標籤的 PDF。
AstBuildTimeoutErrorNextPDFAPIError504AST 建構在伺服器上逾時。縮小頁面範圍後重試。
from nextpdf import (
NextPDF,
AstBuildTimeoutError,
NextPDFAPIError,
NextPDFError,
QuotaExceededError,
)
def extract_text(client: NextPDF, pdf_bytes: bytes) -> int:
"""Extract cited text, handling the most specific failures first."""
try:
blocks = client.ast.extract_cited_text(pdf_bytes)
except QuotaExceededError as error:
raise RuntimeError(f"Quota exceeded (retry after {error.retry_after}s)") from error
except AstBuildTimeoutError as error:
raise RuntimeError("AST build timed out; reduce the page range") from error
except NextPDFAPIError as error:
raise RuntimeError(f"API error {error.status_code}: {error}") from error
except NextPDFError as error:
raise RuntimeError(f"SDK error: {error}") from error
return len(blocks)
  • 同步的 NextPDF 用戶端會將每個呼叫委派給 AsyncNextPDF。由於偵測到正在執行的迴圈時會把協程分派到工作執行緒,因此即使在 notebook 或已執行事件迴圈的執行緒中呼叫也很安全。
  • 建議採用非同步情境管理器形式 async with AsyncNextPDF(...) as client:,讓連線池能以可確定的方式關閉。當你直接建構 AsyncNextPDF 時,請自行呼叫 close()
  • 持有人權杖(bearer token)絕不會被記錄或放進錯誤訊息,且預設啟用傳輸層安全性(TLS)驗證。請勿將憑證內嵌在原始碼中;請從環境變數或祕密管理器讀取。
  • 所有模型都是 Pydantic v2 類別;有數個回應模型是凍結的(不可變)。請把擷取出的區塊視為唯讀值。
  • 發生任何 NextPDFError 時,CLI 會以結束代碼 1 結束,並將訊息印到標準錯誤。請把該結束代碼接入你的管線。
  • Python SDK 開發者指南 — 架構、非同步批次處理與失敗處理。
  • Python CLI — 終端機擷取與大型檔案的串流處理。
  • Python MCP 伺服器 — 將擷取工具開放給 AI Agent(代理)使用。
  • RFC 9110(HTTP 語意)與 RFC 9457(HTTP API 的問題詳情)描述 Connect 端點回傳的狀態語意與機器可讀的錯誤主體。權威文字請參閱 IETF RFC 索引。