Generador de Listas de Verificación de Monedas en PDF A5
Cuándo usarlo
- El usuario quiere una lista de verificación de colección de monedas imprimible
- El usuario menciona A5, Filofax, archivador o páginas de planificador para monedas
- El usuario quiere hacer referencia cruzada de una exportación de Numista con una lista maestra de series
- El usuario está iterando sobre un PDF de lista de verificación de monedas generado previamente
Configuración de 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 # MÁS ANCHO — despeja la perforación de 6 agujeros Filofax
RIGHT_M = 6*mm
TOP_M = 9*mm
BOT_M = 8*mm
USABLE_W = PAGE_W - LEFT_M - RIGHT_M # ~124mm
Guías de perforación de 6 agujeros
Dibujar en cada página. Posiciones estándar de los agujeros Filofax A5 desde el borde 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)
Fuente
Usar Carlito (compatible métricamente con Calibri, gratuita bajo la Licencia de Fuente Abierta SIL). En Linux suele estar en:
/usr/share/fonts/truetype/crosextra/Carlito-Regular.ttf
/usr/share/fonts/truetype/crosextra/Carlito-Bold.ttf
/usr/share/fonts/truetype/crosextra/Carlito-Italic.ttf
En Windows o macOS, descargar Carlito desde Google Fonts y apuntar a esos archivos en su lugar.
Registrar las tres variantes. Nunca recurrir a Helvetica: el diseño a continuación está ajustado para las métricas de estilo Calibri.
Reglas de tipografía (RESTRICCIONES ESTRICTAS)
| Elemento | Fuente | Tamaño | Notas |
|---|---|---|---|
| Título de portada | Carlito-Bold | 20pt | Centrado en banda negra |
| Subtítulo de portada | Carlito-Bold | 16pt | Debajo del título |
| Encabezados de sección | Carlito-Bold | 8.5-9pt | Blanco sobre barra negra |
| Encabezados de columna | Carlito-Bold | 7.5pt | Gris, sobre línea separadora |
| Texto del cuerpo — TODAS las columnas | Carlito / Carlito-Bold | 11pt | Uniforme en Nombre, Período, Ahora |
| Línea de detalle de coleccionado | Carlito-Italic | 8.5pt | Gris, debajo de la fila coleccionada |
| Pie de página | Carlito | 6pt | Número de página + nombre de la lista |
| Columna de valor facial | Carlito | 9pt | Alineado a la derecha, abreviado (5Y, 10Y, 1J) |
Crítico: Mantener las columnas Nombre, Período y Ahora en el MISMO tamaño de fuente (11pt). Los tamaños mixtos se ven poco profesionales en una página impresa.
Diseño de filas
ROW_H = 16-18 # pts — espaciado generoso entre líneas
SEC_H = 17 # altura de la barra de encabezado de sección
COL_H = 13 # altura del encabezado de columna
COLLECTED_EXTRA = 11 # altura adicional para la línea de detalle en filas coleccionadas
- Dibujar una línea separadora sutil (0.2pt, #DDDDDD) en la parte inferior de cada fila
- Alternar fondos de fila: cada fila par recibe relleno #EBEBEB
- Filas coleccionadas: texto en negrita + marca de verificación en la casilla
Posiciones de columnas (desde LEFT_M)
COL_CK = 0 # casilla de verificación
COL_YR = 11 # año
COL_NM = 36 # nombre de la moneda (columna principal)
# Columnas del lado derecho — empujar a la derecha para evitar superposición con texto del período
COL_ERA = 84*mm # marcador de era (B/P/N) o valor facial
COL_NOW = 89*mm # estado actual / información secundaria
Lección clave: Las cadenas de fecha/período como "300 a. C.-1279" miden ~28mm de ancho a 11pt. El marcador de era y la columna AHORA deben comenzar después de 84mm para evitar superposición. Esto fue una corrección de múltiples iteraciones.
Diseño en escala de grises (OBLIGATORIO)
Diseñado para una impresora láser en escala de grises. Nunca confiar en el color para transmitir significado.
| Elemento visual | Enfoque en escala de grises |
|---|---|
| Resaltado de fila coleccionada | Rayado diagonal (no relleno de color) |
| Encabezados de sección | Texto blanco sobre barra negra sólida |
| Filas alternas | #EBEBEB vs blanco |
| Indicadores de era | Letras de texto (B/P/N), no puntos de color |
| Marcas de ceca coleccionadas | Peso negrita vs normal (no color) |
| Casillas de verificación | Marca dibujada con líneas, no Unicode |
Implementación del rayado:
def hatched(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 verificación (no X, no 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)
Flujo de página (Continuo)
Nunca dar a cada sección su propia página. Las secciones fluyen de forma continua. Las secciones pequeñas (3-5 elementos) deben empaquetarse en la misma página que la cola de la sección anterior.
# Prevenir huérfano: el encabezado de sección necesita encabezado + encabezado_columna + 1 fila mínimo
if item_type == 'section_header':
needed = h + COL_H + 2 + ROW_H + 4
if y - needed < BOT_M:
y = new_page(c)
Estructura de la portada
- Banda negra con título (20pt) y subtítulo (16pt)
- Línea de subtítulo debajo de la banda (12pt, gris)
- Regla horizontal
- Cuadro de estadísticas (relleno #EBEBEB): "Total: X Tengo: Y Necesito: Z" (14pt negrita)
- Porcentaje de cobertura (11pt, gris)
- Nombre del coleccionista (14pt negrita) + identificador de Numista (11pt)
- Sección de leyenda (si aplica)
- Resumen de series con conteos alineados a la derecha
No incluir
- Página de notas en blanco separada (desperdicia papel)
- Elementos que dependen del color
- Marcas de verificación Unicode o caracteres especiales (problemas de cobertura de fuente)
- Tamaños de fuente por debajo de 7pt para cualquier elemento
- Más de 1 página de espacio en blanco en cualquier parte del documento
Salida
Guardar el PDF donde el usuario pueda abrirlo (en claude.ai: /mnt/user-data/outputs/ y llamar a present_files; en Claude Code: la carpeta de trabajo). Renderizar páginas con pdf2image para una revisión visual antes de entregar.