توليد PDF في Swift (iOS/macOS): UIGraphicsPDFRenderer و PDFKit و Core Graphics

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

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

ابدأ الدورة

توليد PDF في Swift (iOS/macOS): من البسيط إلى المعقد



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



1. UIGraphicsPDFRenderer — المعيار الحديث



ظهر UIGraphicsPDFRenderer في iOS 10 و macOS 10.12. يوفر واجهة برمجة تطبيقات عالية المستوى لإنشاء PDF متعدد الصفحات. المزايا الرئيسية: العمل التلقائي مع السياق، ودعم البيانات الوصفية، وسهولة الاستخدام.



مثال أساسي: إنشاء PDF مع نص



import UIKit

func generateSimplePDF() -> Data? { let pageWidth: CGFloat = 612 // A4 let pageHeight: CGFloat = 792 let renderer = UIGraphicsPDFRenderer(bounds: CGRect(x: 0, y: 0, width: pageWidth, height: pageHeight)) let data = renderer.pdfData { context in // الصفحة الأولى context.beginPage() let text = "مرحباً، عالم PDF!" let attributes: [NSAttributedString.Key: Any] = [ .font: UIFont.systemFont(ofSize: 24), .foregroundColor: UIColor.black ] text.draw(at: CGPoint(x: 50, y: 50), withAttributes: attributes) // الصفحة الثانية context.beginPage() let secondText = "هذه هي الصفحة الثانية" secondText.draw(at: CGPoint(x: 50, y: 50), withAttributes: attributes) } return data}

// حفظ في ملفif let pdfData = generateSimplePDF() { let documentsPath = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0] let pdfURL = documentsPath.appendingPathComponent("sample.pdf") try? pdfData.write(to: pdfURL) print("تم حفظ PDF: \\(pdfURL)")}


مثال متقدم: جدول وصورة



func generateInvoicePDF() -> Data {    let renderer = UIGraphicsPDFRenderer(bounds: CGRect(x: 0, y: 0, width: 612, height: 792))        return renderer.pdfData { context in        context.beginPage()                // رسم الشعار (إن وجد)        if let logo = UIImage(named: "logo") {            logo.draw(in: CGRect(x: 50, y: 50, width: 100, height: 50))        }                // العنوان        let titleAttributes: [NSAttributedString.Key: Any] = [            .font: UIFont.boldSystemFont(ofSize: 28),            .foregroundColor: UIColor.darkGray        ]        "فاتورة رقم 123".draw(at: CGPoint(x: 400, y: 50), withAttributes: titleAttributes)                // الجدول        let items = [("المنتج", "السعر"), ("لابتوب", "1200$"), ("فأرة", "25$")]        var yPosition: CGFloat = 200                for (name, price) in items {            let nameAttributes: [NSAttributedString.Key: Any] = [                .font: UIFont.systemFont(ofSize: 14),                .foregroundColor: UIColor.black            ]            name.draw(at: CGPoint(x: 100, y: yPosition), withAttributes: nameAttributes)            price.draw(at: CGPoint(x: 400, y: yPosition), withAttributes: nameAttributes)            yPosition += 30        }                // الإجمالي        let totalAttributes: [NSAttributedString.Key: Any] = [            .font: UIFont.boldSystemFont(ofSize: 18),            .foregroundColor: UIColor.red        ]        "الإجمالي: 1225$".draw(at: CGPoint(x: 350, y: yPosition + 20), withAttributes: totalAttributes)    }}


2. PDFKit — العمل مع PDF الحالي والتعليقات التوضيحية



PDFKit هو إطار عمل أكثر قوة،

توصيات