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.
- {assemblerpdf-1.0.5/src/assemblerpdf.egg-info → assemblerpdf-1.0.7}/PKG-INFO +1 -1
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/pyproject.toml +1 -1
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/assemblers/base.py +52 -36
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/core.py +6 -6
- assemblerpdf-1.0.7/src/assemblerpdf/templates/assemblerpdf/fields/input.html +12 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/assemblerpdf/fields/textarea.html +1 -1
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/assemblerpdf/layout/header.html +5 -5
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/assemblerpdf/layout/style.html +92 -11
- assemblerpdf-1.0.7/src/assemblerpdf/templates/assemblerpdf/layout/table.html +33 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7/src/assemblerpdf.egg-info}/PKG-INFO +1 -1
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf.egg-info/SOURCES.txt +1 -0
- assemblerpdf-1.0.5/src/assemblerpdf/templates/assemblerpdf/fields/input.html +0 -10
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/MANIFEST.in +0 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/README.md +0 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/setup.cfg +0 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/__init__.py +0 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/assemblers/__init__.py +0 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/assemblers/form.py +0 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/assemblers/report.py +0 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/fonts/Inter-Bold.ttf +0 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/fonts/Inter-Medium.ttf +0 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/fonts/Inter-Regular.ttf +0 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/img/Logo-unp-rojo.png +0 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/img/logo-mininterior-rojo.jpg +0 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/assemblerpdf/fields/checkbox.html +0 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/assemblerpdf/fields/field_input.html +0 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/assemblerpdf/fields/field_label.html +0 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/assemblerpdf/fields/radio.html +0 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/assemblerpdf/layout/footer.html +0 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/assemblerpdf/layout/footer_fixed.html +0 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/assemblerpdf/layout/grid_row.html +0 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/assemblerpdf/layout/section.html +0 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/assemblerpdf/misc/signature.html +0 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/anexos.html +0 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/anexos_limpio.html +0 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/archivese.html +0 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/autoriza_envio.html +0 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/checkbox.html +0 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/control_cambios.html +0 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/datos_basicosinf.html +0 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/datos_ot.html +0 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/encaso_de.html +0 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/fiila_dos_check.html +0 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/fila_cinco_zona.html +0 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/fila_cuatro.html +0 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/fila_cuatro_si_no.html +0 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/fila_cuatro_zona.html +0 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/fila_dos.html +0 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/fila_dos_zona.html +0 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/fila_instructivo.html +0 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/fila_tres.html +0 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/fila_tres_checkbox.html +0 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/fila_tres_zona.html +0 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/fila_uno.html +0 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/firma.html +0 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/firma_doble.html +0 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/firmaop2.html +0 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/firmas_oficializacion.html +0 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/hechos_sobrevinientes.html +0 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/hechos_sobrevinientes_vacio.html +0 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/iformfilacuatro.html +0 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/informacion_doble.html +0 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/input_2checks.html +0 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/input_check.html +0 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/input_checkbox.html +0 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/input_solitario.html +0 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/label_input_dos.html +0 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/leyenda_autoriza_correo.html +0 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/leyenda_superiol.html +0 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/logos.html +0 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/manifiesto.html +0 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/notificacion_correo.html +0 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/oficializacion.html +0 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/pregunta_si_no.html +0 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/pregunta_tresopciones.html +0 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/qr_oficializacion.html +0 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/situacion_amenaza.html +0 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/style.html +0 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/subtitulo_icono.html +0 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/subtitulo_icono_largo.html +0 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/tabla_doble.html +0 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/tabla_instructivo.html +0 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/tabla_matriz_riesgo.html +0 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/tabla_proyeccion.html +0 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/tabla_simple.html +0 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/texarea.html +0 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/tipo_identificacion.html +0 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/tipos_checkbox.html +0 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/titulo.html +0 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/titulo_logo.html +0 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/titulo_principal.html +0 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/utils/__init__.py +0 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/utils/template_loader.py +0 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf.egg-info/dependency_links.txt +0 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf.egg-info/requires.txt +0 -0
- {assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf.egg-info/top_level.txt +0 -0
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "assemblerpdf"
|
|
7
|
-
version = "1.0.
|
|
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
|
|
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
|
-
#
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
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
|
-
|
|
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('') }}">
|
{assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/assemblerpdf/layout/header.html
RENAMED
|
@@ -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="{{
|
|
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="{{
|
|
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>
|
{assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/assemblerpdf/layout/style.html
RENAMED
|
@@ -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:
|
|
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: -
|
|
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>
|
|
@@ -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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/assemblerpdf/fields/radio.html
RENAMED
|
File without changes
|
{assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/assemblerpdf/layout/footer.html
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/anexos_limpio.html
RENAMED
|
File without changes
|
|
File without changes
|
{assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/autoriza_envio.html
RENAMED
|
File without changes
|
|
File without changes
|
{assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/control_cambios.html
RENAMED
|
File without changes
|
{assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/datos_basicosinf.html
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/fiila_dos_check.html
RENAMED
|
File without changes
|
{assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/fila_cinco_zona.html
RENAMED
|
File without changes
|
{assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/fila_cuatro.html
RENAMED
|
File without changes
|
{assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/fila_cuatro_si_no.html
RENAMED
|
File without changes
|
{assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/fila_cuatro_zona.html
RENAMED
|
File without changes
|
|
File without changes
|
{assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/fila_dos_zona.html
RENAMED
|
File without changes
|
{assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/fila_instructivo.html
RENAMED
|
File without changes
|
|
File without changes
|
{assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/fila_tres_checkbox.html
RENAMED
|
File without changes
|
{assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/fila_tres_zona.html
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/firma_doble.html
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/iformfilacuatro.html
RENAMED
|
File without changes
|
{assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/informacion_doble.html
RENAMED
|
File without changes
|
{assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/input_2checks.html
RENAMED
|
File without changes
|
{assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/input_check.html
RENAMED
|
File without changes
|
{assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/input_checkbox.html
RENAMED
|
File without changes
|
{assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/input_solitario.html
RENAMED
|
File without changes
|
{assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/label_input_dos.html
RENAMED
|
File without changes
|
|
File without changes
|
{assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/leyenda_superiol.html
RENAMED
|
File without changes
|
|
File without changes
|
{assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/manifiesto.html
RENAMED
|
File without changes
|
|
File without changes
|
{assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/oficializacion.html
RENAMED
|
File without changes
|
{assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/pregunta_si_no.html
RENAMED
|
File without changes
|
|
File without changes
|
{assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/qr_oficializacion.html
RENAMED
|
File without changes
|
{assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/situacion_amenaza.html
RENAMED
|
File without changes
|
|
File without changes
|
{assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/subtitulo_icono.html
RENAMED
|
File without changes
|
|
File without changes
|
{assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/tabla_doble.html
RENAMED
|
File without changes
|
{assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/tabla_instructivo.html
RENAMED
|
File without changes
|
|
File without changes
|
{assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/tabla_proyeccion.html
RENAMED
|
File without changes
|
{assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/tabla_simple.html
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/tipos_checkbox.html
RENAMED
|
File without changes
|
|
File without changes
|
{assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/titulo_logo.html
RENAMED
|
File without changes
|
{assemblerpdf-1.0.5 → assemblerpdf-1.0.7}/src/assemblerpdf/templates/sistema/titulo_principal.html
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|