assemblerpdf 1.0.5__tar.gz → 1.0.7__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. {assemblerpdf-1.0.5/src/assemblerpdf.egg-info → assemblerpdf-1.0.7}/PKG-INFO +1 -1
  2. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/pyproject.toml +1 -1
  3. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/assemblers/base.py +52 -36
  4. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/core.py +6 -6
  5. assemblerpdf-1.0.7/src/assemblerpdf/templates/assemblerpdf/fields/input.html +12 -0
  6. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/assemblerpdf/fields/textarea.html +1 -1
  7. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/assemblerpdf/layout/header.html +5 -5
  8. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/assemblerpdf/layout/style.html +92 -11
  9. assemblerpdf-1.0.7/src/assemblerpdf/templates/assemblerpdf/layout/table.html +33 -0
  10. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7/src/assemblerpdf.egg-info}/PKG-INFO +1 -1
  11. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf.egg-info/SOURCES.txt +1 -0
  12. assemblerpdf-1.0.5/src/assemblerpdf/templates/assemblerpdf/fields/input.html +0 -10
  13. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/MANIFEST.in +0 -0
  14. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/README.md +0 -0
  15. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/setup.cfg +0 -0
  16. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/__init__.py +0 -0
  17. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/assemblers/__init__.py +0 -0
  18. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/assemblers/form.py +0 -0
  19. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/assemblers/report.py +0 -0
  20. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/fonts/Inter-Bold.ttf +0 -0
  21. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/fonts/Inter-Medium.ttf +0 -0
  22. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/fonts/Inter-Regular.ttf +0 -0
  23. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/img/Logo-unp-rojo.png +0 -0
  24. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/img/logo-mininterior-rojo.jpg +0 -0
  25. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/assemblerpdf/fields/checkbox.html +0 -0
  26. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/assemblerpdf/fields/field_input.html +0 -0
  27. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/assemblerpdf/fields/field_label.html +0 -0
  28. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/assemblerpdf/fields/radio.html +0 -0
  29. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/assemblerpdf/layout/footer.html +0 -0
  30. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/assemblerpdf/layout/footer_fixed.html +0 -0
  31. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/assemblerpdf/layout/grid_row.html +0 -0
  32. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/assemblerpdf/layout/section.html +0 -0
  33. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/assemblerpdf/misc/signature.html +0 -0
  34. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/anexos.html +0 -0
  35. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/anexos_limpio.html +0 -0
  36. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/archivese.html +0 -0
  37. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/autoriza_envio.html +0 -0
  38. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/checkbox.html +0 -0
  39. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/control_cambios.html +0 -0
  40. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/datos_basicosinf.html +0 -0
  41. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/datos_ot.html +0 -0
  42. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/encaso_de.html +0 -0
  43. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/fiila_dos_check.html +0 -0
  44. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/fila_cinco_zona.html +0 -0
  45. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/fila_cuatro.html +0 -0
  46. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/fila_cuatro_si_no.html +0 -0
  47. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/fila_cuatro_zona.html +0 -0
  48. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/fila_dos.html +0 -0
  49. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/fila_dos_zona.html +0 -0
  50. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/fila_instructivo.html +0 -0
  51. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/fila_tres.html +0 -0
  52. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/fila_tres_checkbox.html +0 -0
  53. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/fila_tres_zona.html +0 -0
  54. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/fila_uno.html +0 -0
  55. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/firma.html +0 -0
  56. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/firma_doble.html +0 -0
  57. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/firmaop2.html +0 -0
  58. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/firmas_oficializacion.html +0 -0
  59. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/hechos_sobrevinientes.html +0 -0
  60. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/hechos_sobrevinientes_vacio.html +0 -0
  61. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/iformfilacuatro.html +0 -0
  62. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/informacion_doble.html +0 -0
  63. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/input_2checks.html +0 -0
  64. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/input_check.html +0 -0
  65. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/input_checkbox.html +0 -0
  66. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/input_solitario.html +0 -0
  67. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/label_input_dos.html +0 -0
  68. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/leyenda_autoriza_correo.html +0 -0
  69. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/leyenda_superiol.html +0 -0
  70. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/logos.html +0 -0
  71. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/manifiesto.html +0 -0
  72. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/notificacion_correo.html +0 -0
  73. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/oficializacion.html +0 -0
  74. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/pregunta_si_no.html +0 -0
  75. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/pregunta_tresopciones.html +0 -0
  76. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/qr_oficializacion.html +0 -0
  77. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/situacion_amenaza.html +0 -0
  78. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/style.html +0 -0
  79. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/subtitulo_icono.html +0 -0
  80. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/subtitulo_icono_largo.html +0 -0
  81. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/tabla_doble.html +0 -0
  82. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/tabla_instructivo.html +0 -0
  83. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/tabla_matriz_riesgo.html +0 -0
  84. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/tabla_proyeccion.html +0 -0
  85. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/tabla_simple.html +0 -0
  86. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/texarea.html +0 -0
  87. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/tipo_identificacion.html +0 -0
  88. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/tipos_checkbox.html +0 -0
  89. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/titulo.html +0 -0
  90. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/titulo_logo.html +0 -0
  91. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/titulo_principal.html +0 -0
  92. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/utils/__init__.py +0 -0
  93. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/utils/template_loader.py +0 -0
  94. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf.egg-info/dependency_links.txt +0 -0
  95. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf.egg-info/requires.txt +0 -0
  96. {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: assemblerpdf
3
- Version: 1.0.5
3
+ Version: 1.0.7
4
4
  Summary: Generador de PDFs usando WeasyPrint, diseñado para formularios y reportes con componentes genéricos.
5
5
  Author-email: EcosistemaUNP <ecosistema@unp.gov.co>
6
6
  License: MIT
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "assemblerpdf"
7
- version = "1.0.5"
7
+ version = "1.0.7"
8
8
  description = "Generador de PDFs usando WeasyPrint, diseñado para formularios y reportes con componentes genéricos."
9
9
  readme = "README.md"
10
10
  authors = [
@@ -2,7 +2,7 @@ import os
2
2
  from assemblerpdf.core import generate_pdf_from_string
3
3
 
4
4
  class BaseFormAssembler:
5
- def __init__(self, context=None, codigo=None, fecha=None, version=None, auto_decorations=True, custom_css_path=None, custom_css_content=None):
5
+ def __init__(self, context=None, codigo=None, fecha=None, version=None, auto_decorations=True, custom_css_path=None, custom_css_content=None, pdf_forms=False, margin_top=None, margin_bottom=None, margin_left=None, margin_right=None, padding_top=None, padding_bottom=None, padding_left=None, padding_right=None):
6
6
  self.context = context or {}
7
7
  self.components = []
8
8
  self.codigo = codigo
@@ -11,6 +11,15 @@ class BaseFormAssembler:
11
11
  self.auto_decorations = auto_decorations
12
12
  self.custom_css_path = custom_css_path
13
13
  self.custom_css_content = custom_css_content
14
+ self.pdf_forms = pdf_forms
15
+ self.margin_top = margin_top
16
+ self.margin_bottom = margin_bottom
17
+ self.margin_left = margin_left
18
+ self.margin_right = margin_right
19
+ self.padding_top = padding_top
20
+ self.padding_bottom = padding_bottom
21
+ self.padding_left = padding_left
22
+ self.padding_right = padding_right
14
23
 
15
24
  def _get_img_base(self):
16
25
  import assemblerpdf
@@ -20,7 +29,7 @@ class BaseFormAssembler:
20
29
  return f'file:///{img_dir}'
21
30
 
22
31
  def _render(self, template_name, extra_context=None):
23
- """Renderiza un componente usando Django (si está disponible) o Jinja2."""
32
+ """Renderiza un componente usando Jinja2 (motor nativo de la librería)."""
24
33
  # Unificar contexto
25
34
  full_context = {
26
35
  'img_base': self._get_img_base(),
@@ -30,41 +39,23 @@ class BaseFormAssembler:
30
39
  'version': self.version,
31
40
  'custom_css_path': self.custom_css_path,
32
41
  'custom_css_content': self.custom_css_content,
42
+ 'margin_top': self.margin_top,
43
+ 'margin_bottom': self.margin_bottom,
44
+ 'margin_left': self.margin_left,
45
+ 'margin_right': self.margin_right,
46
+ 'padding_top': self.padding_top,
47
+ 'padding_bottom': self.padding_bottom,
48
+ 'padding_left': self.padding_left,
49
+ 'padding_right': self.padding_right,
33
50
  **self.context,
34
- **(extra_context or {})
51
+ **(extra_context or {}),
52
+ 'disabled': extra_context.get('disabled', False) if extra_context else False,
35
53
  }
36
54
 
37
- # Intentar usar Django primero si está configurado
38
- try:
39
- from django.template.loader import render_to_string
40
- from django.template import TemplateDoesNotExist
41
-
42
- # Generar candidatos para buscar el template
43
- posibles_rutas = []
44
- if "/" not in template_name:
45
- subcarpetas = ["layout", "fields", "misc"]
46
- for sub in subcarpetas:
47
- posibles_rutas.append(f"assemblerpdf/{sub}/{template_name}")
48
- posibles_rutas.append(f"assemblerpdf/{template_name}")
49
- posibles_rutas.append(f"sistema/{template_name}")
50
- posibles_rutas.append(template_name)
51
- else:
52
- posibles_rutas.append(template_name)
53
- if not template_name.startswith("assemblerpdf/") and not template_name.startswith("sistema/"):
54
- posibles_rutas.append(f"assemblerpdf/{template_name}")
55
-
56
- last_error = None
57
- for ruta in posibles_rutas:
58
- try:
59
- return render_to_string(ruta, full_context)
60
- except TemplateDoesNotExist as e:
61
- last_error = e
62
- if last_error:
63
- raise last_error
64
- except Exception:
65
- # Fallback a Jinja2
66
- from assemblerpdf.utils.template_loader import render_template
67
- return render_template(template_name, full_context)
55
+ # Usar siempre Jinja2 para los templates internos de la librería
56
+ # (evita conflictos con templates de Django que tengan el mismo nombre)
57
+ from assemblerpdf.utils.template_loader import render_template
58
+ return render_template(template_name, full_context)
68
59
 
69
60
  def add_component(self, template_name, extra_context=None, wrapper_html=None):
70
61
  """
@@ -114,6 +105,30 @@ class BaseFormAssembler:
114
105
  self.components.append(row_html)
115
106
  return self
116
107
 
108
+ def add_table(self, headers=None, rows=None, titulo=None, class_group=None, style_group=None, extra_context=None):
109
+ """
110
+ Agrega una tabla genérica altamente dinámica y estilizada al documento.
111
+
112
+ Args:
113
+ headers (list): Lista de diccionarios que definen las columnas:
114
+ [{"text": "Col 1", "width": "30%", "align": "left"}, ...]
115
+ rows (list): Lista de diccionarios, cada uno con una lista de celdas:
116
+ [{"cells": [{"content": "Valor 1", "rowspan": 2}, {"content": "Valor 2"}]}]
117
+ titulo (str): Título superior opcional de la tabla.
118
+ class_group (str): Clase CSS adicional para la tabla.
119
+ style_group (str): Estilo inline adicional para la tabla.
120
+ extra_context (dict): Contexto extra
121
+ """
122
+ ctx = {
123
+ 'headers': headers or [],
124
+ 'rows': rows or [],
125
+ 'titulo': titulo,
126
+ 'class_group': class_group,
127
+ 'style_group': style_group,
128
+ **(extra_context or {})
129
+ }
130
+ return self.add_component('table.html', ctx)
131
+
117
132
  def add_raw_html(self, html):
118
133
  """Agrega HTML crudo al documento."""
119
134
  self.components.append(html)
@@ -124,7 +139,7 @@ class BaseFormAssembler:
124
139
  self.components.append('<div class="page-break"></div>')
125
140
  return self
126
141
 
127
- def build(self):
142
+ def build(self, pdf_forms=None):
128
143
  """Une todos los componentes renderizados y compila el PDF."""
129
144
  # 1. Obtener estilos globales (style.html)
130
145
  head = self._render("style.html")
@@ -154,4 +169,5 @@ class BaseFormAssembler:
154
169
  </body>
155
170
  </html>
156
171
  """
157
- return generate_pdf_from_string(html_final)
172
+ forms_enabled = pdf_forms if pdf_forms is not None else self.pdf_forms
173
+ return generate_pdf_from_string(html_final, pdf_forms=forms_enabled)
@@ -140,7 +140,7 @@ def install_dependencies():
140
140
  logger.error("❌ La instalación de dependencias falló o WeasyPrint no se cargó correctamente.")
141
141
  return False
142
142
 
143
- def generate_pdf(template_name, context=None, output_path=None):
143
+ def generate_pdf(template_name, context=None, output_path=None, pdf_forms=False):
144
144
  """Genera PDF usando Django (si está configurado) o Jinja2."""
145
145
  if context is None:
146
146
  context = {}
@@ -173,13 +173,13 @@ def generate_pdf(template_name, context=None, output_path=None):
173
173
  from assemblerpdf.utils.template_loader import render_template
174
174
  html = render_template(template_name, context)
175
175
 
176
- return _generate_pdf_from_html(html, output_path)
176
+ return _generate_pdf_from_html(html, output_path, pdf_forms=pdf_forms)
177
177
 
178
- def generate_pdf_from_string(html_content, output_path=None):
178
+ def generate_pdf_from_string(html_content, output_path=None, pdf_forms=False):
179
179
  """Genera PDF directamente desde un string HTML."""
180
- return _generate_pdf_from_html(html_content, output_path)
180
+ return _generate_pdf_from_html(html_content, output_path, pdf_forms=pdf_forms)
181
181
 
182
- def _generate_pdf_from_html(html, output_path=None):
182
+ def _generate_pdf_from_html(html, output_path=None, pdf_forms=False):
183
183
  """Función interna que utiliza WeasyPrint para compilar HTML a PDF."""
184
184
  # Verificar disponibilidad de WeasyPrint
185
185
  if not check_weasyprint_installed():
@@ -200,7 +200,7 @@ def _generate_pdf_from_html(html, output_path=None):
200
200
 
201
201
  try:
202
202
  # Renderizar a PDF
203
- pdf_data = HTML(string=html, base_url=base_url).write_pdf()
203
+ pdf_data = HTML(string=html, base_url=base_url).write_pdf(pdf_forms=pdf_forms)
204
204
  except Exception as e:
205
205
  raise RuntimeError(f"Error al generar PDF con WeasyPrint: {e}")
206
206
 
@@ -0,0 +1,12 @@
1
+ <div class="form-group {{ class_group|default('') }}" style="margin-bottom: {{ margin_bottom|default('8px') }}; {{ style_group|default('') }}">
2
+ {% if label %}
3
+ <label class="form-label {{ class_label|default('') }}" style="{{ style_label|default('') }}">{{ label }}</label>
4
+ {% endif %}
5
+ {% if interactive|default(True) %}
6
+ <input type="text" class="form-control {{ class_control|default('') }}" name="{{ name|default('') }}" value="{{ valor|default('') }}" placeholder="{{ placeholder|default('') }}" {% if disabled %}disabled{% endif %} style="{{ style_control|default('') }}">
7
+ {% else %}
8
+ <div class="form-control-static {{ class_control|default('') }}" style="{{ style_control|default('') }}">
9
+ {{ valor|default('') }}
10
+ </div>
11
+ {% endif %}
12
+ </div>
@@ -2,7 +2,7 @@
2
2
  {% if label %}
3
3
  <label class="form-label {{ class_label|default('') }}" style="{{ style_label|default('') }}">{{ label }}</label>
4
4
  {% endif %}
5
- {% if interactive %}
5
+ {% if interactive|default(True) %}
6
6
  <textarea class="form-control {{ class_control|default('') }}" name="{{ name }}" style="min-height: {{ alto|default('80px') }}; {{ style_control|default('') }}" placeholder="{{ placeholder|default('') }}" {% if disabled %}disabled{% endif %}>{{ valor|default('') }}</textarea>
7
7
  {% else %}
8
8
  <div class="form-control-static {{ class_control|default('') }}" style="min-height: {{ alto|default('80px') }}; display: block; white-space: pre-wrap; page-break-inside: auto; {{ style_control|default('') }}">
@@ -1,8 +1,8 @@
1
1
  <div class="header-container {{ class_group|default('') }}" style="{{ style_group|default('') }}">
2
2
  <div class="header-logos">
3
- <img src="{{ logo_izq|default('img/logo-mininterior-rojo.jpg') }}" class="header-logo-left {{ class_logo_left|default('') }}" style="{{ style_logo_left|default('') }}" alt="Logo Izquierda">
3
+ <img src="{{ logo_der|default('img/Logo-unp-rojo.png') }}" class="header-logo-right {{ class_logo_right|default('') }}" style="{{ style_logo_right|default('') }}" alt="Logo Derecha">
4
4
  </div>
5
-
5
+
6
6
  <div class="header-text">
7
7
  <h1 class="header-title-primary {{ class_title1|default('') }}" style="{{ style_title1|default('') }}">{{ titulo1 }}</h1>
8
8
  {% if titulo2 %}
@@ -12,8 +12,8 @@
12
12
  <h3 class="header-title-tertiary {{ class_title3|default('') }}" style="{{ style_title3|default('') }}">{{ titulo3 }}</h3>
13
13
  {% endif %}
14
14
  </div>
15
-
15
+
16
16
  <div>
17
- <img src="{{ logo_der|default('img/Logo-unp-rojo.png') }}" class="header-logo-right {{ class_logo_right|default('') }}" style="{{ style_logo_right|default('') }}" alt="Logo Derecha">
17
+ <img src="{{ logo_izq|default('img/logo-mininterior-rojo.jpg') }}" class="header-logo-left {{ class_logo_left|default('') }}" style="{{ style_logo_left|default('') }}" alt="Logo Izquierda">
18
18
  </div>
19
- </div>
19
+ </div>
@@ -35,19 +35,22 @@
35
35
  {% if auto_decorations %}
36
36
  @page {
37
37
  size: letter;
38
- margin-top: 1.5cm;
39
- margin-bottom: 2.2cm; /* Espacio reservado para el footer fijo */
40
- margin-left: 1.2cm;
41
- margin-right: 1.2cm;
38
+ margin-top: {{ margin_top|default('1.5cm') }};
39
+ margin-bottom: {{ margin_bottom|default('2.2cm') }}; /* Espacio reservado para el footer fijo */
40
+ margin-left: {{ margin_left|default('1.2cm') }};
41
+ margin-right: {{ margin_right|default('1.2cm') }};
42
42
  border: 1px solid #303d50;
43
43
  border-radius: 5px;
44
- padding: 15px 15px 5px 15px; /* Espacio interno del borde */
44
+ padding-top: {{ padding_top|default('15px') }};
45
+ padding-bottom: {{ padding_bottom|default('5px') }};
46
+ padding-left: {{ padding_left|default('15px') }};
47
+ padding-right: {{ padding_right|default('15px') }};
45
48
  }
46
49
 
47
50
  /* Pie de página fijo de oficialización */
48
51
  .oficializacion-fija {
49
52
  position: fixed;
50
- bottom: -1.7cm; /* Posicionado dentro del margen inferior */
53
+ bottom: calc(-{{ margin_bottom|default('2.2cm') }} + 0.5cm); /* Posicionado dentro del margen inferior */
51
54
  left: 0;
52
55
  width: 100%;
53
56
  z-index: 9999;
@@ -62,16 +65,16 @@
62
65
  }
63
66
 
64
67
  /* Evitar saltos de página huérfanos dentro de grupos compactos */
65
- .signature-container, .form-group, .choice-container {
68
+ .signature-container, .form-group, .choice-container, .grid-row {
66
69
  page-break-inside: avoid;
67
70
  }
68
71
  {% else %}
69
72
  @page {
70
73
  size: letter;
71
- margin-top: 1.5cm;
72
- margin-bottom: 1.5cm;
73
- margin-left: 1cm;
74
- margin-right: 1cm;
74
+ margin-top: {{ margin_top|default('1.5cm') }};
75
+ margin-bottom: {{ margin_bottom|default('1.5cm') }};
76
+ margin-left: {{ margin_left|default('1cm') }};
77
+ margin-right: {{ margin_right|default('1cm') }};
75
78
  }
76
79
  {% endif %}
77
80
 
@@ -159,7 +162,9 @@
159
162
  display: inline-block;
160
163
  vertical-align: middle;
161
164
  margin-right: 16px;
165
+ margin-bottom: 8px;
162
166
  font-size: 11px;
167
+ line-height: 1.6;
163
168
  }
164
169
 
165
170
  .choice-box {
@@ -280,6 +285,39 @@
280
285
  text-transform: uppercase;
281
286
  }
282
287
 
288
+ /* Preset de Título Principal (con fondo azul oscuro y texto blanco) */
289
+ .section-container.main-section-title {
290
+ background-color: #303d50 !important;
291
+ padding: 4px 10px !important;
292
+ border-radius: 4px !important;
293
+ margin-top: 12px !important;
294
+ margin-bottom: 6px !important;
295
+ border-bottom: none !important;
296
+ page-break-after: avoid !important;
297
+ page-break-inside: avoid !important;
298
+ display: block !important;
299
+ }
300
+
301
+ .section-container.main-section-title .section-title {
302
+ color: #ffffff !important;
303
+ font-size: 11px !important;
304
+ }
305
+
306
+ /* Preset de Subtítulo (con icono y espaciado compacto) */
307
+ .section-container.subtitle-section {
308
+ margin-top: 8px !important;
309
+ margin-bottom: 4px !important;
310
+ border-bottom: 1px solid #cbd5e1 !important;
311
+ padding-bottom: 4px !important;
312
+ page-break-after: avoid !important;
313
+ page-break-inside: avoid !important;
314
+ }
315
+
316
+ .section-container.subtitle-section .section-title {
317
+ color: #303d50 !important;
318
+ font-size: 10px !important;
319
+ }
320
+
283
321
  /* ✍️ Firma */
284
322
  .signature-container {
285
323
  display: flex;
@@ -342,6 +380,49 @@
342
380
  width: 20%;
343
381
  }
344
382
 
383
+ /* 📊 Tabla Genérica */
384
+ .table-container {
385
+ width: 100%;
386
+ margin-top: 10px;
387
+ margin-bottom: 10px;
388
+ }
389
+
390
+ .table-title-bar {
391
+ background-color: #303d50;
392
+ padding: 6px 12px;
393
+ border-radius: 4px 4px 0 0;
394
+ }
395
+
396
+ .assembler-table {
397
+ width: 100%;
398
+ border-collapse: collapse;
399
+ border: 1px solid #cbd5e1;
400
+ font-family: 'Inter', sans-serif;
401
+ font-size: 9.5px;
402
+ background-color: #ffffff;
403
+ }
404
+
405
+ .assembler-table th {
406
+ padding: 6px 10px;
407
+ font-weight: bold;
408
+ border: 1px solid #475569;
409
+ background-color: #303d50;
410
+ color: #ffffff;
411
+ font-size: 9.5px;
412
+ }
413
+
414
+ .assembler-table td {
415
+ padding: 6px 10px;
416
+ border: 1px solid #cbd5e1;
417
+ vertical-align: top;
418
+ font-size: 9.5px;
419
+ color: #334155;
420
+ }
421
+
422
+ .assembler-table tr {
423
+ page-break-inside: avoid;
424
+ }
425
+
345
426
  /* Saltos de Página */
346
427
  .page-break {
347
428
  page-break-before: always;
@@ -0,0 +1,33 @@
1
+ <div class="table-container {{ class_group|default('') }}" style="margin-top: {{ margin_top|default('10px') }}; margin-bottom: {{ margin_bottom|default('10px') }}; {{ style_group|default('') }}">
2
+ {% if titulo %}
3
+ <div class="table-title-bar" style="background-color: #303d50; padding: 6px 12px; border-radius: 4px 4px 0 0;">
4
+ <span style="font-size: 11px; font-weight: bold; color: #ffffff; text-transform: uppercase;">{{ titulo }}</span>
5
+ </div>
6
+ {% endif %}
7
+ <table class="assembler-table" style="width: 100%; border-collapse: collapse; border: 1px solid #cbd5e1; font-family: 'Inter', sans-serif; font-size: 9.5px; {% if titulo %}border-top: none; border-radius: 0 0 4px 4px;{% else %}border-radius: 4px;{% endif %} overflow: hidden;">
8
+ {% if headers %}
9
+ <thead>
10
+ <tr style="background-color: #303d50; color: #ffffff;">
11
+ {% for h in headers %}
12
+ <th style="padding: 6px 10px; font-weight: bold; text-align: {{ h.align|default('left') }}; font-size: 9.5px; border: 1px solid #cbd5e1; {% if h.width %}width: {{ h.width }};{% endif %} {{ h.style|default('') }}" {% if h.colspan %}colspan="{{ h.colspan }}"{% endif %} {% if h.rowspan %}rowspan="{{ h.rowspan }}"{% endif %}>
13
+ {{ h.text }}
14
+ </th>
15
+ {% endfor %}
16
+ </tr>
17
+ </thead>
18
+ {% endif %}
19
+ <tbody>
20
+ {% for row in rows %}
21
+ <tr style="{{ row.style|default('') }}">
22
+ {% for cell in row.cells %}
23
+ <td style="padding: 6px 10px; border: 1px solid #cbd5e1; vertical-align: top; text-align: {{ cell.align|default('left') }}; {{ cell.style|default('') }}"
24
+ {% if cell.rowspan %}rowspan="{{ cell.rowspan }}"{% endif %}
25
+ {% if cell.colspan %}colspan="{{ cell.colspan }}"{% endif %}>
26
+ {{ cell.content|safe }}
27
+ </td>
28
+ {% endfor %}
29
+ </tr>
30
+ {% endfor %}
31
+ </tbody>
32
+ </table>
33
+ </div>
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: assemblerpdf
3
- Version: 1.0.5
3
+ Version: 1.0.7
4
4
  Summary: Generador de PDFs usando WeasyPrint, diseñado para formularios y reportes con componentes genéricos.
5
5
  Author-email: EcosistemaUNP <ecosistema@unp.gov.co>
6
6
  License: MIT
@@ -29,6 +29,7 @@ src/assemblerpdf/templates/assemblerpdf/layout/grid_row.html
29
29
  src/assemblerpdf/templates/assemblerpdf/layout/header.html
30
30
  src/assemblerpdf/templates/assemblerpdf/layout/section.html
31
31
  src/assemblerpdf/templates/assemblerpdf/layout/style.html
32
+ src/assemblerpdf/templates/assemblerpdf/layout/table.html
32
33
  src/assemblerpdf/templates/assemblerpdf/misc/signature.html
33
34
  src/assemblerpdf/templates/sistema/anexos.html
34
35
  src/assemblerpdf/templates/sistema/anexos_limpio.html
@@ -1,10 +0,0 @@
1
- <div class="form-group {{ class_group|default('') }}" style="margin-bottom: {{ margin_bottom|default('8px') }}; {{ style_group|default('') }}">
2
- {% if label %}
3
- {% with label=label class_label=class_label style_label=style_label %}
4
- {% include "assemblerpdf/fields/field_label.html" %}
5
- {% endwith %}
6
- {% endif %}
7
- {% with interactive=interactive name=name valor=valor placeholder=placeholder disabled=disabled class_control=class_control style_control=style_control %}
8
- {% include "assemblerpdf/fields/field_input.html" %}
9
- {% endwith %}
10
- </div>
File without changes
File without changes
File without changes