توليد تقارير PDF بلغة Swift: PDFKit و UIPrintPageRenderer

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

توليد تقارير PDF بلغة Swift (iOS/macOS) باستخدام PDFKit



إنشاء مستندات PDF هي إحدى المهام الشائعة في تطبيقات الهواتف المحمولة وأجهزة الكمبيوتر المكتبية. على منصات Apple (iOS, macOS, watchOS, tvOS) يتم استخدام الإطار المدمج PDFKit لهذا الغرض. فهو يسمح بتوليد وعرض وتحرير ملفات PDF برمجياً. في هذه المقالة، سنشرح كيفية إنشاء تقرير PDF كامل بلغة Swift: مع نصوص، جداول، صور وصفحات قابلة للتخصيص.



ما هو PDFKit؟

PDFKit هو إطار من Apple، وهو جزء من SDKs القياسية لنظامي iOS/macOS. يوفر فئات للعمل مع PDF:

  • PDFDocument — تمثيل المستند بأكمله.
  • PDFPage — صفحة فردية.
  • PDFView — عرض PDF على الشاشة.
  • UIPrintPageRenderer (لنظام iOS) — توليد الصفحات عبر الرسم باستخدام Core Graphics.

لتوليد التقارير، غالباً ما يتم استخدام UIPrintPageRenderer أو الرسم مباشرة عبر Core Graphics في سياق PDF. الطريقة الثانية توفر مرونة أكبر ولكنها تتطلب كوداً أكثر.



تحضير المشروع

افتح Xcode، وأنشئ مشروعاً جديداً لنظام iOS أو macOS. تأكد من استيراد وحدة PDFKit:

import PDFKitimport UIKit // لنظام iOS


لنظام macOS، ستحتاج إلى import Cocoa والعمل المناسب مع NSView.



الطريقة 1: توليد PDF عبر UIPrintPageRenderer (iOS)

هذه الطريقة مناسبة إذا كنت ترغب في استخدام ترميز HTML أو تخطيطات معقدة. يسمح UIPrintPageRenderer بعرض الصفحات عبر UIPrintFormatter.



func generatePDFUsingRenderer() -> Data? {    let renderer = UIPrintPageRenderer()        // إعداد حجم الصفحة A4    let pageSize = CGRect(x: 0, y: 0, width: 595.2, height: 841.8) // بالنقاط    renderer.setValue(pageSize, forKey: "paperRect")    renderer.setValue(pageSize, forKey: "printableRect")        // إنشاء سلسلة HTML للتقرير    let htmlString = """    <h1>تقرير المبيعات</h1>    <p>التاريخ: 2025-03-17</p>    <table border="1">        <tr><th>المنتج</th><th>الكمية</th><th>السعر</th></tr>        <tr><td>لابتوب</td><td>5</td><td>50000</td></tr>        <tr><td>فأرة</td><td>20</td><td>1500</td></tr>    </table>    """        let formatter = UIMarkupTextPrintFormatter(markupText: htmlString)    renderer.addPrintFormatter(formatter, startingAtPageAt: 0)        // عرض إلى PDF    let pdfData = NSMutableData()    UIGraphicsBeginPDFContextToData(pdfData, .zero, nil)        for pageIndex in 0..<renderer.numberOfPages {        UIGraphicsBeginPDFPage()        renderer.drawPage(at: pageIndex, in: UIGraphicsGetCurrentContext()!)    }        UIGraphicsEndPDFContext()    return pdfData as Data}


استدعِ الدالة واحفظ النتيجة:

if let pdfData = generatePDFUsingRenderer() {    let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)    let fileURL = paths[0].appendingPathComponent("report.pdf")    try? pdfData.write(to: fileURL)    print("تم حفظ PDF: \\(fileURL)")}


الطريقة 2: الرسم عبر Core Graphics (iOS/macOS)

هذه الطريقة أكثر انخفاضاً في المستوى، ولكنها توفر تحكماً كاملاً في كل عنصر. مناسبة لنظام macOS حيث UIPrintPageRenderer غير متوفر.



func generatePDFWithCoreGraphics() -> Data? {    let pdfData = NSMutableData()    let pageRect = CGRect(x: 0, y: 0, width: 612, height: 792) // US Letter        guard let consumer = CGDataConsumer(data: pdfData),          let pdfContext = CGContext(consumer: consu                    

توصيات