چه‌ جدیدی در GroupDocs.Signature for Python 26.1 (ژانویه 2026) است

شناسه دسته‌بندی خلاصه
SIGNATURENET‑5528 ویژگی پشتیبانی و اعتبارسنجی امضای دیجیتالی تصویر (قراردادن استگنوگرافی در بیت‌های کم‌اهمیت PNG & JPG).
SIGNATURENET‑5445 ویژگی رندر سازگار تطبیقی برای پیش‌نمایش امضای بارکد و QR Code – کنترل صریح عرض/ارتفاع.
SIGNATURENET‑5479 ویژگی پشتیبانی از چرخش برای پیش‌نمایش تصاویر بارکد و QR Code.
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 پیکسل کار می‌کند.

امضای یک تصویر

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 Code

اکنون توسعه‌دهندگان می‌توانند 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)

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) دریافت کند که امضاها را قبل از مراحل پردازش سنگین فیلتر می‌کند. این کار مصرف حافظه را کاهش و سرعت عملیات دسته‌ای را بالا می‌برد.

جستجو با پیش‌شرط

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() دیگر هنگام پردازش فایل‌های Microsoft Word (.doc) در لینوکس استثنای TypeInitializerException را پرتاب نمی‌کند و عملکرد پیش‌نمایش跨‑پلتفرمی بازگردانده شد.


دستورهای ارتقاء

pip install --upgrade groupdocs-signature-net

نکته: نام بسته groupdocs-signature-net برای لایهٔ wrapper پایتون‑از‑راه‑.NET استفاده می‌شود.


منابع


در انتظار انتشارهای آینده بمانید و برای نکات عملکردی و راهنمایی‌های بهترین روش‌ها، به وبلاگ رسمی نگاهی بیندازید.