105 lines
2.3 KiB
Go
105 lines
2.3 KiB
Go
package utils
|
|
|
|
import (
|
|
"bytes"
|
|
"fmt"
|
|
|
|
"github.com/jung-kurt/gofpdf"
|
|
)
|
|
|
|
// PDFExporter handles PDF generation
|
|
type PDFExporter struct {
|
|
pdf *gofpdf.Fpdf
|
|
}
|
|
|
|
// NewPDFExporter creates a new PDF exporter
|
|
func NewPDFExporter() *PDFExporter {
|
|
pdf := gofpdf.New("P", "mm", "A4", "")
|
|
pdf.AddPage()
|
|
pdf.SetFont("Arial", "", 12)
|
|
|
|
return &PDFExporter{
|
|
pdf: pdf,
|
|
}
|
|
}
|
|
|
|
// AddTitle adds a title to the PDF
|
|
func (e *PDFExporter) AddTitle(title string) {
|
|
e.pdf.SetFont("Arial", "B", 16)
|
|
e.pdf.Cell(0, 10, title)
|
|
e.pdf.Ln(12)
|
|
e.pdf.SetFont("Arial", "", 12)
|
|
}
|
|
|
|
// AddSubtitle adds a subtitle to the PDF
|
|
func (e *PDFExporter) AddSubtitle(subtitle string) {
|
|
e.pdf.SetFont("Arial", "I", 11)
|
|
e.pdf.Cell(0, 8, subtitle)
|
|
e.pdf.Ln(10)
|
|
e.pdf.SetFont("Arial", "", 12)
|
|
}
|
|
|
|
// AddText adds regular text
|
|
func (e *PDFExporter) AddText(text string) {
|
|
e.pdf.SetFont("Arial", "", 10)
|
|
e.pdf.MultiCell(0, 6, text, "", "", false)
|
|
e.pdf.Ln(4)
|
|
}
|
|
|
|
// AddNewLine adds a new line
|
|
func (e *PDFExporter) AddNewLine() {
|
|
e.pdf.Ln(6)
|
|
}
|
|
|
|
// AddTable adds a table to the PDF
|
|
func (e *PDFExporter) AddTable(headers []string, data [][]string) {
|
|
// Calculate column widths
|
|
pageWidth, _ := e.pdf.GetPageSize()
|
|
margins := 20.0 // Left + Right margins
|
|
tableWidth := pageWidth - margins
|
|
colWidth := tableWidth / float64(len(headers))
|
|
|
|
// Add headers
|
|
e.pdf.SetFont("Arial", "B", 10)
|
|
e.pdf.SetFillColor(200, 200, 200)
|
|
for _, header := range headers {
|
|
e.pdf.CellFormat(colWidth, 8, header, "1", 0, "C", true, 0, "")
|
|
}
|
|
e.pdf.Ln(-1)
|
|
|
|
// Add data rows
|
|
e.pdf.SetFont("Arial", "", 9)
|
|
e.pdf.SetFillColor(255, 255, 255)
|
|
|
|
fill := false
|
|
for _, row := range data {
|
|
for _, cell := range row {
|
|
if fill {
|
|
e.pdf.SetFillColor(245, 245, 245)
|
|
} else {
|
|
e.pdf.SetFillColor(255, 255, 255)
|
|
}
|
|
e.pdf.CellFormat(colWidth, 7, cell, "1", 0, "L", true, 0, "")
|
|
}
|
|
e.pdf.Ln(-1)
|
|
fill = !fill
|
|
}
|
|
}
|
|
|
|
// AddPageNumber adds page numbers
|
|
func (e *PDFExporter) AddPageNumber() {
|
|
e.pdf.AliasNbPages("")
|
|
e.pdf.SetY(-15)
|
|
e.pdf.SetFont("Arial", "I", 8)
|
|
e.pdf.CellFormat(0, 10, fmt.Sprintf("Halaman %d/{nb}", e.pdf.PageNo()), "", 0, "C", false, 0, "")
|
|
}
|
|
|
|
// Output returns the PDF as bytes
|
|
func (e *PDFExporter) Output() *bytes.Buffer {
|
|
var buf bytes.Buffer
|
|
err := e.pdf.Output(&buf)
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
return &buf
|
|
} |