API Reference¶
Package Overview¶
| Package | Description |
|---|---|
pkg/api |
High-level API for report generation |
pkg/report |
Report types and loading |
pkg/template |
Template rendering with miya |
pkg/processor |
Backend implementations |
pkg/fileutils |
File system abstractions |
pkg/api¶
High-level API for PDF and MIME generation.
ZipReport¶
PDF generation via zipreport-server.
// Create with server URL and API key
client := api.NewZipReport("http://localhost:6543", "api-key")
// Create with custom backend
client := api.NewZipReportWithBackend(customBackend)
Methods¶
// CreateJob creates a ReportJob from a ReportFile
func (z *ZipReport) CreateJob(zpt *report.ReportFile) *report.ReportJob
// Render renders a report job with data and optional wrapper
func (z *ZipReport) Render(job *report.ReportJob, data map[string]interface{}, wrapper template.EnvironmentWrapper) *report.JobResult
// RenderDefaults renders with default job settings
func (z *ZipReport) RenderDefaults(zpt *report.ReportFile, data map[string]interface{}, wrapper template.EnvironmentWrapper) *report.JobResult
MIMEReport¶
MIME email generation with embedded resources.
client := api.NewMIMEReport()
result := client.RenderDefaults(zpt, data, nil)
// With options
client := api.NewMIMEReport(
processor.WithSubject("Monthly Report"),
processor.WithFrom("reports@example.com"),
processor.WithTo("user@example.com", "other@example.com"),
)
Quick Helpers¶
// Render to PDF
result := api.RenderPDF(zpt, data, serverURL, apiKey)
// Render to MIME
result := api.RenderMIME(zpt, data)
pkg/report¶
Report loading and job configuration.
Loading Reports¶
// Auto-detect file or directory
zpt, err := report.Load("report.zpt")
zpt, err := report.Load("./template")
// Load from file
zpt, err := report.LoadFile("report.zpt")
// Load from directory
zpt, err := report.LoadDir("./template")
// Load from bytes
zpt, err := report.LoadBytes(zipData)
ReportFile¶
// Get manifest
manifest := zpt.GetManifest()
// Check file existence
exists := zpt.Exists("style.css")
// Read file bytes
data, err := zpt.GetBytes("data.json")
// Get required parameters
params := zpt.Params() // []string
// Check if JS event is enabled
usesJS := zpt.UseJSEvent() // bool
ReportJob¶
Configure rendering options:
job := report.NewReportJob(zpt)
// Page settings
job.SetPageSize(report.PageA4) // A3, A4, A5, Letter, Legal, Tabloid
job.SetLandscape(true)
// Margins
job.SetMargins(report.MarginStandard) // standard, none, minimum
job.SetCustomMargins(&report.Margins{
Top: 10, Right: 10, Bottom: 10, Left: 10,
})
// Timeouts
job.SetSettlingTime(200) // milliseconds
job.SetJSTimeout(60) // seconds
job.SetJobTimeout(120) // seconds
// JavaScript event
job.UseJSEvent(true)
Constants¶
// Page sizes
report.PageA3
report.PageA4
report.PageA5
report.PageLetter
report.PageLegal
report.PageTabloid
// Margin styles
report.MarginStandard
report.MarginNone
report.MarginMinimum
Building Reports¶
// Build .zpt from directory
result := report.Build("./source", "output.zpt", nil)
if !result.Success() {
log.Fatal(result.Error())
}
// Build with options
opts := report.DefaultBuildOptions()
opts.FollowSymlinks = true
opts.ExcludeHidden = true
result := report.Build("./source", "output.zpt", opts)
// Build to ZipFs (in-memory)
zfs, result := report.BuildZipFs("./source", nil)
JobResult¶
result := client.RenderDefaults(zpt, data, nil)
if result.Success {
// result.Report contains PDF/MIME bytes
os.WriteFile("output.pdf", result.Report, 0644)
} else {
log.Printf("Error: %s", result.Error)
}
pkg/template¶
Template rendering with miya.
MiyaRender¶
// Create renderer
renderer := template.NewMiyaRender(zpt)
// With options
renderer := template.NewMiyaRender(zpt,
template.WithStrictParams(true),
template.WithAutoEscape(true),
template.WithWrapper(myWrapper),
)
// Render main template
output, err := renderer.Render(data)
// Render specific template
output, err := renderer.RenderTemplate("other.html", data)
// Render string directly
output, err := renderer.RenderString("Hello {{ name }}", data)
// Access environment for advanced configuration
env := renderer.GetEnvironment()
EnvironmentWrapper¶
Customize the miya environment:
// Using function wrapper
wrapper := template.FuncEnvironmentWrapper(func(env *miya.Environment) {
env.AddFilter("currency", formatCurrency)
env.AddGlobal("company", "ACME Corp")
})
renderer := template.NewMiyaRender(zpt, template.WithWrapper(wrapper))
Chaining multiple wrappers:
chain := template.NewChainedWrapper(wrapper1, wrapper2)
chain.Add(wrapper3)
renderer := template.NewMiyaRender(zpt, template.WithWrapper(chain))
pkg/processor¶
Backend implementations.
ServerBackend¶
// Create backend
backend := processor.NewServerBackend(url, apiKey)
// With options
backend := processor.NewServerBackend(url, apiKey,
processor.WithAPIVersion(2),
processor.WithTimeout(10 * time.Minute),
processor.WithSecureSSL(true),
processor.WithHTTPClient(customClient),
)
// Use with ZipReport
client := api.NewZipReportWithBackend(backend)
MIMEProcessor¶
proc := processor.NewMIMEProcessor()
result := proc.Process(job)
// With options
proc := processor.NewMIMEProcessor(
processor.WithSubject("Report Title"),
processor.WithFrom("sender@example.com"),
processor.WithTo("recipient@example.com"),
)
pkg/fileutils¶
File system abstractions.
ZipFs¶
In-memory ZIP file system:
// Create empty
zfs := fileutils.NewZipFs()
// From file
zfs, err := fileutils.NewZipFsFromFile("report.zpt")
// From bytes
zfs, err := fileutils.NewZipFsFromBytes(data)
// Operations
zfs.Add("file.txt", content, overwrite)
content, err := zfs.GetBytes("file.txt")
exists := zfs.Exists("file.txt")
zfs.Remove("file.txt")
// Save to bytes
data, err := zfs.Save()
DiskFs¶
Disk-based file system:
dfs, err := fileutils.NewDiskFs("/path/to/template")
// Read-only operations
content, err := dfs.GetBytes("file.txt")
exists := dfs.Exists("file.txt")
basePath := dfs.BasePath()
Complete Example¶
package main
import (
"fmt"
"log"
"os"
"github.com/zipreport/miya"
"github.com/zipreport/zipreport-go/pkg/api"
"github.com/zipreport/zipreport-go/pkg/report"
"github.com/zipreport/zipreport-go/pkg/template"
)
func main() {
// Load template
zpt, err := report.Load("invoice.zpt")
if err != nil {
log.Fatal(err)
}
// Template data
data := map[string]interface{}{
"invoice_number": "INV-2024-001",
"customer": "John Doe",
"items": []map[string]interface{}{
{"name": "Widget", "qty": 5, "price": 10.00},
{"name": "Gadget", "qty": 2, "price": 25.00},
},
}
// Custom wrapper for currency formatting
wrapper := template.FuncEnvironmentWrapper(func(env *miya.Environment) {
env.AddFilter("currency", func(val interface{}, args ...interface{}) (interface{}, error) {
if f, ok := val.(float64); ok {
return fmt.Sprintf("$%.2f", f), nil
}
return val, nil
})
})
// Create job with custom settings
client := api.NewZipReport(os.Getenv("ZIPREPORT_URL"), os.Getenv("ZIPREPORT_API_KEY"))
job := client.CreateJob(zpt)
job.SetPageSize(report.PageLetter)
job.SetMargins(report.MarginStandard)
// Render
result := client.Render(job, data, wrapper)
if !result.Success {
log.Fatal(result.Error)
}
os.WriteFile("invoice.pdf", result.Report, 0644)
log.Println("Invoice generated successfully")
}