Gerador de PDF de Checklist de Moedas A5
Quando usar
- O usuário deseja uma lista de verificação de coleção de moedas imprimível
- O usuário menciona A5, Filofax, fichário ou páginas de planejador para moedas
- O usuário quer cruzar uma exportação do Numista com uma lista mestre de séries
- O usuário está iterando sobre um PDF de checklist de moedas gerado anteriormente
Configuração da Página
from reportlab.lib.pagesizes import A5
PAGE_W, PAGE_H = A5 # 148mm x 210mm (419,53 x 595,28 pts)
LEFT_M = 18*mm # MAIS LARGA — desobstrui a perfuração de 6 furos Filofax
RIGHT_M = 6*mm
TOP_M = 9*mm
BOT_M = 8*mm
USABLE_W = PAGE_W - LEFT_M - RIGHT_M # ~124mm
Guias de Perfuração de 6 Furos
Desenhe em cada página. Posições padrão dos furos Filofax A5 a partir da borda superior:
HOLE_POSITIONS_MM = [19, 51, 70, 140, 159, 191]
for h in HOLE_POSITIONS_MM:
y = PAGE_H - h*mm
c.setStrokeColor(HexColor("#CCCCCC"))
c.setLineWidth(0.25)
c.circle(4.5*mm, y, 2.2*mm, stroke=1, fill=0)
Fonte
Use Carlito (metricamente compatível com Calibri, gratuita sob a Licença de Fonte Aberta SIL). No Linux geralmente está em:
/usr/share/fonts/truetype/crosextra/Carlito-Regular.ttf
/usr/share/fonts/truetype/crosextra/Carlito-Bold.ttf
/usr/share/fonts/truetype/crosextra/Carlito-Italic.ttf
No Windows ou macOS, baixe Carlito do Google Fonts e aponte para esses arquivos.
Registre as três variantes. Nunca use Helvetica como fallback: o layout abaixo é ajustado para métricas estilo Calibri.
Regras Tipográficas (RESTRIÇÕES RÍGIDAS)
| Elemento | Fonte | Tamanho | Notas |
|---|---|---|---|
| Título da capa | Carlito-Bold | 20pt | Centralizado em faixa preta |
| Subtítulo da capa | Carlito-Bold | 16pt | Abaixo do título |
| Cabeçalhos de seção | Carlito-Bold | 8,5-9pt | Branco sobre barra preta |
| Cabeçalhos de coluna | Carlito-Bold | 7,5pt | Cinza, acima da linha separadora |
| Texto do corpo — TODAS as colunas | Carlito / Carlito-Bold | 11pt | Uniforme em Nome, Período, Agora |
| Linha de detalhe coletado | Carlito-Italic | 8,5pt | Cinza, abaixo da linha coletada |
| Rodapé | Carlito | 6pt | Número da página + nome do checklist |
| Coluna de valor facial | Carlito | 9pt | Alinhado à direita, abreviado (5Y, 10Y, 1J) |
Crítico: mantenha as colunas Nome, Período e Agora no MESMO tamanho de fonte (11pt). Tamanhos mistos parecem amadores em uma página impressa.
Layout das Linhas
ROW_H = 16-18 # pts — espaçamento generoso entre linhas
SEC_H = 17 # altura da barra de cabeçalho de seção
COL_H = 13 # altura do cabeçalho de coluna
COLLECTED_EXTRA = 11 # altura extra para linha de detalhe em linhas coletadas
- Desenhe uma linha separadora sutil (0,2pt, #DDDDDD) na parte inferior de cada linha
- Fundos alternados de linhas: linhas pares recebem preenchimento #EBEBEB
- Linhas coletadas: texto em negrito + marca de seleção na caixa de verificação
Posições das Colunas (a partir de LEFT_M)
COL_CK = 0 # caixa de verificação
COL_YR = 11 # ano
COL_NM = 36 # nome da moeda (coluna principal)
# Colunas do lado direito — empurrar para a direita para evitar sobreposição com texto do período
COL_ERA = 84*mm # marcador de era (B/P/N) ou valor facial
COL_NOW = 89*mm # estado atual / informação secundária
Lições importantes: strings de data/período como "300 BCE-1279" têm ~28mm de largura em 11pt. O marcador de era e a coluna AGORA DEVEM começar após 84mm para evitar sobreposição. Isso foi corrigido após várias iterações.
Design em Escala de Cinza (OBRIGATÓRIO)
Projetado para impressora a laser em escala de cinza. Nunca dependa de cor para significado.
| Elemento visual | Abordagem em escala de cinza |
|---|---|
| Destaque de linha coletada | Hachura diagonal (não preenchimento colorido) |
| Cabeçalhos de seção | Texto branco sobre barra preta sólida |
| Linhas alternadas | #EBEBEB vs branco |
| Indicadores de era | Letras de texto (B/P/N), não pontos coloridos |
| Marcas de casa da moeda coletadas | Negrito vs peso normal (não cor) |
| Caixas de verificação | Marca de seleção desenhada com linhas, não Unicode |
Implementação da hachura:
def hatch(c, x, y, w, h):
c.saveState()
p = c.beginPath(); p.rect(x, y, w, h)
c.clipPath(p, stroke=0)
c.setStrokeColor(HexColor("#CCCCCC"))
c.setLineWidth(0.35)
for i in range(-int(h), int(w+h), 5):
c.line(x+i, y, x+i+h, y+h)
c.restoreState()
Marca de seleção (não X, não Unicode):
c.setStrokeColor(BLK); c.setLineWidth(1.2)
cx = LEFT_M + COL_CK + 1; cy = ty - 1
c.line(cx+2, cy+4, cx+4, cy+1.5)
c.line(cx+4, cy+1.5, cx+8, cy+7.5)
Fluxo de Páginas (Contínuo)
Nunca dê a cada seção sua própria página. As seções fluem continuamente. Seções pequenas (3-5 itens) devem caber na mesma página que o final da seção anterior.
# Evitar órfão: cabeçalho de seção precisa de header + col_header + 1 linha no mínimo
if item_type == 'section_header':
needed = h + COL_H + 2 + ROW_H + 4
if y - needed < BOT_M:
y = new_page(c)
Estrutura da Página de Capa
- Faixa preta com título (20pt) e subtítulo (16pt)
- Linha de subtítulo abaixo da faixa (12pt, cinza)
- Régua horizontal
- Caixa de estatísticas (#EBEBEB): "Total: X Tenho: Y Preciso: Z" (14pt negrito)
- Porcentagem de cobertura (11pt, cinza)
- Nome do colecionador (14pt negrito) + identificador Numista (11pt)
- Seção de legenda (se aplicável)
- Resumo da série com contagens alinhadas à direita
Não Incluir
- Página de anotações em branco separada (desperdiça papel)
- Elementos dependentes de cor
- Marcas de verificação Unicode ou caracteres especiais (problemas de cobertura de fonte)
- Tamanhos de fonte abaixo de 7pt para qualquer elemento
- Mais de 1 página de espaço em branco em qualquer lugar do documento
Saída
Salve o PDF onde o usuário possa abri-lo (no claude.ai: /mnt/user-data/outputs/ e chame present_files; no Claude Code: a pasta de trabalho). Renderize as páginas com pdf2image para verificação visual antes de entregar.