iOS और macOS के लिए Swift में PDF रिपोर्ट जनरेशन
मोबाइल और डेस्कटॉप एप्लिकेशन में PDF डॉक्यूमेंट बनाना एक आम ज़रूरत है। Apple प्लेटफॉर्म (iOS, macOS) पर इसके लिए शक्तिशाली बिल्ट-इन टूल्स उपलब्ध हैं: PDFKit और Core Graphics। इस आर्टिकल में हम सीखेंगे कि केवल नेटिव Swift का उपयोग करके टेबल, टेक्स्ट और ग्राफिक्स के साथ मल्टी-पेज रिपोर्ट कैसे बनाई जाए।
बिल्ट-इन टूल्स का उपयोग क्यों करें?
- कोई थर्ड-पार्टी डिपेंडेंसी नहीं — सब कुछ SDK में पहले से शामिल है।
- रेंडरिंग पर पूरा नियंत्रण — कोऑर्डिनेट्स, फॉन्ट्स, कलर्स के साथ काम करें।
- क्रॉस-प्लेटफॉर्म — कोड iOS और macOS दोनों पर काम करता है।
- उच्च प्रदर्शन — Core Graphics हार्डवेयर एक्सेलेरेशन का उपयोग करता है।
मुख्य दृष्टिकोण
Swift में PDF जनरेट करने के दो मुख्य तरीके हैं:
- PDFKit — PDF के साथ काम करने के लिए हाई-लेवल API (पढ़ना, एडिट करना, बनाना)।
- Core Graphics — PDF कॉन्टेक्स्ट के माध्यम से लो-लेवल रेंडरिंग।
हम दूसरे दृष्टिकोण पर ध्यान देंगे, क्योंकि यह "स्क्रैच से" रिपोर्ट बनाने में अधिकतम लचीलापन देता है।
PDF कॉन्टेक्स्ट बनाना
पहला कदम — एक PDF कॉन्टेक्स्ट बनाना है जिसमें हम एलिमेंट्स ड्रा करेंगे। इसके लिए UIGraphicsBeginPDFContextToFile फंक्शन (iOS) या macOS के लिए इसका एनालॉग उपयोग किया जाता है।
import UIKit
func generatePDF() -> URL? {
let fileName = "Report.pdf"
let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
guard let documentsURL = paths.first else { return nil }
let pdfURL = documentsURL.appendingPathComponent(fileName)
let pageSize = CGRect(x: 0, y: 0, width: 612, height: 792) // A4
UIGraphicsBeginPDFContextToFile(pdfURL.path, pageSize, nil)
// यहाँ पेज ड्रा करेंगे
UIGraphicsEndPDFContext()
return pdfURL
}
पेज और कंटेंट जोड़ना
हर पेज UIGraphicsBeginPDFPage() कॉल से शुरू होता है। इसके बाद ड्राइंग के लिए UIKit के स्टैंडर्ड मेथड्स का उपयोग किया जा सकता है।
func drawReport() {
guard let pdfURL = generatePDF() else { return }
UIGraphicsBeginPDFContextToFile(pdfURL.path, CGRect(x: 0, y: 0, width: 612, height: 792), nil)
// पहला पेज
UIGraphicsBeginPDFPage()
drawHeader(title: "मासिक रिपोर्ट")
drawTable(data: sampleData)
// दूसरा पेज (यदि ज़रूरत हो)
UIGraphicsBeginPDFPage()
drawChart()
UIGraphicsEndPDFContext()
}
टेक्स्ट और हेडर ड्रा करना
टेक्स्ट ड्रा करने के लिए हम एट्रीब्यूट्स के साथ NSString का उपयोग करते हैं।
func drawHeader(title: String) {
let titleAttributes: [NSAttributedString.Key: Any] = [
.font: UIFont.boldSystemFont(ofSize: 24),
.foregroundColor: UIColor.darkGray
]
title.draw(at: CGPoint(x: 50, y: 40), withAttributes: titleAttributes)
}
सरल टेबल बनाना
टेबल को लाइनों और टेक्स्ट की मदद से ड्रा किया जा सकता है। नीचे दो कॉलम वाली टेबल जनरेट करने का उदाहरण है।
func drawTable(data: [(String, String)]) {
let startX: CGFloat = 50
var startY: CGFloat = 100
let colWidth: CGFloat = 250
let rowHeight: CGFloat = 30
// हेडर ड्रा करें
let headerAttributes: [NSAttributedString.Key: Any] = [
.font: UIFont.boldSystemFont(ofSize: 14),
.foregroundColor: UIColor.black
]
"नाम".draw(at: CGPoint(x: startX, y: startY), withAttributes: headerAttributes)
"मान".draw(at: CGPoint(x: startX + colWidth, y: startY), withAttributes: headerAttributes)
startY += rowHeight
// रो ड्रा करें
for (key, value) in data {
let rowAttributes: [NSAttributedString.Key: Any] = [
.font: UIFont.systemFont(ofSize: 12)