چگونه اسناد را با ماژول سازگاری تولید شده در Python ایجاد کنیم

چگونه اسناد را با ماژول سازگاری تولید شده در Python ایجاد کنیم

Aspose.PDF FOSS برای Python یک زیرپکیج سازگاری generated (aspose_pdf.generated) را ارائه می‌دهد که زیرمجموعه‌ای پایدار از سطح اصلی API را بازتاب می‌دهد — یک کلاس Document با عملیات اصلی چرخه حیات، به‌علاوه UnsignedContent/UnsignedContentAbsorber و PdfAValidateOptions/PdfAValidationResult. این زیرپکیج برای فراخوانندگانی وجود دارد که می‌خواهند این سطح محدودتر را به‌طور صریح به‌جای کلاس‌های سطح بالای تمام‌ویژه استفاده کنند، و کلاس‌های آن به‌صورت خودکار توسط import aspose_pdf وارد نمی‌شوند — شما آن‌ها را مستقیماً از aspose_pdf.generated.* وارد می‌کنید. این بسته کاملاً Python است و با فرمان زیر نصب می‌شود.

راهنمای گام به گام

مرحله ۱: نصب بسته

پکیج Aspose.PDF FOSS را نصب کنید:

git clone https://github.com/aspose-pdf-foss/Aspose-PDF-FOSS-for-Python.git
cd Aspose-PDF-FOSS-for-Python
pip install -e .

نصب را با وارد کردن Document تولید شده و چاپ یک پیام تأیید بررسی کنید:

import aspose_pdf
from aspose_pdf.generated.document import Document
print("aspose-pdf-foss-for-python is ready.")

مرحله ۲: وارد کردن کلاس‌های مورد نیاز

کلاس‌های سازگاری generated در aspose_pdf.generated.document، aspose_pdf.generated.forms و aspose_pdf.generated.pdfa قرار دارند — آنها را به‌صورت صریح با زیرماژول وارد کنید:

import aspose_pdf
from aspose_pdf.generated.document import Document
from aspose_pdf.generated.forms import UnsignedContent, UnsignedContentAbsorber
from aspose_pdf.generated.pdfa import PdfAValidateOptions, PdfAValidationResult

مرحله ۳: ایجاد و بارگذاری یک سند

Document(source) به‌محض فراهم شدن منبع، بلافاصله بار می‌شود؛ فراخوانی Document() بدون آرگومان یک نمونهٔ خالی ایجاد می‌کند که می‌توانید بعدها با load_from آن را بارگذاری کنید. هر دو مسیر فایل، bytes یا یک جریان باینری را می‌پذیرند:

from aspose_pdf.generated.document import Document

document = Document("report.pdf")
print(f"Loaded {len(document.pages)} page(s)")

empty_doc = Document()
empty_doc.load_from("report.pdf")

مرحله ۷: استخراج محتوای فرم بدون امضا

UnsignedContentAbsorber صفحات، فیلدهای فرم و حاشیه‌نویسی‌هایی را که بخشی از امضای دیجیتال نیستند استخراج می‌کند. برای اجرای استخراج extract() را فراخوانی کنید، برای بررسی اینکه آیا اجرا شده است has_extracted() را صدا بزنید، و برای دریافت مجدد نتیجه بدون استخراج دوباره get_extracted() را استفاده کنید:

from aspose_pdf.generated.forms import UnsignedContentAbsorber

absorber = UnsignedContentAbsorber()
unsigned = absorber.extract()
print(f"Unsigned pages: {len(unsigned.pages)}")
print(f"Unsigned form fields: {len(unsigned.form_fields)}")

if absorber.has_extracted():
    same_result = absorber.get_extracted()

مرحله ۸: ساخت یک مخزن UnsignedContent به‌صورت دستی

UnsignedContent همچنین یک مخزن ساده است که می‌توانید خودتان با add_page، add_form_field و add_annotation پر کنید — هر کدام متد remove_* مربوطه را دارند، و reset() تمام سه مجموعه را به‌صورت همزمان پاک می‌کند:

from aspose_pdf.generated.forms import UnsignedContent

content = UnsignedContent()
content.add_page("page-1")
content.add_annotation("signature-placeholder")
print(content)  # UnsignedContent(pages=1, form_fields=0, annotations=1)

content.remove_annotation("signature-placeholder")
content.reset()

مرحله 9: پیکربندی و اجرای اعتبارسنجی PDF/A

PdfAValidateOptions ورودی‌ها و تنظیمات را برای یک اجرای اعتبارسنجی جمع‌آوری می‌کند. add_input(source) یک ورودی را ثبت می‌کند، set_option(key, value) گزینه‌ای نام‌گذاری‌شده را ذخیره می‌کند، و get_options() یک کپی از گزینه‌های ذخیره‌شده را برمی‌گرداند. PdfAValidationResult نتیجه را نگه می‌دارد — add_error(message) نتیجه را نامعتبر علامت‌گذاری می‌کند و به errors اضافه می‌کند، و to_dict() is_valid و errors را به عنوان یک دیکشنری ساده رندر می‌کند:

from aspose_pdf.generated.pdfa import PdfAValidateOptions, PdfAValidationResult

options = PdfAValidateOptions()
options.add_input("report.pdf")
options.set_option("pdfa_version", "1b")
print(options.get_options())

result = PdfAValidationResult()
result.add_error("Font 'Arial' is not embedded")
print(result.is_valid)   # False
print(result.to_dict())

مشکلات رایج و راه‌حل‌ها

ImportError or AttributeError هنگام دسترسی aspose_pdf.generated

زیرپکیج generated توسط import aspose_pdf دوباره صادر نمی‌شود — هر کلاس را از زیرماژول خاص خود وارد کنید، برای مثال from aspose_pdf.generated.document import Document، به جای این که انتظار داشته باشید aspose_pdf.generated.Document پس از یک import aspose_pdf ساده کار کند.

گیج کردن تولید شده Document با اصلی aspose_pdf.Document

aspose_pdf.Document (کلاس سطح-بالا که توسط import aspose_pdf دوباره صادر شده است) سطح گسترده‌تری دارد — متدهایی مانند validate_pdfa، iter_pages و redact_text را اضافه می‌کند که aspose_pdf.generated.document.Document پیاده‌سازی نکرده است. اگر متدی در Document تولید شده گم باشد، بررسی کنید که آیا به جای آن متعلق به کلاس سطح-بالای Document است یا نه.

save() raises AsposePdfException: Cannot save a disposed document

close()/dispose() وضعیت داخلی سند را به‌صورت دائمی آزاد می‌کند — یک Document که از بین رفته است نمی‌تواند پس از آن ذخیره، بهینه‌سازی یا تعمیر شود. تمام عملیات باقی‌مانده را پیش از فراخوانی close() انجام دهید، یا با یک فراخوانی جدید Document(...) از منبع بارگذاری مجدد کنید.

change_passwords raises PdfSecurityException: Document is not encrypted

change_passwords فقط رمز عبور را برای سندی که قبلاً رمزگذاری شده، چرخش می‌دهد. ابتدا encrypt(password) را فراخوانی کنید، یا پیش از تلاش برای تغییر رمز عبور، document.is_encrypted را بررسی کنید.

PdfAValidationResult.add_error raises TypeError

add_error یک آرگومان str نیاز دارد. قبل از ارسال به add_error، اشیای استثنا یا سایر جزئیات خطا را به رشته‌ای (str(error)) تبدیل کنید.

سوالات متداول

چرا aspose_pdf.generated در کنار aspose_pdf.Document اصلی وجود دارد؟

این یک زیرمجموعه باریک‌تر و ثابت از Aspose.PDF API را برای کدهای نوشته‌شده بر مبنای آن سطح کاهش‌یافته بازتاب می‌دهد. کد جدیدی که به‌طور خاص به این زیرمجموعه سازگاری نیاز ندارد، به‌طور کلی باید از aspose_pdf.Document سطح بالا استفاده کند، که عملیات بیشتری را پشتیبانی می‌کند (PDF/A تبدیل، تکرار صفحات، حذف متن، و سایر موارد).

آیا UnsignedContentAbsorber.extract() یک Document برای اسکن می‌پذیرد؟

extract() آرگومان‌های موقعیتی و کلیدواژه‌ای را می‌پذیرد که برای پر کردن مجموعه‌های pages، form_fields و annotations بازگردانده‌شدهٔ UnsignedContent استفاده می‌شوند — مجموعه‌هایی که می‌خواهید به‌صورت آرگومان‌های کلیدواژه‌ای ارائه شوند (pages=، form_fields=، annotations=) را پاس دهید.

اگر قبل از استخراج هر چیزی، reset() را روی UnsignedContentAbsorber صدا بزنم، چه اتفاقی می‌افتد؟

هر نتیجه استخراج‌شده قبلی را پاک می‌کند. سپس get_extracted() None را برمی‌گرداند و has_extracted() تا زمانی که extract() دوباره فراخوانی شود، False را برمی‌گرداند.

آیا می‌توان PdfAValidateOptions.add_input را بیش از یک بار فراخوانی کرد؟

بله — هر فراخوانی یک ورودی دیگر به فهرست inputs اضافه می‌کند و self را برمی‌گرداند، بنابراین می‌توان فراخوانی‌ها را زنجیرو کرد: options.add_input("a.pdf").add_input("b.pdf").

آیا close() با dispose() در Document تولید شده متفاوت است؟

نه — close() یک نام مستعار مستقیم است که dispose() را با همان آرگومان‌ها فراخوانی می‌کند؛ هر دو نام منابع سند را آزاد می‌کنند.

همچنین ببینید:

 فارسی