المقدمة
توحيد الفواتير هو سير عمل يجمع عدة مستندات مالية في ملف 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. تقوم الواجهة البرمجية تلقائيًا بتحويل المدخلات غير 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 النهائي على الفاتورة بالإضافة إلى الصفحات المختارة فقط، مما يحافظ على خفة الحزمة.
المثال الكامل
النسخة الكاملة من المثال العملي، بما في ذلك جميع الملفات المصدرية والوثائق النموذجية، متوفرة على GitHub: billing-consolidator-demo-using-groupdocs-merger-python.
أفضل الممارسات والنصائح
- الأداء: للدفعات الكبيرة، فعّل فقط الخيارات التي تحتاجها (مثل تجنب التحويل غير الضروري للصيغ).
- إدارة الذاكرة: استخدم دائمًا جملة
withلضمان تحرير موارد Merger بسرعة. - الأمان: أعد تطبيق التشفير بعد الدمج للحفاظ على سرية الفاتورة الأصلية.
- حدود الملفات: يدعم GroupDocs.Merger ملفات PDF تصل إلى 2 GB؛ قد تتطلب الملفات الأكبر تقسيمًا قبل الدمج.
الخلاصة
يقدم GroupDocs.Merger للغة Python واجهة برمجة تطبيقات بسيطة لتحويل مجموعة متفرقة من مستندات الفوترة إلى حزمة PDF واحدة احترافية. سواء كنت تتعامل مع ملفات PDF عادية، وسائط مختلطة، فواتير محمية بكلمة مرور، أو تحتاج إلى قص المرفقات إلى الصفحات الضرورية فقط، فإن المكتبة تقوم بالعمل الشاق في بضع أسطر من الشيفرة.
الخطوات التالية:
- استكشف القائمة الكاملة للصيغ المدعومة في documentation.
- تعلّم كيفية إضافة علامات مائية أو توقيعات رقمية إلى ملف PDF المدمج (API reference).
- اطلع على المشاريع النموذجية على GitHub لمزيد من السيناريوهات المتقدمة (Examples Repo).