تخطَّ إلى المحتوى

مرجع واجهة برمجة التطبيقات بلغة Python

يوفِّر طقم تطوير البرامج (⁨SDK⁩) بلغة ⁨Python⁩ من ⁨NextPDF⁩ عميلَين، ومساحة أسماء مشتركة واحدة لدوال شجرة البنية المجردة (⁨AST⁩) باسم ast، ونماذج ⁨Pydantic⁩ لكل استجابة، وواجهة سطر أوامر (⁨CLI⁩) باسم nextpdf، وتسلسلًا هرميًا للاستثناءات يتألف من ست فئات. استخدم هذه الصفحة مرجعًا لرموز واجهة برمجة التطبيقات (⁨API⁩) العامة التي تتعامل مع مستندات تنسيق المستندات المحمولة (⁨PDF⁩).

استورد الرموز العامة من الحزمة ذات المستوى الأعلى:

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

تتلقى كل دالة استخراج بايتات ⁨PDF⁩ الخام (bytes) بوصفها الوسيط الموضعي الأول، وتُعيد نموذج ⁨Pydantic⁩ مُحدَّد النوع. مرِّر الخيارات كوسائط مفتاحية فقط. تتشارك دوال NextPDF.ast.* المتزامنة ودوال AsyncNextPDF.ast.* غير المتزامنة التواقيع نفسها. الدوال غير المتزامنة إجراءات مشتركة (⁨coroutines⁩)؛ استدعِها بـ 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

دوال ⁨AST⁩ المتزامنة — NextPDF.ast.*

قسم بعنوان «دوال ⁨AST⁩ المتزامنة — NextPDF.ast.*»
الرمزالمعاملاتالسلوك الافتراضيالقيمة المُعادةيرمي أو يفشل بـملاحظات
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.يُبلِّغ عن العُقد المُضافة والمحذوفة والمُغيَّرة.

دوال ⁨AST⁩ غير المتزامنة — AsyncNextPDF.ast.*

قسم بعنوان «دوال ⁨AST⁩ غير المتزامنة — AsyncNextPDF.ast.*»

كل دالة غير متزامنة إجراء مشترك (⁨coroutine⁩)، ولها المعاملات والقيم الافتراضية ونوع الإعادة وأنماط الفشل نفسها مثل نظيرتها المتزامنة. استدعِها بـ 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/changednode_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⁩ (⁨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).يُشغِّل خادم بروتوكول سياق النموذج (⁨MCP⁩) عبر الإدخال/الإخراج القياسي — ⁨input/output.⁩عملية خادم طويلة التشغيل.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. التقط أكثر الفئات تحديدًا التي يمكن لشيفرتك معالجتها، ثم تراجَع إلى الفئة الأساسية. يُبلِّغ الخادم عن الفشل وفق دلالات حالة بروتوكول نقل النص التشعبي (⁨HTTP⁩) المتوافقة مع طلب التعليقات (⁨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؛ التزم به قبل إعادة المحاولة.
AstNoStructTreeErrorNextPDFAPIError422ملف ⁨PDF⁩ غير موسوم، والحل الاحتياطي الاستدلالي غير مُمكَّن.مكِّن الوضع الاستدلالي أو وفِّر ملف ⁨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⁩) أبدًا ولا يُدرَج في رسائل الأخطاء، ويكون التحقق من أمان طبقة النقل (⁨TLS⁩) مُمكَّنًا افتراضيًا. لا تُضمِّن بيانات الاعتماد في المصدر؛ بل اقرأها من البيئة أو من مدير أسرار.
  • جميع النماذج فئات ⁨Pydantic v2⁩؛ وعدة نماذج استجابة مُجمَّدة (غير قابلة للتغيير). تعامَل مع الكتل المُستخرَجة كقيم للقراءة فقط.
  • تنهي واجهة سطر الأوامر التنفيذ برمز الحالة 1 لأي NextPDFError وتطبع الرسالة إلى الخطأ القياسي. راعِ رمز الخروج هذا في خطوط الأنابيب.