توليد تقارير PDF بلغة Go: نظرة عامة على المكتبات وأمثلة الكود

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

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

ابدأ الدورة

توليد تقارير PDF بلغة Go (Golang): دليل شامل



إنشاء مستندات PDF هو أحد المهام الشائعة في تطوير الويب، خاصة عند بناء الأنظمة المؤسسية أو التطبيقات المالية أو المنصات التعليمية. تقدم لغة Go (Golang) العديد من المكتبات القوية لتوليد PDF، والتي تسمح بإنشاء تقارير نصية بسيطة ومستندات معقدة متعددة الصفحات تحتوي على جداول ورسوم بيانية وصور. في هذه المقالة، سنستعرض ثلاثة مناهج شائعة: gofpdf و maroto والتكامل مع wkhtmltopdf.



1. مكتبة gofpdf — تحكم منخفض المستوى في PDF



gofpdf هي واحدة من أقدم وأكثر المكتبات مرونة لتوليد PDF بلغة Go. توفر تحكمًا كاملاً في كل عنصر من عناصر الصفحة، ولكنها تتطلب كودًا أكثر للتخطيطات المعقدة.



التثبيت

go get github.com/jung-kurt/gofpdf


مثال: تقرير بسيط مع عنوان وجدول

package main

import ( "github.com/jung-kurt/gofpdf")

func main() { pdf := gofpdf.New("P", "mm", "A4", "") pdf.AddPage() pdf.SetFont("Arial", "B", 16) pdf.Cell(40, 10, "تقرير المبيعات") pdf.Ln(12)

// رؤوس الجدول pdf.SetFont("Arial", "B", 12) headers := []string{"المنتج", "الكمية", "السعر"} for _, h := range headers { pdf.CellFormat(40, 10, h, "1", 0, "C", false, 0, "") } pdf.Ln(-1)

// البيانات pdf.SetFont("Arial", "", 12) data := [][]string{{"لابتوب", "5", "45000"}, {"فأرة", "12", "1500"}} for _, row := range data { for _, cell := range row { pdf.CellFormat(40, 10, cell, "1", 0, "C", false, 0, "") } pdf.Ln(-1) }

err := pdf.OutputFileAndClose("report.pdf") if err != nil { panic(err) }}


الإيجابيات: تبعيات قليلة، تحكم كامل، دعم Unicode (خطوط TrueType).
السلبيات: عدم وجود مكونات جاهزة (جداول، رسوم بيانية)، الحاجة إلى حساب المواضع يدويًا.



2. مكتبة maroto — توليد عالي المستوى مع شبكة



maroto مبنية فوق gofpdf وتقدم نهجًا قائمًا على المكونات مع شبكة، مما يبسط إنشاء التخطيطات المعقدة. مثالية للتقارير النمطية: الفواتير، الإشعارات، قوائم الأسعار.



التثبيت

go get github.com/johnfercher/maroto/v2


مثال: تقرير مع شعار وجدول

package main

import ( "github.com/johnfercher/maroto/v2/pkg/core" "github.com/johnfercher/maroto/v2/pkg/props" "github.com/johnfercher/maroto/v2")

func main() { m := maroto.NewMaroto(maroto.WithMaxGridSize(12)) m.RegisterHeader(func() { m.Row(20, func() { m.Col(3, func() { m.FileImage("logo.png", props.Rect{ Percent: 80, Center: true, }) }) m.Col(9, func() { m.Text("شركة «تكنو سيرفيس»", props.Text{ Style: props.Bold, Size: 16, }) }) }) })

m.Row(10, func() { m.Col(12, func() { m.Table([]string{"الاسم", "الكمية", "المبلغ"}, [][]string{ {"شاشة 24\\"", "2", "40000"}, {"لوحة مفاتيح", "5", "7500"}, }, props.Table{ Content: props.TableContent{ GridSizes: []uint{6, 3, 3}, }, }) }) })

document, _ := m.Generate() _ = document.Save("invoice.pdf")}


الإيجابيات: تطوير سريع، محاذاة تلقائية، دعم مدمج للجداول ورموز QR والباركود.
السلبيات: أكثر

توصيات