Configuração YAML

Guia completo para edição manual do arquivo template.yaml, abrangendo Layout, Mapeamento e Lógica.

Este guia é destinado a usuários avançados e desenvolvedores que desejam editar o arquivo template.yaml diretamente. Este arquivo atua como a "Fonte Única da Verdade" para o seu perfil, definindo o layout do PDF, mapeamento de dados e lógica de cálculos.


Localização do arquivo

O arquivo de configuração está localizado no diretório do perfil dentro do workspace:

Documents/PDFMailEngine_Workspace/Profiles/<SeuNomeDePerfil>/template.yaml

O local padrão do workspace é a pasta PDFMailEngine_Workspace dentro do diretório Documentos. Você pode alterar a localização do workspace nas configurações do aplicativo.


1. PAGE Configuration (Página)

Define as propriedades físicas do canvas do PDF.

  • size: Tamanhos padrão (A3, A4, A5, B4, B5, LETTER, LEGAL).
  • orientation: PORTRAIT ou LANDSCAPE.
  • margins: Margens globais em milímetros.
PAGE:
  size: "A4"
  orientation: "PORTRAIT"
  margins:
    top: 20
    bottom: 20
    left: 20
    right: 20
  background: "assets/background/stationery.pdf" # PDF de fundo opcional

2. FONTS

Registra fontes TrueType (.ttf) ou OpenType (.otf) personalizadas.

FONTS:
  # FontName : Relative Path
  "MyCustomFont": "assets/fonts/MyFont-Bold.ttf"
  "CorporateFont": "Corporate-Regular.otf"

3. MAPPING (Vinculação de dados)

Mapeia os cabeçalhos das colunas do CSV/Excel para nomes de variáveis internas usadas no modelo.

Sintaxe: InternalKey: "CSV Column Header"

MAPPING:
  # Internal : External
  customer_name: "Customer Name"
  invoice_no: "Invoice Number"
  date: "Issue Date"
  amount: "Total Amount"

4. CALCULATIONS

Define cálculos automáticos a serem executados durante a ingestão de dados.

  • scope:
    • item: calculado para cada linha (ex.: {{ quantity }} * {{ price }}).
    • group: calculado para um grupo de linhas (ex.: sum de totais).
  • expression: Uma expressão matemática. Suporta funções math como floor(), ceil(), round().
CALCULATIONS:
  # Cálculo por linha (ex.: Imposto)
  - scope: "item"
    target: "tax_amount"
    expression: "floor({{ amount }} * 0.10)" # Use funções math

  # Adicionando para mostrar de onde vem total_with_tax
  - scope: "item"
    target: "total_with_tax"
    expression: "{{ amount }} + {{ tax_amount }}"

  # Cálculo em nível de grupo (Soma de todas as linhas da fatura)
  - scope: "group"
    target: "grand_total"
    type: "sum" # 'sum' soma os valores
    field: "total_with_tax"

5. LAYOUT (Elementos)

A lista LAYOUT define todos os elementos visuais no PDF. Os elementos são desenhados em ordem (elementos posteriores são desenhados por cima).

Sistema de coordenadas

Propriedades comuns

A maioria dos elementos suporta estas propriedades:

  • x, y: Posição em milímetros.
  • visible: Uma expressão condicional que controla se o elemento é renderizado (veja abaixo).
  • position: absolute (padrão) ou relative.

Propriedade visible

A propriedade visible aceita uma expressão Python avaliada contra a linha de dados atual. Se a expressão avaliar como False (ou um valor falso), o elemento é ocultado.

Funções integradas disponíveis: int(), float(), str(), len()

# Mostrar apenas quando o valor é positivo
- type: "text"
  value: "Total: {{ amount }}"
  visible: "{{ amount }} > 0"
  x: 20
  y: 250

# Mostrar apenas quando um campo não está vazio
- type: "text"
  value: "Nota: {{ note }}"
  visible: "len(str({{ note }})) > 0"
  x: 20
  y: 240

# Combinar múltiplas condições
- type: "text"
  value: "Desconto Aplicado"
  visible: "{{ discount_rate }} > 0 and {{ amount }} >= 10000"
  x: 20
  y: 230

Text

Exibe texto estático ou variáveis dinâmicas usando a sintaxe Jinja2 {{ key }}.

- type: "text"
  value: "Invoice #{{ invoice_no }}" # Dinâmico
  x: 20
  y: 250
  font_family: "Helvetica"
  font_size: 12
  font_weight: "bold"
  align: "LEFT" # LEFT, CENTER, RIGHT
  color: "#000000"
  opacity: 1.0

Image

Incorpora um arquivo de imagem.

- type: "image"
  path: "assets/images/logo.png"
  x: 150
  y: 260
  width: 40
  height: 20

Group Table (Dinâmica)

Renderiza uma tabela dinâmica que itera sobre as linhas de dados (Detalhes/Itens de linha).

- type: "group_table"
  x: 20
  y: 180
  # Estilos globais
  header_height: 8
  row_height: 6
  border_color: "#000000"
  grid_color: "#cccccc"
  alt_row_color: "#f0f0f0" # Listras zebra

  columns:
    - header: "Item"
      key: "item_name"
      width: 60
      align: "LEFT"

    - header: "Price"
      key: "unit_price"
      width: 30
      align: "RIGHT"
      format: "currency" # Formata com vírgulas

Static Table (Fixa)

Renderiza uma grade fixa onde as linhas são definidas manualmente. Útil para rodapés, dados bancários ou blocos de assinatura.

- type: "static_table"
  x: 20
  y: 50
  width: 170 # Opcional. Inferido da soma das larguras das colunas se não especificado

  columns:
    - width: 30
      header: "Label"
    - width: 140
      header: "Value"

  # Linhas definidas manualmente
  rows:
    - ["Bank Name", "Mizuho Bank"]
    - ["Account No", "{{ account_number }}"] # Pode usar variáveis
    - ["Note", "Please pay within 30 days"]

Barcode

Gera um código de barras 1D.

Tipos suportados: CODE128, JAN (EAN13 misto), EAN13, EAN8, CODE39, UPCA, NW-7 (Codabar), ITF.

- type: "barcode"
  value: "{{ invoice_no }}"
  x: 20
  y: 20
  width: 50        # Largura máxima (reduzida se necessário)
  height: 10       # Altura total

  barcode_type: "CODE128"
  bar_width: 1.0   # Espessura das barras
  bar_height: 10   # Altura das barras

  # Texto legível
  human_readable: true
  hr_font: "Helvetica"
  hr_size: 10
  hr_color: "#000000"

QR Code

Gera um QR Code 2D.

Níveis de correção de erro: L (7%), M (15%), Q (25%), H (30%).

- type: "qrcode"
  value: "https://example.com/inv/{{ invoice_no }}"
  x: 150
  y: 20
  width: 20       # Tamanho (proporção fixa)

  qr_error_level: "M"
  qr_quiet_zone: true   # Incluir margem branca

  color: "#000000"      # Primeiro plano
  back_color: "#ffffff" # Fundo
  opacity: 1.0

Shapes (Rect / Line)

Propriedades do Rect:

  • x, y: Posição em milímetros.
  • width, height: Dimensões em milímetros.
  • stroke_color: Cor da borda (hexadecimal, ex.: "#000000").
  • fill_color: Cor de preenchimento (hexadecimal, ex.: "#f0f0f0"). Omita para sem preenchimento.
  • stroke_width: Espessura da borda em pontos (padrão: 1).
  • opacity: Opacidade de 0.0 (transparente) a 1.0 (opaco).

Propriedades do Line: Uma linha é desenhada como um retângulo com height: 0 (horizontal) ou width: 0 (vertical).

  • x, y: Posição inicial em milímetros.
  • width: Comprimento de uma linha horizontal.
  • height: Comprimento de uma linha vertical. Defina 0 para linhas horizontais.
  • stroke_color: Cor da linha (hexadecimal).
  • stroke_width: Espessura da linha em pontos.
# Retângulo com borda e preenchimento
- type: "rect"
  x: 10
  y: 100
  width: 190
  height: 50
  stroke_color: "#000000"
  fill_color: "#f0f0f0"
  stroke_width: 1

# Linha horizontal
- type: "line"
  x: 10
  y: 200
  width: 190
  height: 0
  stroke_width: 2
  stroke_color: "#000000"