توليد تقارير PDF بلغة Java: مراجعة المكتبات وأمثلة على الكود
إنشاء مستندات PDF هي إحدى المهام الشائعة في تطبيقات Java المؤسسية: من إعداد الفواتير والسجلات إلى بناء تقارير تحليلية معقدة تحتوي على رسوم بيانية. في هذه المقالة، سنستعرض ثلاث مكتبات رئيسية لتوليد PDF بلغة Java — iText وApache PDFBox وJasperReports — ونقارن إمكانياتها ونقدم أمثلة عملية على الكود.
1. iText — مكتبة قوية ومرنة
iText (الإصدار الحالي iText 8.x) هي واحدة من أشهر المكتبات للعمل مع PDF بلغة Java. تدعم إنشاء المستندات من الصفر، وتحرير المستندات الموجودة، وإضافة الصور والجداول والإشارات المرجعية والعلامات المائية، بالإضافة إلى العمل مع النماذج والتوقيعات الرقمية.
الترخيص: يتم توزيع iText بموجب ترخيص مزدوج — AGPL (مجاني لمشاريع مفتوحة المصدر) وترخيص تجاري (للبرمجيات الاحتكارية).
مثال: إنشاء مستند PDF بسيط يحتوي على نص وجدول
import com.itextpdf.kernel.pdf.PdfDocument;import com.itextpdf.kernel.pdf.PdfWriter;import com.itextpdf.layout.Document;import com.itextpdf.layout.element.Paragraph;import com.itextpdf.layout.element.Table;import com.itextpdf.layout.element.Cell;
public class ItextPdfExample { public static void main(String[] args) throws Exception { String dest = "report.pdf"; PdfWriter writer = new PdfWriter(dest); PdfDocument pdf = new PdfDocument(writer); Document document = new Document(pdf);
// عنوان document.add(new Paragraph("تقرير المبيعات").setBold().setFontSize(18));
// جدول Table table = new Table(3); table.addCell(new Cell().add(new Paragraph("المنتج"))); table.addCell(new Cell().add(new Paragraph("الكمية"))); table.addCell(new Cell().add(new Paragraph("المبلغ"))); table.addCell("حاسوب محمول"); table.addCell("5"); table.addCell("450,000 ₽"); table.addCell("فأرة"); table.addCell("12"); table.addCell("6,000 ₽");
document.add(table); document.close(); System.out.println("تم إنشاء PDF!"); }}يقوم هذا الكود بإنشاء PDF بعنوان "تقرير المبيعات" وجدول من ثلاثة أعمدة. يقوم iText تلقائياً بمعالجة فواصل الأسطر وتقسيم الصفحات.
2. Apache PDFBox — بديل خفيف ومجاني
Apache PDFBox هي مكتبة مفتوحة المصدر (ترخيص Apache 2.0) تسمح بإنشاء وتحرير واستخراج النص من ملفات PDF. لا تتطلب PDFBox تبعيات خارجية وهي مناسبة تماماً للمهام البسيطة: توليد المستندات النصية، ملء النماذج، استخراج البيانات.
العيب: العمل مع الجداول والتنسيق المعقد يتطلب كوداً يدوياً أكثر مقارنة بـ iText.
مثال: إنشاء PDF يحتوي على نص وصورة
import org.apache.pdfbox.pdmodel.PDDocument;import org.apache.pdfbox.pdmodel.PDPage;import org.apache.pdfbox.pdmodel.PDPageContentStream;import org.apache.pdfbox.pdmodel.font.PDType0Font;import java.io.File;
public class PdfBoxExample { public static void main(String[] args) throws Exception { try (PDDocument document = new PDDocument()) { PDPage page = new PDPage(); document.addPage(page);
PDPageContentStream contentStream = new PDPageContentStream(document, page); // تحميل الخط (إلزامي!) PDType0Font font = PDType0Font.load(document, new File("LiberationSans-Regular.ttf")); contentStream.setFont(font, 14); contentStream.beginText(); contentStream.newLineAtOffset(50, 700); contentStream.showText("مرحباً، عالم PDFBox!"); contentStream.endText(); contentStream.close();