توليد تقارير PDF بلغة Kotlin: نظرة عامة على المكتبات وأمثلة عملية
Kotlin، باعتبارها لغة حديثة لـ JVM، توفر للمطورين أدوات قوية لإنشاء مستندات PDF. سواء كنت تنشئ تقارير مالية، فواتير، لوحات تحليلية، أو ببساطة تصدّر بيانات، فهناك العديد من المكتبات الناضجة في Kotlin التي تسمح بحل هذه المهمة. في هذه المقالة، سنستعرض المكتبات الرئيسية لتوليد PDF بلغة Kotlin، ونقارن إمكانياتها، ونقدم أمثلة عملية للكود.
1. iText 7 — أداة قوية ومرنة
iText هي واحدة من أشهر المكتبات للعمل مع PDF في عالم Java وKotlin. توفر تحكمًا كاملاً في محتوى المستند: النصوص، الجداول، الصور، التعليقات التوضيحية، الإشارات المرجعية، وغيرها الكثير. iText 7 هي نسخة معاد تصميمها بهندسة محسّنة.
التثبيت (Gradle)
implementation("com.itextpdf:itext7-core:8.0.2")مثال: إنشاء تقرير PDF بسيط
import com.itextpdf.kernel.pdf.PdfDocumentimport com.itextpdf.kernel.pdf.PdfWriterimport com.itextpdf.layout.Documentimport com.itextpdf.layout.element.Paragraphimport com.itextpdf.layout.element.Tableimport java.io.FileOutputStream
fun generateReport(fileName: String, data: List<Pair<String, Int>>) { val writer = PdfWriter(FileOutputStream(fileName)) val pdf = PdfDocument(writer) val document = Document(pdf)
// العنوان document.add(Paragraph("تقرير المبيعات").setFontSize(20).setBold())
// الجدول val table = Table(2) table.addCell("المنتج") table.addCell("الكمية") data.forEach { (product, quantity) -> table.addCell(product) table.addCell(quantity.toString()) } document.add(table)
document.close() println("تم إنشاء PDF: $fileName")}
// الاستخدامfun main() { val salesData = listOf( "أجهزة كمبيوتر محمولة" to 150, "شاشات" to 230, "لوحات مفاتيح" to 340 ) generateReport("report_itext.pdf", salesData)}يوفر iText واجهة برمجة تطبيقات غنية للتنسيق: يمكن تعيين الخطوط، الألوان، الهوامش، المحاذاة، إضافة الصور، وحتى تضمين الخطوط (مثل الخطوط السيريلية). ومع ذلك، لدى iText قيود ترخيص: الاستخدام التجاري يتطلب شراء ترخيص (AGPL للمشاريع مفتوحة المصدر).
2. Apache PDFBox — بديل مجاني
Apache PDFBox هي مكتبة مفتوحة المصدر (ترخيص Apache 2.0) لا تحتوي على قيود على الاستخدام التجاري. تتيح PDFBox إنشاء PDF من الصفر، ملء النماذج، استخراج النصوص، وحتى العمل مع التوقيعات الرقمية.
التثبيت (Gradle)
implementation("org.apache.pdfbox:pdfbox:3.0.1")مثال: إنشاء PDF مع جدول
import org.apache.pdfbox.pdmodel.PDDocumentimport org.apache.pdfbox.pdmodel.PDPageimport org.apache.pdfbox.pdmodel.PDPageContentStreamimport org.apache.pdfbox.pdmodel.font.PDType1Fontimport java.awt.Color
fun createPdfBoxReport(fileName: String, data: List<Pair<String, Int>>) { val document = PDDocument() val page = PDPage() document.addPage(page)
val contentStream = PDPageContentStream(document, page) contentStream.beginText() contentStream.setFont(PDType1Font.HELVETICA_BOLD, 18f) contentStream.newLineAtOffset(50f, 750f) contentStream.showText("تقرير المبيعات (PDFBox)") contentStream.endText()
// رسم الجدول يدويًا var y = 700f contentStream.setFont(PDType1Font.HELVETICA, 12f) contentStream.setNonStrokingColor(Color.BLACK) data.forEach { (product, quantity) -> contentStream.beginText() contentStream.newLineAtOffset(50f, y) contentStream.showText("$product — $quantity قطعة") contentStream.endText()