تعد ملفات pdf بمثابة المعيار العالمي الذي تعتمد عليه مختلف الجهات فيما يتعلق بنقل المستندات الرقمية, سواءً كانت كتبًا أو إيصالات أو وثائق رسمية وما عدا ذلك من أغراض. في هذا المقال, سأقوم بشرح آلية توليد مستندات pdf من خلال أكواد بايثون؛ وذلك اعتمادًا على أبسط الطرق المتاحة.

 

 

المحاور

 

الغرض من إنشاء ملفات pdf بلغة بايثون.

احتياجات إنشاء مستندات pdf بلغة بايثون.

إعداد المشروع.

وضع محتوى ملفات pdf

توليد ملفات pdf.

 

 

الغرض من إنشاء ملفات pdf بلغة بايثون.

 

تعد لغة Python أحد أكثر لغات البرمجة عمومية من حيث قابليتها لإنشاء مختلف المشاريع, فقد تستخدم اللغة لإنشاء المواقع الالكترونية, التطبيقات الحاسوبية, أو تحليل البيانات ...  

وبطبيعة الحال؛ قد تدفعك الحاجة في بعض مشاريعك للتعرف على آلية إنشاء مستندات pdf من خلال اللغة, وذلك إما لتوليد إيصالات الشراء إن كنت تعمل على شكل من أشكال تطبيقات المبيعات, أو لتوليد سيرة ذاتية للمستخدم إن كنت تعمل على إنشاء أداة لكتابة السيرة الذاتية, أو ببساطة, هو مجرد فضول وحب المعرفة والاطلاع.

 

احتياجات توليد مستندات pdf بلغة بايثون.

 

 

أولًا: على افتراض أنك تملك نسخة مثبتة على جهازك من مفسر بايثون؛ ستحتاج إلى تثبيت مكتبة pdfkit المسؤولة عن عمليات التعامل مع مستندات pdf.

افتح موجه الأوامر؛ واكتب الأمر التالي لتنزيل المكتبة.

 

pip install pdfkit

 

 

ثانيًا: تحتاج مكتبة pdfkit إلى برنامج خارجي يدعى wkhtmltopdf, حيث أن عملية تنسيق محتوى ملفات pdf قبل توليدها تعتمد على وسوم html.

قم بتنزيل نسختك من البرنامج عبر هذا الرابط

بعد تنزيل البرنامج, ستعمل على تثبيته بشكل اعتيادي جدًا؛ متبعًا معالج التثبيت القياسي.

 

ثالثًا: قم بإنشاء مجلد جديد لمشروعك, ثم توجه إلى c:/program files (x86) وانسخ مجلد wkhtmltopdf وضعه في مشروعك.

هذه الخطوة ضرورية جدًا إذا كنت تريد نقل أداة wkhtmltopdf عند نشره للمستخدمين.

 

 

إعداد المشروع.

 

في المجلد الجديد الذي قمت بإنشاؤه, ستعمل الآن على إدراج ملف بايثون جديد ولنسميه مثلًا pdf.py

افتح هذا الملف واكتب الأوامر التالية:

 

import pdfkit

import os

 

path = os.path.join(os.getcwd(), "wkhtmltopdf", "bin", "wkhtmltopdf.exe")

config = pdfkit.configuration(wkhtmltopdf=path)

 

 

في الكود السابق؛ عملنا على استدعاء كل من مكتبة pdfkit المسؤولة عن التعامل مع ملفات pdf, ومكتبة os للتعامل مع المسارات.

وهنا لننتبه إلى مسألة ضرورية وهي أن مكتبة pdfkit تقوم بتنفيذ أوامر تحويل html إلى pdf من خلال مسار برنامج wkhtmltopdf الذي قمنا بتنزيله على program files, وأنت بطبيعة الحال تريد منه أن يقرأ مسار البرنامج من مجلد مشروعك مباشرة.

إذًا: المتغير الأول قمنا فيه بكتابة مسار برنامج wkhtmltopdf الجديد والذي يوجد في مجلد المشروع بداخل مجلد آخر يدعى bin

وبعد تحديد المسار, قمنا بإنشاء كائن من نوع pdfkit configuration وأضفنا فيه المسار الجديد

 

وضع محتوى ملف pdf الجديد

ذكرنا أعلاه أن عملية ترتيب المحتوى وتنسيقه لملفات pdf تعتمد على وسوم html. وhtml هي لغة هيكلة تُستخدم في تصميم صفحات مواقع الإنترنت, ولها استخدامات أخرى تتمثل في تنسيق بعض أجزاء مستندات word وتمثيل تنسيقات ملفات pdf.

إذًا, أنت في حاجة إلى كتابة محتوى ملفك من خلال لغة html, وسواء قمت بكتابة المحتوى في ملف html منفصل أو وضعته على شكل سلسلة نصية string بداخل برنامج فإن الطريقة لن تختلف بشكل كبير.

في هذا الشرح؛ سأعمل على كتابة محتوى html مباشرة على شكل string لكي تتضح الصورة بشكل أفضل.

عد إلى ملف pdf.py وأضف إليه الكود التالي

 

 

content = """

<!DOCTYPE html>

<html lang="ar" dir="rtl">

<head>

         <meta charset="UTF-8">

         <meta name="viewport" content="width=device-width, initial-scale=1.0">

         <title>مستند تجريبي</title>

</head>

<body>

         <h1>إيصال الشراء</h1>

         <p>هذا إيصال شراء تجريبي</p>

</body>

</html>

"""

 

هنا قمنا بإنشاء متغير من نوع نص ووضعنا فيه محتوى تجريبي لنفترض أنه سيكون ملف pdf النهائي, وأنت هنا أمام حرية تنسيق النص حسب حاجتك وذلك بتضمين تنسيقات css.

 

لنفترض أنك ترغب بقراءة محتوى html من ملف خارجي, وليكن اسمه test.html, فالطريقة ستكون كالتالي.

 

with open("test.html", encoding="utf-8") as file:

         content = file.read()

هنا قمنا بإنشاء نفس المتغير النصي content إلا أنه هذه المرة سيأخذ محتواه من ملف html خارجي.

 

توليد ملف pdf

 

الآن؛ وبعد أن قمنا بتجهيز المحتوى؛ بقي فقط أن نقوم بتحويله إلى ملف pdf, والحقيقة فإن الطريقة بسيطة جدًا تقتصر على سطر بايثون واحد.

عد إلى ملف pdf.py واكتب في نهايته السطر التالي

 

pdfkit.from_string(content, "test.pdf", configuration=config)

 

 

في السطر السابق؛ قمنا باستخدام الوظيفة from_string من مكتبة pdfkit وهي الدالة المسؤولة عن تحويل نصوص html إلى ملفات pdf

المعامل الذي قمنا بتمريره مباشرة بعد القوس هو محتوى html الذي سيتم تحويله والذي قمنا بتخزينه سابقًا في المتغير content

أما المعامل الثالث فهو اسم ملف pdf ومساره,وقد أسميناه في حالتنا test.pdf وسيتم حفظه في مجلد المشروع.

أما المعامل الأخير, فهو مسؤول عن ضبط إعدادات عمل الدالة from_string, حيث أعطيناه المتغير config الذي أنشأناه في الخطوة الأولى وحددنا فيه مسار برنامج wkhtmltopdf.exe.

هذا كل شيء تقريبًا.

هنا جمعت لكم أجزاء الكود كاملة ليسهل عليكم تأملها.

 

# pdf.py

 

 

import pdfkit

import os

 

 

path = os.path.join(os.getcwd(), "wkhtmltopdf", "bin", "wkhtmltopdf.exe")

config = pdfkit.configuration(wkhtmltopdf=path)

 

 

 

content = """

<!DOCTYPE html>

<html lang="ar" dir="rtl">

<head>

         <meta charset="UTF-8">

         <meta name="viewport" content="width=device-width, initial-scale=1.0">

         <title>مستند تجريبي</title>

</head>

<body>

         <h1>إيصال الشراء</h1>

         <p>هذا إيصال شراء تجريبي</p>

</body>

</html>

"""

 

pdfkit.from_string(content, "test.pdf", configuration=config)

 

الخاتمة

تعد مكتبة pdfkit أحد أكثر الحلول مرونة فيما يتعلق الأمر بإنشاء ملفات pdf بلغة البايثون. وما يميز هذه المكتبة بالتحديد دعمها المباشر للنصوص العربية, حيث أن هناك خيارات أخرى أكثر شيوعًا مثل xhtml2pdf إلا أنها تتطلب مزيدًا من العناية بالخطوط إذا كنت ستعمل على توليد مستندات عربية. المشكلة الوحيدة مع هذه المكتبة هي اعتمادها على برنامج خارجي والذي تعرفنا على أنه wkhtmltopdf. لذلك, احرص دائمًا على نسخ البرنامج إلى مجلد مشروعك وكتابة الكود المسؤول عن ضبط المسار الخاص بملف exe للبرنامج..