מה חדש ב-GroupDocs.Signature for Python 26.1 (ינואר 2026)

ID קטגוריה סיכום
SIGNATURENET‑5528 תכונה תמיכה בחתימה דיגיטלית של תמונה ולידציה (הטמעת LSB סטגנוגרפית עבור PNG & JPG).
SIGNATURENET‑5445 תכונה עיבוד רינדור מותאם לתצוגות מקדימות של חתימות ברקוד ו‑QR – שליטה מפורשת ברוחב/גובה.
SIGNATURENET‑5479 תכונה תמיכה בסיבוב בתמונות מקדימות של ברקוד ו‑QR.
SIGNATURENET‑5478 תכונה הוספת טיפול בפורמטים APNG ו‑TGA כחתימות מבוססות תמונה.
SIGNATURENET‑5500 שיפור אופטימיזציית שאילתות בסגנון LINQ לחיפוש ולווידוא חתימות (סינון על‑פי תנאי).
SIGNATURENET‑5480 שיפור תמיכה בשקיפות רקע לתצוגות מקדימות של ברקוד/QR.
SIGNATURENET‑5477 שיפור תמיכה בתמונת שכבה עליונה לחתימות דיגיטליות עם צבע רקע (דגל foreground‑image).
SIGNATURENET‑5422 שיפור הסרת אלגוריתמי הצפנה לא בטוחים (RC2, DES, TripleDES ומצבי AES חלשים).
SIGNATURENET‑5555 🐞 תיקון באג תיקון חריגת GeneratePreview() בעת יצירת קבצי DOC בלינוקס.

להלן סיור טכני קצר על השינויים שהכי משפיעים.

1. חתימה דיגיטלית של תמונה (סטגנוגרפיה)

  • החתימות מוסתרות בביטים הפחות משמעותיים של פיקסלי PNG/JPG.
  • מוגנת בסיסמה, תואמת למבני זרמים, ופועלת עם כל גודל תמונה ≥ 8 × 8 px.

חתימת תמונה

import groupdocs.signature as gs
import groupdocs.signature.options as gso

input_file  = "image.png"
output_file = "signed_image.png"
password    = "MySecurePassword123"

# Sign the image
with gs.Signature(input_file) as signature:
    sign_options = gso.ImageDigitalSignOptions()
    sign_options.password = password

    sign_result = signature.sign(output_file, sign_options)

    if sign_result.succeeded and len(sign_result.succeeded) > 0:
        print("Image signed successfully!")
        print(f"Signatures added: {len(sign_result.succeeded)}")

וידוא תמונה חתומה

import groupdocs.signature as gs
import groupdocs.signature.options as gso

signed_file = "signed_image.png"
password    = "MySecurePassword123"

with gs.Signature(signed_file) as signature:
    verify_options = gso.ImageDigitalVerifyOptions()
    verify_options.password = password
    verify_options.detection_threshold_percent = 75  # optional 0‑100%

    verify_result = signature.verify(verify_options)

    if verify_result.is_valid:
        print("Digital signature is valid!")
        print(f"Verified signatures: {len(verify_result.succeeded)}")
    else:
        print("Digital signature is invalid or not found.")

ולידציה מתקדמת (חילוץ מלא של הנתונים)

with gs.Signature("signed_image.png") as signature:
    verify_options = gso.ImageDigitalVerifyOptions()
    verify_options.password = "MySecurePassword123"
    verify_options.use_full_data_extraction = True
    verify_options.detection_threshold_percent = 85

    verify_result = signature.verify(verify_options)

    if verify_result.is_valid and verify_options.detected_probability is not None:
        print(f"Signature detected with {verify_options.detected_probability}% probability")

2. רינדור מותאם לתצוגות מקדימות של ברקוד & קוד QR

מפתחים יכולים כעת לציין במדויק width ו‑height ליצירת תצוגה מקדימה, ולהימנע מחוסר עקביות של “גודל אוטומטי”.

import groupdocs.signature as gs
import groupdocs.signature.options as gso
import uuid

# QR code options
qr_sign_options = gso.QrCodeSignOptions("GROUP DOCS", gs.QrCodeTypes.QR)
qr_sign_options.width  = 250
qr_sign_options.height = 270
qr_sign_options.fore_color = gs.Color.red
qr_sign_options.code_text_alignment = gs.CodeTextAlignment.BELOW
qr_sign_options.text = "GROUP DOCS"

# Preview generation
preview_options = gso.PreviewSignatureOptions(
    qr_sign_options,
    create_signature_stream,   # user‑provided delegate
    release_signature_stream   # user‑provided delegate
)
preview_options.signature_id   = str(uuid.uuid4())
preview_options.preview_format = gso.PreviewSignatureOptions.PreviewFormats.PNG

gs.Signature.generate_signature_preview(preview_options)

תצוגה מקדימה מותאמת של QR

3. תמיכת סיבוב בתצוגות מקדימות של ברקוד & QR

הגדר rotation_angle (במעלות) באפשרויות הברקוד/QR כדי לקבל תצוגה מקדימה מסובבת.

import groupdocs.signature as gs
import groupdocs.signature.options as gso
import uuid

barcode_sign_options = gso.BarcodeSignOptions("GROUP DOCS", gs.BarcodeTypes.MaxiCode)
barcode_sign_options.width          = 400
barcode_sign_options.height         = 400
barcode_sign_options.fore_color     = gs.Color.red
barcode_sign_options.code_text_alignment = gs.CodeTextAlignment.BELOW
barcode_sign_options.text           = "GROUP DOCS"
barcode_sign_options.rotation_angle = 45   # rotate 45°

preview_options = gso.PreviewSignatureOptions(
    barcode_sign_options,
    create_signature_stream,
    release_signature_stream
)
preview_options.signature_id   = str(uuid.uuid4())
preview_options.preview_format = gso.PreviewSignatureOptions.PreviewFormats.PNG

gs.Signature.generate_signature_preview(preview_options)

ברקוד סיבוב

4. תמיכה בפורמטים חדשים – APNG & TGA

קבצי APNG (PNG מונפש) ו‑TGA (Targa) ניתנים כעת לשימוש כחתימות תמונה, להוספה, תצוגה מקדימה וולידציה בדיוק כמו PNG/JPG.

5. שקיפות רקע לתצוגות מקדימות של ברקוד/QR

הגדר את המאפיין transparency (0 – 1) באפשרויות הברקוד/QR ליצירת תצוגה עם קנבס שקוף.

barcode_sign_options = gso.BarcodeSignOptions("GROUP DOCS", gs.BarcodeTypes.Codabar)
barcode_sign_options.width  = 400
barcode_sign_options.height = 400
barcode_sign_options.fore_color = gs.Color.red
barcode_sign_options.code_text_alignment = gs.CodeTextAlignment.BELOW
barcode_sign_options.text = "GROUP DOCS"
barcode_sign_options.transparency = 0.5   # 50 % transparent background

preview_options = gso.PreviewSignatureOptions(
    barcode_sign_options,
    create_signature_stream,
    release_signature_stream
)
preview_options.signature_id = str(uuid.uuid4())
preview_options.preview_format = gso.PreviewSignatureOptions.PreviewFormats.PNG

gs.Signature.generate_signature_preview(preview_options)

ברקוד עם רקע שקוף

6. תמיכת תמונת שכבה עליונה לחתימות דיגיטליות

PdfDigitalSignatureAppearance מכבד כעת תמונת שכבה עליונה וגם צבע רקע ללא כיסוי התמונה. שלוט על סדר השכבות דרך SignatureCustomAppearance.IsForegroundImage.

import groupdocs.signature as gs
import groupdocs.signature.options as gso

signature_image_path = "signature.png"
certificate_path      = "JohnSmithCertificate.pfx"

input_pdf  = "SampleDocument.pdf"
output_pdf = "SignedDocument.pdf"

with gs.Signature(input_pdf) as signature:
    sign_options = gso.DigitalSignOptions(certificate_path)
    sign_options.password = "1234567890"
    sign_options.reason   = "Document approval"
    sign_options.contact  = "John Smith"
    sign_options.location = "Head Office"

    # Visible signature placement
    sign_options.visible = True
    sign_options.left    = 350
    sign_options.top     = 100
    sign_options.width   = 200
    sign_options.height  = 70
    sign_options.image_file_path = signature_image_path

    appearance = gso.PdfDigitalSignatureAppearance()
    appearance.foreground = gs.Color.from_argb(50, gs.Color.brown)
    appearance.font_family_name = "Times New Roman"
    appearance.font_size = 12
    appearance.background = gs.Color.from_argb(50, gs.Color.light_gray)
    appearance.is_foreground_image = True   # image on top of text

    sign_options.appearance = appearance

    sign_result = signature.sign(output_pdf, sign_options)

    print(f"\nDocument signed successfully with {len(sign_result.succeeded)} signature(s).")
    print(f"Signed file saved at: {output_pdf}")

תמונת שכבה עליונה

7. חיזוק אבטחה – הסרת אלגוריתמים לא בטוחים

RC2, DES, TripleDES ומצבי AES חלשים הוסרו מתוך ערמת הקריפטוגרפיה. כעת доступны רק אלגוריתמים מודרניים המאושרים על‑ידי NIST, מה שמשפר את רמת האבטחה של המסמכים החתומים כברירת מחדל.

8. אופטימיזציית שאילתות בסגנון LINQ

כעת ניתן להעביר פונקציות תנאי (predicate) ל‑search ו‑verify, המסננות חתימות לפני שלבי העיבוד הכבדים. הדבר מצמצם שימוש בזיכרון ומאיץ פעולות באצוות.

חיפוש עם תנאי

import groupdocs.signature as gs
import groupdocs.signature.options as gso
import groupdocs.signature.domain as gsd

with gs.Signature("document.pdf") as signature:
    search_options = [gso.TextSearchOptions()]

    # Keep only text signatures that contain the word "Approved"
    result = signature.search(search_options,
        lambda sig: isinstance(sig, gsd.TextSignature) and "Approved" in sig.text)

    for sig in result.signatures:
        print(f"Found: {sig.text}")

ולידציה עם תנאי

with gs.Signature("signed_document.pdf") as signature:
    verify_options = gso.TextVerifyOptions("John Smith")

    # Verify only signatures on page 1
    result = signature.verify(verify_options,
        lambda sig: sig.page_number == 1)

    print(f"Found {len(result)} verified signatures on page 1")

9. תיקון קריסה בתצוגת DOC בלינוקס

GeneratePreview() כבר לא זורק TypeInitializerException בעת עיבוד קבצי Microsoft Word (.doc) בלינוקס, מה שמחזיר את הפונקציונליות המולטיפלטפורמת של תצוגה מקדימה.


הוראות שדרוג

pip install --upgrade groupdocs-signature-net

הערה: שם החבילה groupdocs-signature-net משמש לעטיפה של Python‑via‑.NET.


משאבים


הישארו מעודכנים עם הגרסאות הבאות ועקבו אחרי הבלוג הרשמי לקבלת טיפים לביצועים והמלצות לשימוש מיטבי.