Introduction

קונסולידציית חשבוניות היא זרימת עבודה המשלבת מספר מסמכים פיננסיים למסמך PDF יחיד באמצעות GroupDocs.Merger for Python. צוותי הכספים לעיתים קרובות צריכים לשלוח חשבונית יחד עם תעודות משלוח, דוחות שירות ותנאי אחריות, אך חיבור קבצים באופן ידני גורם לטעויות ובזבוז זמן. GroupDocs.Merger מאוטומט את התהליך, מבטיח שכל קובץ מצורף בסדר הנכון, אפשרות לאבטחה, ונמסר כ‑PDF נקי אחד.

בהדרכה זו תראו כיצד:

  • למזג חשבונית PDF רגילה עם כל מספר של קבצים נלווים.
  • להתמודד עם פורמטים מעורבים כגון תמונות JPG וחוזים DOCX.
  • לפתוח חשבונית מוגנת בסיסמה, להוסיף קבצים מצורפים וליישם הצפנה מחדש.
  • לכלול רק דפים נבחרים מצרופות גדולות כדי לשמור על חבילה סופית קומפקטית.

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

When does it make sense to merge a password‑protected invoice with other documents?

חברות רבות מצפינות חשבוניות במנוחה כדי לעמוד בדרישות ציות. כאשר יש לשלוח את החשבונית ללקוח יחד עם קבצים מצורפים שאינם מוגנים (קבלות, תנאים, תמונות), יש להסיר את הסיסמה המקורית לפני המיזוג ולאחר מכן להחיל אותה מחדש על החבילה הסופית. GroupDocs.Merger מאפשרת לספק את סיסמת הפתיחה דרך LoadOptions, להצטרף לקבצים הנוספים, ולבסוף להגן על קובץ ה‑PDF הממוזג באמצעות AddPasswordOptions. כך נשמרת רמת הסודיות תוך אספקת מסמך יחיד וקל לפתיחה.

Prerequisites

  • Python 3.8+ (דרך גשר .NET)
  • GroupDocs.Merger for Python – התקנה עם:
pip install groupdocs-merger
  • קובץ PDF של חשבונית ראשית (invoice.pdf) ורשימת נתיבי קבצים מצורפים.
  • (אופציונלי) סיסמאות לחשבונית המקורית ול‑PDF הפלט.

Step 1: Basic Consolidation of PDF Attachments

המקרה הפשוט ביותר הוא מיזוג חשבונית PDF עם קבצי PDF אחרים, תמונות או קבצי Word. ה‑API ממיר אוטומטית קלטים שאינם PDF ל‑PDF לפני ההצטרפות.

import groupdocs_merger as gm

# Paths to source files
invoice = "invoice.pdf"
attachments = ["delivery_note.pdf", "service_report.pdf"]
output = "billing_package.pdf"

with gm.Merger(invoice) as merger:
    for path in attachments:
        merger.join(path)  # Normalises each file to PDF and appends it
    merger.save(output)

Key points:

  • gm.Merger נוצר עם המסמך הראשי (החשבונית).
  • join() מקבל כל פורמט נתמך; הספרייה מטפלת בהמרה.
  • save() כותב את קובץ ה‑PDF הממוזג לנתיב שצוין.

Step 2: Consolidating Mixed‑Format Attachments

חבילות חשבוניות במציאות כוללות לעיתים תמונות סרוקות (JPG) וחוזים משפטיים (DOCX). הקוד זהה עובד מכיוון ש‑GroupDocs.Merger מנרמל כל קובץ מצורף ל‑PDF בזמן הריצה.

attachments = ["receipt.jpg", "warranty_terms.docx", "extra_clause.pdf"]
output = "billing_mixed.pdf"

with gm.Merger(invoice) as merger:
    for path in attachments:
        merger.join(path)  # JPG and DOCX are converted to PDF automatically
    merger.save(output)

Why it matters: המרת כל הקבצים ל‑PDF מבטלת את הצורך שהמקבל יסתכל במגוון מציגים, ומספק חוויה חלקה.

Step 3: Handling Password‑Protected Invoices

אם החשבונית מוצפנת, יש לספק את הסיסמה דרך LoadOptions. לאחר המיזוג ניתן להחיל סיסמה חדשה על קובץ ה‑PDF הסופי באמצעות AddPasswordOptions.

import io

invoice_password = "Inv$2026"
output_password = "Bill$2026"

load_options = gm.domain.options.LoadOptions(invoice_password)
buffer = io.BytesIO()

# Open the protected invoice, join attachments, write to memory buffer
with gm.Merger(invoice, load_options) as merger:
    for path in attachments:
        merger.join(path)
    merger.save(buffer)

# Re‑secure the merged document
add_pwd = gm.domain.options.AddPasswordOptions(output_password)
buffer.seek(0)
with gm.Merger(buffer) as merger:
    merger.add_password(add_pwd)
    merger.save(output)

Key points:

  • LoadOptions פותחת את קובץ ה‑PDF המקורי.
  • תוצאת המיזוג נכתבת תחילה ל‑stream בזיכרון (BytesIO).
  • AddPasswordOptions מיישמת סיסמה חדשה לקובץ הסופי.

Step 4: Selecting Specific Pages from Attachments

לפעמים רק חלק מצורף רלוונטי (לדוגמה, שני העמודים הראשונים של דוח שירות ארוך). השתמשו ב‑PageJoinOptions כדי לציין טווח כולל מבוסס 1‑based.

page_picks = [
    ("service_report.pdf", 1, 2),   # Include pages 1‑2 only
    ("terms_and_conditions.pdf", 3, 3)  # Include only page 3
]
output = "billing_selected_pages.pdf"

with gm.Merger(invoice) as merger:
    for path, first, last in page_picks:
        options = gm.domain.options.PageJoinOptions(first, last)
        merger.join(path, options)
    merger.save(output)