المقدمة
توحيد الفواتير هو سير عمل يجمع عدة مستندات مالية في ملف PDF واحد باستخدام GroupDocs.Merger للغة Python. غالبًا ما تحتاج فرق المالية إلى إرسال فاتورة مع ملاحظات التسليم، تقارير الخدمة، وشروط الضمان، لكن تجميع الملفات يدويًا يسبب أخطاء ويضيع الوقت. يقوم GroupDocs.Merger بأتمتة هذه العملية، مما يضمن ترتيب كل مرفق بشكل صحيح، وإمكانية تأمينه اختياريًا، وتسليمه كملف PDF نظيف واحد.
في هذا البرنامج التعليمي ستتعرف على كيفية:
- دمج فاتورة PDF عادية مع أي عدد من الملفات الداعمة.
- التعامل مع صيغ مختلطة مثل صور JPG وعقود DOCX.
- فتح فاتورة محمية بكلمة مرور، إضافة مرفقات، وإعادة تطبيق التشفير.
- تضمين صفحات محددة فقط من المرفقات الكبيرة للحفاظ على حجم الحزمة النهائي صغيرًا.
واجهت هذا السيناريو بالضبط في الربع الأخير عندما تولد نظام المحاسبة فاتورة محمية بكلمة مرور وأضاف الفريق القانوني وثيقة ضمان DOCX متعددة الصفحات. حَلّ الكود أدناه المشكلة في أقل من خمس دقائق.
متى يكون من المنطقي دمج فاتورة محمية بكلمة مرور مع مستندات أخرى؟
تقوم العديد من المؤسسات بتشفير الفواتير أثناء التخزين لتلبية متطلبات الامتثال. عندما تحتاج الفاتورة إلى إرسالها إلى العميل مع مرفقات غير محمية (إيصالات، شروط، صور)، يجب إزالة كلمة المرور الأصلية للدمج ثم إعادة تطبيقها على الحزمة النهائية. يتيح لك GroupDocs.Merger توفير كلمة مرور الفتح عبر LoadOptions، دمج الملفات الإضافية، وأخيرًا حماية ملف PDF المدمج باستخدام AddPasswordOptions. يضمن ذلك الحفاظ على سرية البيانات مع تقديم مستند واحد سهل الفتح.
المتطلبات المسبقة
- Python 3.8+ (عبر جسر .NET)
- GroupDocs.Merger للغة Python – تثبيت عبر:
pip install groupdocs-merger
- ملف PDF للفاتورة الرئيسي (
invoice.pdf) وقائمة مسارات ملفات المرفقات. - (اختياري) كلمات مرور للفاتورة المصدر وملف PDF الناتج.
الخطوة 1: توحيد أساسي لمرفقات PDF
أبسط حالة هي دمج فاتورة 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)
نقاط رئيسية:
- يتم إنشاء
gm.Mergerمع المستند الرئيسي (الفاتورة). join()تقبل أي صيغة مدعومة؛ المكتبة تتولى التحويل.save()تكتب ملف PDF المدمج إلى المسار المحدد.
الخطوة 2: توحيد مرفقات بصيغ مختلطة
حزم الفوترة الواقعية غالبًا ما تحتوي على صور ممسوحة (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)
لماذا هذا مهم: تحويل كل شيء إلى PDF يلغي الحاجة إلى أن يستخدم المستلم مشاهدات متعددة، مما يوفر تجربة سلسة.
الخطوة 3: التعامل مع الفواتير المحمية بكلمة مرور
إذا كانت الفاتورة مشفرة، قدم كلمة المرور عبر 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)
نقاط رئيسية:
LoadOptionsيفتح ملف PDF المصدر.- يتم كتابة النتيجة المدمجة أولًا إلى تدفق ذاكرة (
BytesIO). AddPasswordOptionsيطبق كلمة مرور جديدة على الملف النهائي.
الخطوة 4: اختيار صفحات محددة من المرفقات
أحيانًا يكون جزء فقط من مرفق ما ذا صلة (مثل الصفحتين الأوليين من تقرير خدمة طويل). استخدم PageJoinOptions لتحديد نطاق شامل يبدأ من 1.
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)
النتيجة: يحتوي ملف PDF النهائي على الفاتورة بالإضافة إلى الصفحات المختارة فقط، مما يحافظ على خفة الحزمة.
أفضل الممارسات والنصائح
- الأداء: للدفعات الكبيرة، فعّل فقط الخيارات التي تحتاجها (مثل تجنب تحويل الصيغ غير الضروري).
- إدارة الذاكرة: استخدم دائمًا جملة
withلضمان تحرير موارد الـ Merger بسرعة. - الأمان: أعد تطبيق التشفير بعد الدمج للحفاظ على سرية الفاتورة الأصل