Modelo de documento

Descripcion general

El paquete document (Capa 2) proporciona tipos para tamanos de pagina, unidades, estilos y el arbol de nodos del documento. La mayoria de los usuarios interactuan con estos tipos para configuracion en lugar de manipulacion directa del arbol.

import "github.com/gpdf-dev/gpdf/document"

Tamanos de pagina

var (
    A4     = Size{Width: 595.28, Height: 841.89}   // 210mm x 297mm
    A3     = Size{Width: 841.89, Height: 1190.55}   // 297mm x 420mm
    Letter = Size{Width: 612, Height: 792}           // 8.5" x 11"
    Legal  = Size{Width: 612, Height: 1008}          // 8.5" x 14"
)

Size

type Size struct {
    Width, Height float64  // in points (1pt = 1/72 inch)
}

Unidades y valores

Value

Una dimension con una unidad:

type Value struct {
    Amount float64
    Unit   Unit
}

Constructores de unidades

FuncionUnidadEjemplo
Pt(v)Puntos (1/72 pulgada)Pt(12) — unidad nativa de PDF
Mm(v)MilimetrosMm(20) — margen de 20mm
Cm(v)CentimetrosCm(2.5) — 2.5cm
In(v)PulgadasIn(1) — 1 pulgada
Em(v)Relativo al tamano de fuenteEm(2) — 2x tamano de fuente
Pct(v)Porcentaje del padrePct(50) — 50%
// Usage examples
document.Mm(20)   // 20 millimeters
document.Pt(12)   // 12 points
document.In(0.5)  // half inch
document.Pct(50)  // 50% of parent

Metodos de Value

func (v Value) Resolve(parentSize, fontSize float64) float64
func (v Value) IsAuto() bool

Resolve() convierte cualquier unidad a puntos. IsAuto() verifica valores de tamano automatico.

Bordes (Modelo de caja)

Edges

type Edges struct {
    Top, Right, Bottom, Left Value
}

UniformEdges

func UniformEdges(v Value) Edges

Crea bordes con el mismo valor en todos los lados:

document.UniformEdges(document.Mm(20))  // 20mm on all sides

Bordes personalizados

document.Edges{
    Top:    document.Mm(25),
    Right:  document.Mm(15),
    Bottom: document.Mm(25),
    Left:   document.Mm(15),
}

Estilo

La estructura Style controla todas las propiedades visuales:

type Style struct {
    // Font
    FontFamily     string
    FontSize       float64
    FontWeight     FontWeight    // WeightNormal (400) or WeightBold (700)
    FontStyle      FontStyle     // StyleNormal or StyleItalic

    // Color
    Color          pdf.Color
    Background     *pdf.Color

    // Text layout
    TextAlign      TextAlign     // AlignLeft, AlignCenter, AlignRight, AlignJustify
    LineHeight     float64
    LetterSpacing  float64
    TextIndent     Value
    TextDecoration TextDecoration
    VerticalAlign  VerticalAlign

    // Box model
    Margin  Edges
    Padding Edges
    Border  BorderEdges
}

TextAlign

const (
    AlignLeft    TextAlign = iota  // default
    AlignCenter
    AlignRight
    AlignJustify
)

FontWeight

const (
    WeightNormal FontWeight = 400
    WeightBold   FontWeight = 700
)

TextDecoration

const (
    DecorationNone          TextDecoration = 0
    DecorationUnderline     TextDecoration = 1
    DecorationStrikethrough TextDecoration = 2
    DecorationOverline      TextDecoration = 4
)

Las decoraciones se pueden combinar con OR a nivel de bits.

VerticalAlign

const (
    VAlignTop    VerticalAlign = iota  // default
    VAlignMiddle
    VAlignBottom
)

Se usa para la alineacion vertical de celdas de tabla:

template.TableCellVAlign(document.VAlignMiddle)

Metadatos del documento

type DocumentMetadata struct {
    Title    string
    Author   string
    Subject  string
    Creator  string
    Producer string
}
template.WithMetadata(document.DocumentMetadata{
    Title:  "Quarterly Report",
    Author: "ACME Corp",
})

Tipos de imagen

ImageFitMode

const (
    FitContain  ImageFitMode = iota  // Scale to fit within bounds (preserve ratio)
    FitCover                          // Scale to fill bounds (may crop)
    FitStretch                        // Stretch to fill (distort)
    FitOriginal                       // Use original image dimensions
)

ImageFormat

const (
    ImageFormatJPEG ImageFormat = iota
    ImageFormatPNG
)

Tipos de nodo

El arbol del documento esta compuesto por nodos:

const (
    NodeDocument NodeType = iota
    NodePage
    NodeBox
    NodeText
    NodeImage
    NodeTable
    NodeList
    NodeRichText
)

La mayoria de los usuarios no interactuan con los nodos directamente — el constructor de templates los crea automaticamente.

Tipos geometricos

type Rectangle struct {
    X, Y, Width, Height float64
}

type Point struct {
    X, Y float64
}