Перейти к содержимому

Справочник по Python API

SDK NextPDF для Python предоставляет два клиента, общее пространство имён методов абстрактного синтаксического дерева (AST) ast, модели Pydantic для каждого ответа, интерфейс командной строки (CLI) nextpdf и иерархию исключений из шести классов. Используйте эту страницу как справочник по общедоступным символам интерфейса прикладного программирования (API) для работы с документами в формате Portable Document Format (PDF).

Импортируйте общедоступные символы из пакета верхнего уровня:

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_url или api_key пуст.Выполняет асинхронную работу синхронно; безопасно для блокнотов и работающего цикла событий.
AsyncNextPDF(*, base_url='', api_key='', api_version='v1', backend=None)Только именованные: базовый URL, ключ API, необязательная версия API и необязательный внедряемый бэкенд.Создаёт асинхронный клиент с удалённым бэкендом, если бэкенд не внедрён.AsyncNextPDFValueError, когда base_url или api_key пуст и не передан backend.Передайте backend=, чтобы внедрить пользовательский или локальный бэкенд в тестах.
AsyncNextPDF.__aenter__()Нет.Входит в асинхронный контекст и возвращает клиент.AsyncNextPDFНе ожидается.Используйте async with AsyncNextPDF(...) as client:.
AsyncNextPDF.__aexit__(*_)Подавленные аргументы исключения.Вызывает close() при выходе из контекста.NoneНе ожидается.Освобождает транспорт, даже если тело контекста вызвало исключение.
AsyncNextPDF.close()Нет.Закрывает собственный удалённый бэкенд и освобождает пул соединений.NoneНе ожидается.Идемпотентно; внедрённые бэкенды не закрываются.

Не храните ключ API в исходном коде. Считывайте base_url и api_key из окружения (NEXTPDF_BASE_URL, NEXTPDF_API_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_start, page_range_end, token_budget.Строит полное семантическое AST для каждой страницы.AstDocumentAstNoStructTreeError, AstBuildTimeoutError, NextPDFLicenseError, QuotaExceededError.Сократите диапазон страниц, если построение завершается по тайм-ауту.
NextPDF.ast.extract_cited_text()pdf_data: bytes; именованные page_index, headings_only.Извлекает все текстовые блоки с якорями цитирования.list[CitedTextBlock]NextPDFAPIError, QuotaExceededError.Задайте headings_only=True, чтобы получить только узлы заголовков.
NextPDF.ast.extract_cited_tables()pdf_data: bytes; именованный page_range (dict с start и end).Извлекает все таблицы с якорями цитирования на уровне ячеек.ExtractCitedTablesResponseNextPDFAPIError, QuotaExceededError.Опустите page_range, чтобы просканировать весь документ.
NextPDF.ast.get_ast_node()pdf_data: bytes, node_id: str.Получает один узел по его идентификатору.GetAstNodeResponseNextPDFError, когда узел не найден.node_id имеет формат ast:{hash6}:{pageIdx}:{seq}.
NextPDF.ast.search_ast_nodes()pdf_data: bytes; именованные node_type, page_index, text_query, max_results=100.Возвращает поверхностные узлы, соответствующие фильтрам.SearchAstNodesResponseNextPDFAPIError.text_query выполняет поиск подстроки без учёта регистра.
NextPDF.ast.get_ast_diff()original_pdf_data: bytes, modified_pdf_data: bytes.Сравнивает два документа по структуре.GetAstDiffResponseNextPDFAPIError, QuotaExceededError.Сообщает о добавленных, удалённых и изменённых узлах.

Каждый асинхронный метод является сопрограммой с теми же параметрами, значениями по умолчанию, типом возвращаемого значения и режимами отказа, что и синхронный аналог. Вызывайте его с помощью await в среде выполнения asyncio.

СимволПараметрыПоведение по умолчаниюВозвращаетОшибка или завершениеПримечания
AsyncNextPDF.ast.get_document_ast()pdf_data: bytes; именованные page_range_start, page_range_end, token_budget.Строит полное семантическое AST для каждой страницы.AstDocumentAstNoStructTreeError, AstBuildTimeoutError, NextPDFLicenseError, QuotaExceededError.await для получения результата.
AsyncNextPDF.ast.extract_cited_text()pdf_data: bytes; именованные page_index, headings_only.Извлекает все текстовые блоки с якорями цитирования.list[CitedTextBlock]NextPDFAPIError, QuotaExceededError.await для получения результата.
AsyncNextPDF.ast.extract_cited_tables()pdf_data: bytes; именованный page_range.Извлекает все таблицы с якорями цитирования на уровне ячеек.ExtractCitedTablesResponseNextPDFAPIError, QuotaExceededError.await для получения результата.
AsyncNextPDF.ast.get_ast_node()pdf_data: bytes, node_id: str.Получает один узел по его идентификатору.GetAstNodeResponseNextPDFError, когда узел не найден.await для получения результата.
AsyncNextPDF.ast.search_ast_nodes()pdf_data: bytes; именованные node_type, page_index, text_query, max_results=100.Возвращает поверхностные узлы, соответствующие фильтрам.SearchAstNodesResponseNextPDFAPIError.Используйте await, чтобы получить результат.
AsyncNextPDF.ast.get_ast_diff()original_pdf_data: bytes, modified_pdf_data: bytes.Сравнивает два документа по структуре.GetAstDiffResponseNextPDFAPIError, QuotaExceededError.await для получения результата.

Используйте асинхронный клиент как менеджер контекста, чтобы выполнить два извлечения параллельно:

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. Импортируйте классы моделей из nextpdf или nextpdf.models.ast.

СимволВидКлючевые поляПримечания
AstDocumentКорень документаschema_version, source_hash, page_count, root: AstNode, estimated_tokens (свойство).Возвращается методом get_document_ast(). Принимает псевдонимы schemaVersion, sourceHash и pageCount.
AstNodeУзел дереваid, type: NodeType, page_index, bbox, text_content, attributes, children: list[AstNode], pdf_object_number, mcid.Рекурсивный узел, представляющий дерево документа.
AstNodeMetaМетаданные ответаetag, pages_processed.Неизменяемый; добавляется к ответам по узлам и поиску.
AstNodeShallowРезультат поискаid, type: NodeType, page_index, bbox, text_content, attributes, children_count.Неизменяемый; без вложенных дочерних элементов.
BoundingBoxОбъект-значениеx, y, width, height (каждое 0.01.0).Нормализованные координаты в пределах страницы.
CitationAnchorОбъект-значениеnode_id, page_index, bbox: BoundingBox, confidence, content_hash.Запись об источнике происхождения для каждого блока.
CitedTextBlockТекстовый блокtext, citation: CitationAnchor, node_type, chunk_index, depth.Каждый элемент списка extract_cited_text().
CitedTableBlockБлок таблицыtable_node_id, page_index, citation_anchor, row_count, col_count, rows.Неизменяемый; одна таблица.
CitedTableCellЯчейка таблицыrow, col, row_span, col_span, text, bbox, confidence.Неизменяемый; одна ячейка.
NodeTypeПеречислениеdocument, section, heading, paragraph, list, table, figure и другие.Строковое перечисление значений типа узла.
GetAstNodeResponseОтветnode: AstNode, meta: AstNodeMeta.Возвращается методом get_ast_node().
SearchAstNodesResponseОтветnodes: list[AstNodeShallow], total_matches, truncated, meta.Возвращается методом search_ast_nodes().
ExtractCitedTablesResponseОтветtables: list[CitedTableBlock], table_count, pages_processed.Возвращается методом extract_cited_tables().
AstDiffEntryЭлемент различийtype (added/removed/changed), node_id, node_type, page_index, text_preview.Одно изменение в наборе различий.
AstDiffSummaryИтоги различийadded_node_count, removed_node_count, changed_node_count.Сводные количества.
GetAstDiffResponseОтветoriginal_page_count, modified_page_count, summary: AstDiffSummary, diff: list[AstDiffEntry], pages_processed.Возвращается методом get_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_URL и NEXTPDF_API_KEY в окружении. Каждая команда, кроме version, требует параметры подключения. Значение PDF_PATH, равное -, считывает байты PDF из стандартного ввода.

СимволПараметрыПоведение по умолчаниюВозвращаетОшибка или завершениеПримечания
nextpdf extract textPDF_PATH; --format {json,markdown,plain}, --page, --headings-only.Выводит цитируемые текстовые блоки в формате JavaScript Object Notation (JSON).Записывает в стандартный вывод или файл --output.Код завершения 1 для любого NextPDFError.--page выбирает один индекс страницы, отсчитываемый от 0.
nextpdf extract tablesPDF_PATH; --format {json,csv}, --page-start, --page-end.Выводит таблицы в формате JSON.Записывает в стандартный вывод или файл --output.Код завершения 1 для любого NextPDFError.--format csv записывает по одному блоку значений, разделённых запятыми (CSV), для каждой таблицы.
nextpdf astPDF_PATH; --page-start, --page-end, --token-budget.Выводит полное семантическое AST в формате JSON.Записывает в стандартный вывод или файл --output.Код завершения 1 для любого NextPDFError.Используйте --token-budget, чтобы ограничить размер ответа.
nextpdf infoPDF_PATH.Выводит метаданные документа: количество страниц, версию схемы, хеш источника, оценочное число токенов и сводку по корню.Записывает JSON в стандартный вывод или файл --output.Код завершения 1 для любого NextPDFError.Лёгкая команда для проверки.
nextpdf versionНет.Выводит установленную версию SDK.Записывает в стандартный вывод.Не ожидается.Не обращается к серверу; учётные данные не требуются.
python -m nextpdf.mcpнет (считывает NEXTPDF_BASE_URL, NEXTPDF_API_KEY).Запускает сервер Model Context Protocol через стандартный input/output.Длительно работающий серверный процесс.RuntimeError, когда переменные окружения не заданы.Требует дополнительный пакет nextpdf[mcp].

Извлеките таблицы из диапазона страниц в формате значений, разделённых запятыми (CSV):

Окно терминала
nextpdf extract tables invoice.pdf --format csv --page-start 0 --page-end 2 --output tables.csv

Иерархия исключений находится в nextpdf.models.errors и повторно экспортируется из nextpdf. Перехватывайте самый конкретный класс, который ваш код может обработать, затем переходите к базовому классу. Сервер сообщает об ошибке с семантикой статусов протокола передачи гипертекста (HTTP), согласованной с Request for Comments (RFC) 9110. Каждое исключение несёт исходный status_code и, если доступно, error_code.

СимволБазовый классstatus_codeКогда возникаетПримечания
NextPDFErrorExceptionнеобязательноБазовый класс для каждой ошибки SDK.Несёт необязательный status_code. Перехватывайте его последним как резервный вариант.
NextPDFAPIErrorNextPDFErrorобязательноКонечная точка Connect вернула ошибку HTTP.Добавляет error_code.
NextPDFLicenseErrorNextPDFAPIError402Сервер требует лицензию более высокого уровня для этой функции.error_code равен license/tier-required.
QuotaExceededErrorNextPDFAPIError429Превышено ограничение частоты запросов или квота.Несёт retry_after; учитывайте его перед повторной попыткой.
AstNoStructTreeErrorNextPDFAPIError422PDF не размечен тегами, а эвристический резервный режим не включён.Включите эвристический режим или предоставьте размеченный тегами PDF.
AstBuildTimeoutErrorNextPDFAPIError504Истекло время ожидания построения AST на сервере.Сократите диапазон страниц и повторите попытку.
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. Вы можете вызывать его из блокнота или потока, где уже работает цикл событий: при обнаружении работающего цикла он передаёт сопрограмму рабочему потоку.
  • Предпочитайте форму асинхронного менеджера контекста async with AsyncNextPDF(...) as client:, чтобы пул соединений закрывался детерминированно. Когда создаёте AsyncNextPDF напрямую, вызывайте close() самостоятельно.
  • Токен типа bearer никогда не записывается в журнал и не включается в сообщения об ошибках, а проверка Transport Layer Security (TLS) включена по умолчанию. Не встраивайте учётные данные в исходный код; считывайте их из окружения или менеджера секретов.
  • Все модели являются классами Pydantic v2; несколько моделей ответов неизменяемы (immutable). Рассматривайте извлечённые блоки как значения только для чтения.
  • CLI завершается с кодом 1 для любого NextPDFError и выводит сообщение в стандартный поток ошибок. Используйте этот код завершения в конвейерах.
  • Руководство разработчика по Python SDK — архитектура, асинхронная пакетная обработка и обработка отказов.
  • Python CLI — извлечение из терминала и потоковая передача больших файлов.
  • Сервер Python MCP — предоставление инструментов извлечения агентам искусственного интеллекта (AI).
  • RFC 9110 (HTTP Semantics) и RFC 9457 (Problem Details for HTTP APIs) описывают семантику статусов и машиночитаемые тела ошибок, которые возвращает конечная точка Connect. Авторитетный текст см. в указателе RFC организации IETF.