כיצד ליצור מסמכים עם מודול ההתאמה שנוצר ב-Python
Aspose.PDF FOSS עבור Python משגר חבילה משנית של תאימות בשם generated (aspose_pdf.generated) המשקפת תת-קבוצה יציבה של המשטח הראשי של API — מחלקת Document עם פעולות מחזור החיים המרכזיות, וכן UnsignedContent/UnsignedContentAbsorber ו-PdfAValidateOptions/PdfAValidationResult. היא קיימת עבור קוראים שמבקשים משטח צרים זה במפורש במקום המחלקות ברמת העל הכוללות תכונות מלאות, והמחלקות שלה אינן מיובאות אוטומטית על-ידי import aspose_pdf — עליך לייבא אותן ישירות מ-aspose_pdf.generated.*. החבילה היא Python טהורה ומותקנת באמצעות הפקודה שלהלן.
מדריך שלב-אחר-שלב
שלב 1: התקנת החבילה
התקן את חבילת 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.")שלב 2: ייבא מחלקות נדרשות
המחלקות התאימות של 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שלב 3: צור וטען מסמך
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")שלב 7: חילץ תוכן טופס ללא חתימה
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()שלב 8: בניית מכולת 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 Validation
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. המר אובייקטי יוצאי דופן או פרטי שגיאה אחרים למחרוזת (str(error)) לפני העברתם ל-add_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() מחזיר False עד ש-extract() ייקרא שוב.
האם ניתן לקרוא ל-PdfAValidateOptions.add_input יותר מפעם אחת?
כן — כל קריאה מוסיפה ערך נוסף לרשימת inputs, והיא מחזירה self, ולכן ניתן לקשר קריאות: options.add_input("a.pdf").add_input("b.pdf").
האם close() שונה מ-dispose() על ה-Document שנוצר?
לא — close() הוא כינוי ישיר שקורא ל-dispose() עם אותם ארגומנטים; כל אחד מהשמות משחרר את משאבי המסמך.