prueba fallo de imprimir

This commit is contained in:
2026-01-19 09:05:47 +01:00
parent bc9e4c60c5
commit 4cf2f94a7f
13 changed files with 141 additions and 195 deletions

View File

@@ -1,7 +1,7 @@
 
Microsoft Visual Studio Solution File, Format Version 12.00 Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17 # Visual Studio Version 18
VisualStudioVersion = 17.11.35312.102 VisualStudioVersion = 18.1.11312.151 d18.0
MinimumVisualStudioVersion = 10.0.40219.1 MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HerramientaCASA", "HerramientaCASA\HerramientaCASA.csproj", "{60B569DA-FC18-45B9-8ACC-8E29D8C2EA2C}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HerramientaCASA", "HerramientaCASA\HerramientaCASA.csproj", "{60B569DA-FC18-45B9-8ACC-8E29D8C2EA2C}"
EndProject EndProject

View File

@@ -147,7 +147,7 @@
{ {
urlAnterior = await JS.InvokeAsync<string>("eval", "document.referrer"); urlAnterior = await JS.InvokeAsync<string>("eval", "document.referrer");
bd = tsHerramientasCACOA.NuevoContexto(SoloLectura: false); bd = tsHerramientasCACOA.NuevoContexto(SoloLectura: false);
string urlColegio = bd.enumeraciones.First(x => x.Codigo.Contains("CW.URLCOLEGIO")).ValorAlfabetico1; string urlColegio = bd.enumeraciones.FirstOrDefault(x => x.Codigo.Contains("CW.URLCOLEGIO")).ValorAlfabetico1;
if (!string.IsNullOrEmpty(urlAnterior)) if (!string.IsNullOrEmpty(urlAnterior))
@@ -158,18 +158,13 @@
if (rutaActual != "Denegado") if (rutaActual != "Denegado")
{ {
if (!urlAnterior.Contains(urlColegio)) if (urlColegio != null && !urlAnterior.Contains(urlColegio))
{ {
Navigation.NavigateTo("/Denegado", true); Navigation.NavigateTo("/Denegado", true);
} }
} }
} }
else
{
Navigation.NavigateTo("/Denegado", true);
}
if (userState.idUser == 0) if (userState.idUser == 0)
{ {

View File

@@ -51,33 +51,36 @@
protected override async Task OnAfterRenderAsync(bool firstRender) protected override async Task OnAfterRenderAsync(bool firstRender)
{ {
// if (firstRender) if (firstRender)
// { {
// urlAnterior = await JS.InvokeAsync<string>("eval", "document.referrer"); urlAnterior = await JS.InvokeAsync<string>("eval", "document.referrer");
// bd = tsHerramientasCACOA.NuevoContexto(SoloLectura: false); bd = tsHerramientasCACOA.NuevoContexto(SoloLectura: false);
// string urlColegio = bd.enumeraciones.First(x => x.Codigo.Contains("CW.URLCOLEGIO")).ValorAlfabetico1; string urlColegio = bd.enumeraciones.First(x => x.Codigo.Contains("CW.URLCOLEGIO")).ValorAlfabetico1;
// if (!string.IsNullOrEmpty(urlAnterior)) if (!string.IsNullOrEmpty(urlAnterior))
// { {
// rutaActual = Navigation.ToBaseRelativePath(Navigation.Uri); rutaActual = Navigation.ToBaseRelativePath(Navigation.Uri);
// if (rutaActual != "Denegado") if (rutaActual != "Denegado")
// { {
// if (!urlAnterior.Contains(urlColegio)) if (urlColegio != null && !urlAnterior.Contains(urlColegio))
// { {
// Navigation.NavigateTo("/Denegado", true); Navigation.NavigateTo("/Denegado", true);
// } }
// } }
// } }
// else else
// { {
// Navigation.NavigateTo("/Denegado", true); if (urlColegio != null)
// } {
// StateHasChanged(); Navigation.NavigateTo("/Denegado", true);
// } }
}
StateHasChanged();
}
} }
} }

View File

@@ -140,7 +140,7 @@
if (rutaActual != "Denegado") if (rutaActual != "Denegado")
{ {
if (!urlAnterior.Contains(urlColegio)) if (urlColegio != null && !urlAnterior.Contains(urlColegio))
{ {
Navigation.NavigateTo("/Denegado", true); Navigation.NavigateTo("/Denegado", true);
} }

View File

@@ -376,7 +376,18 @@
public async Task imprimir() public async Task imprimir()
{ {
var cssPath = Path.Combine(Environment.CurrentDirectory, "wwwroot", "Content", "Site.css");
var a = PdfService.obtenerURL();
mensajes.Add(new ToastMessage
{
Type = ToastType.Danger,
Message = a,
});
try
{
var cssPath = Path.Combine(Environment.CurrentDirectory, "wwwroot", "Content", "Site.css");
var cssContent = await File.ReadAllTextAsync(cssPath); var cssContent = await File.ReadAllTextAsync(cssPath);
var contenidoHtml = await JSA.InvokeAsync<string>("obtenerPDFImprimir", "DespachoImprimir"); var contenidoHtml = await JSA.InvokeAsync<string>("obtenerPDFImprimir", "DespachoImprimir");
@@ -392,14 +403,22 @@
</body> </body>
</html>"; </html>";
var logoByte = bd.ficheros.First(x => x.NombreFichero.Contains("LogoColegio2")).Fichero;
string logo64 = Convert.ToBase64String(logoByte); var arrayPDF = PdfService.GenerarPdf("fullHtml");
var arrayPDF = PdfService.GenerarPdf(fullHtml, logo64);
string base64Pdf = Convert.ToBase64String(arrayPDF); string base64Pdf = Convert.ToBase64String(arrayPDF);
await JSA.InvokeVoidAsync("descargarPdf", "SimulacionHerramientaCASA_" + DateTime.Now , base64Pdf); await JSA.InvokeVoidAsync("descargarPdf", "SimulacionHerramientaCASA_" + DateTime.Now , null);
}catch(Exception ex)
{
mensajes.Add(new ToastMessage
{
Type = ToastType.Danger,
Message = ex.Message,
});
}
} }
} }

View File

@@ -372,11 +372,8 @@
</html>"; </html>";
var logoByte = bd.ficheros.First(x => x.NombreFichero.Contains("LogoColegio2")).Fichero;
string logo64 = Convert.ToBase64String(logoByte); var arrayPDF = PdfService.GenerarPdf(fullHtml);
var arrayPDF = PdfService.GenerarPdf(fullHtml, logo64);
string base64Pdf = Convert.ToBase64String(arrayPDF); string base64Pdf = Convert.ToBase64String(arrayPDF);

View File

@@ -540,11 +540,7 @@
</html>"; </html>";
var logoByte = bd.ficheros.First(x => x.NombreFichero.Contains("LogoColegio2")).Fichero; var arrayPDF = PdfService.GenerarPdf(fullHtml);
string logo64 = Convert.ToBase64String(logoByte);
var arrayPDF = PdfService.GenerarPdf(fullHtml, logo64);
string base64Pdf = Convert.ToBase64String(arrayPDF); string base64Pdf = Convert.ToBase64String(arrayPDF);

View File

@@ -611,11 +611,7 @@
</html>"; </html>";
var logoByte = bd.ficheros.First(x => x.NombreFichero.Contains("LogoColegio2")).Fichero; var arrayPDF = PdfService.GenerarPdf(fullHtml);
string logo64 = Convert.ToBase64String(logoByte);
var arrayPDF = PdfService.GenerarPdf(fullHtml, logo64);
string base64Pdf = Convert.ToBase64String(arrayPDF); string base64Pdf = Convert.ToBase64String(arrayPDF);

View File

@@ -9,6 +9,7 @@ using Microsoft.AspNetCore.Components.Server.ProtectedBrowserStorage;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using System.Globalization; using System.Globalization;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using tsUtilidades;
var builder = WebApplication.CreateBuilder(args); var builder = WebApplication.CreateBuilder(args);
@@ -41,6 +42,7 @@ builder.Services.AddRazorPages()
options.JsonSerializerOptions.ReferenceHandler = System.Text.Json.Serialization.ReferenceHandler.IgnoreCycles; options.JsonSerializerOptions.ReferenceHandler = System.Text.Json.Serialization.ReferenceHandler.IgnoreCycles;
}); });
// Necesario para ver porqu<71> est<73> fallando ciertas cosas que dan el error Circuit // Necesario para ver porqu<71> est<73> fallando ciertas cosas que dan el error Circuit
builder.Services.AddServerSideBlazor().AddCircuitOptions(option => { option.DetailedErrors = true; }); builder.Services.AddServerSideBlazor().AddCircuitOptions(option => { option.DetailedErrors = true; });
builder.Services.AddHttpContextAccessor(); builder.Services.AddHttpContextAccessor();
@@ -87,6 +89,8 @@ app.UseRouting();
app.UseAuthentication(); app.UseAuthentication();
app.UseAuthorization(); app.UseAuthorization();
app.MapRazorPages();
app.UseAntiforgery(); app.UseAntiforgery();
app.Use(async (context, next) => app.Use(async (context, next) =>
@@ -117,6 +121,43 @@ app.Use(async (context, next) =>
await next(); await next();
}); });
app.MapGet("/HeaderPdf", () =>
{
var bd = tsHerramientasCACOA.NuevoContexto(SoloLectura: true);
var logoByte = bd.ficheros
.First(x => x.NombreFichero.Contains("LogoColegio2"))
.Fichero;
var logoBase64 = Convert.ToBase64String(logoByte);
string html = $"<!DOCTYPE html>\r\n" +
$"<html>\r\n" +
$"<head>\r\n" +
$"<meta charset='utf-8' />\r\n" +
$"<title></title>\r\n" +
$"</head>\r\n" +
$"<body style='margin:0px !important;'>\r\n" +
$"<div style='height:55px; width:100%; font-size:12px; color:#078b98; font-weight:bold; background-color: #D7ECEF; display:flex;'>\r\n" +
$"<table style='width:100%; border:0; border-collapse:collapse;'>\r\n" +
$" <tr>\r\n" +
$"<td style='text-align: left; width: 50%; padding-left: 10px; padding-top:8px;'>\r\n" +
$"<img style='height: 40px; border-radius: 10px !important;' src='data:image/jpeg;base64,{logoBase64}' alt='Image'>\r\n" +
$"</td>\r\n" +
$"<td style='text-align: right; width: 50%; padding: 10px;'>\r\n" +
$"Costes Asociados a los Servicios de Arquitectura - CASA\r\n" +
$"</td>\r\n" +
$"</tr>\r\n" +
$"</table>\r\n" +
$"</div>\r\n" +
$"</body>\r\n" +
$"</html>";
return Results.Content(html, "text/html");
});
app.MapRazorComponents<App>() app.MapRazorComponents<App>()
.AddInteractiveServerRenderMode(); .AddInteractiveServerRenderMode();

View File

@@ -1,174 +1,76 @@
using DinkToPdf; using bdHerramientaCACOA.dbcontext;
using BlazorBootstrap;
using DinkToPdf;
using DinkToPdf.Contracts; using DinkToPdf.Contracts;
using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Packaging;
using Microsoft.EntityFrameworkCore.Metadata.Internal;
using System.Text; using System.Text;
namespace HerramientaCASA namespace HerramientaCASA
{ {
public class ServicioPDF public class ServicioPDF
{ {
private readonly IConverter _converter; private readonly IConverter _converter;
private readonly IWebHostEnvironment _env;
public ServicioPDF(IConverter converter) public ServicioPDF(IConverter converter, IWebHostEnvironment env)
{ {
_converter = converter; _converter = converter;
_env = env;
} }
public byte[] GenerarPdf(string html, string logoBase64) public byte[] GenerarPdf(string html)
{ {
var headerPath = Path.Combine(Path.GetTempPath(), $"header_{Guid.NewGuid()}.html");
File.WriteAllText(headerPath, rellenarHeader(logoBase64));
try try
{ {
var doc = new HtmlToPdfDocument() var doc = new HtmlToPdfDocument()
{ {
GlobalSettings = { GlobalSettings = {
PaperSize = PaperKind.A4, PaperSize = PaperKind.A4,
Orientation = Orientation.Portrait, Orientation = DinkToPdf.Orientation.Portrait,
Margins= new MarginSettings Margins= new MarginSettings
{ {
Top = 11.8, Top = 11.8,
Left = 0, Left = 0,
Right = 0, Right = 0,
Bottom = 10 Bottom = 10
},
}, },
},
Objects = { Objects = {
new ObjectSettings() { new ObjectSettings() {
HtmlContent = html, HtmlContent = html,
HeaderSettings = new HeaderSettings HeaderSettings = new HeaderSettings
{ {
HtmUrl = headerPath //HtmUrl = Path.Combine(Environment.CurrentDirectory, "wwwroot", "Imprimir", "HeaderImprimir.html")
//HtmUrl = "https://localhost:7275/HeaderPdf"
HtmUrl = obtenerURL()
}, },
} }
} }
}; };
return _converter.Convert(doc); return _converter.Convert(doc);
} }
finally catch (Exception ex)
{ {
if (headerPath != null && File.Exists(headerPath)) throw new Exception(ex.Message);
{ }
File.Delete(headerPath); }
}
public string obtenerURL()
{
string url = "";
var bd = tsHerramientasCACOA.NuevoContexto(SoloLectura: false);
if (_env.IsDevelopment())
{
url = "https://localhost:7275/HeaderPdf";
}
else
{
url = bd.enumeraciones.First(x => x.Codigo.Contains("CW.DOMINIO")).ValorAlfabetico1 + "/HeaderPdf";
} }
return url;
} }
private string rellenarHeader(string logoBase64)
{
string html = "";
html = $"<!DOCTYPE html>\r\n" +
$"<html>\r\n" +
$"<head>\r\n" +
$"<meta charset='utf-8' />\r\n" +
$"<title></title>\r\n"+
$"</head>\r\n"+
$"<body style='margin:0px !important;'>\r\n" +
$"<div style='height:55px; width:100%; font-size:12px; color:#078b98; font-weight:bold; background-color: #D7ECEF; display:flex;'>\r\n"+
$"<table style='width:100%; border:0; border-collapse:collapse;'>\r\n" +
$" <tr>\r\n"+
$"<td style='text-align: left; width: 50%; padding-left: 10px; padding-top:8px;'>\r\n" +
$"<img style='height: 40px; border-radius: 10px !important;' src='data:image/jpeg;base64,{logoBase64}' alt='Image'>\r\n" +
$"</td>\r\n"+
$"<td style='text-align: right; width: 50%; padding: 10px;'>\r\n"+
$"Costes Asociados a los Servicios de Arquitectura - CASA\r\n"+
$"</td>\r\n"+
$"</tr>\r\n"+
$"</table>\r\n"+
$"</div>\r\n"+
$"</body>\r\n"+
$"</html>";
return html;
}
// /// <summary>
// /// Convierte HTML a PDF (bytes) usando HtmlRenderer.PdfSharpCore, inyectando site.css.
// /// </summary>
// /// <param name="htmlBody">
// /// Contenido HTML del body (o el documento completo). Si pasas solo el body, se envolverá automáticamente.
// /// </param>
// /// <param name="siteCssPath">Ruta al archivo site.css en el servidor (p. ej. "wwwroot/css/site.css").</param>
// /// <param name="baseUri">
// /// (Opcional) Base para resolver rutas relativas.
// /// Se inserta como &lt;base href="..."&gt; en &lt;head&gt;.
// /// </param>
// /// <param name="pageSize">Tamaño de página (A4 por defecto).</param>
// /// <param name="margin">Margen en puntos (40 por defecto).</param>
// public byte[] HtmlToPdfWithSiteCss(
// string htmlBody,
// string siteCssPath,
// string? baseUri = null,
// PdfSharpCore.PageSize pageSize = PdfSharpCore.PageSize.A4,
// int margin = 40
// )
// {
// if (string.IsNullOrWhiteSpace(htmlBody))
// throw new ArgumentException("El HTML no puede estar vacío.", nameof(htmlBody));
// if (string.IsNullOrWhiteSpace(siteCssPath) || !File.Exists(siteCssPath))
// throw new FileNotFoundException("No se encontró el archivo CSS indicado.", siteCssPath);
// // Evitar problemas de codificación (tildes, ñ)
// Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
// // Lee el CSS local
// var css = File.ReadAllText(siteCssPath);
// // HTML mínimo
// bool isFullHtml = htmlBody.Contains("<html", StringComparison.OrdinalIgnoreCase);
// string headExtras = $"<meta charset='utf-8'><style>{css}</style>";
// if (!string.IsNullOrWhiteSpace(baseUri))
// headExtras = $"<base href=\"{baseUri}\">{headExtras}";
// string fullHtml = isFullHtml
// ? InjectIntoHead(htmlBody, headExtras)
// : $"<!doctype html><html><head>{headExtras}</head><body>{htmlBody}</body></html>";
// var cfg = new PdfGenerateConfig
// {
// PageSize = (PdfSharp.PageSize)pageSize,
// MarginLeft = margin,
// MarginRight = margin,
// MarginTop = margin,
// MarginBottom = margin
// };
// using var doc = PdfGenerator.GeneratePdf(fullHtml, cfg);
// using var ms = new MemoryStream();
// doc.Save(ms);
// return ms.ToArray();
// // Inserta contenido en <head> (si existe); si no, lo crea.
// static string InjectIntoHead(string html, string toInject)
// {
// int headOpen = html.IndexOf("<head", StringComparison.OrdinalIgnoreCase);
// if (headOpen >= 0)
// {
// int headClose = html.IndexOf('>', headOpen);
// if (headClose > headOpen)
// {
// return html.Insert(headClose + 1, toInject);
// }
// }
// // No hay <head>, lo creamos
// int htmlOpen = html.IndexOf("<html", StringComparison.OrdinalIgnoreCase);
// if (htmlOpen >= 0)
// {
// int htmlTagEnd = html.IndexOf('>', htmlOpen);
// if (htmlTagEnd > htmlOpen)
// {
// return html.Insert(htmlTagEnd + 1, $"<head>{toInject}</head>");
// }
// }
// // Documento raro: envolvemos completo
// return $"<!doctype html><html><head>{toInject}</head><body>{html}</body></html>";
// }
// }
//}
} }
} }

View File

@@ -14,8 +14,11 @@
//"ReadOnlyConnection": "Server=77.229.174.85;Port=22222;Database=herramientascacoa;User Id=cacoa;Password=cacoa2018-;" //"ReadOnlyConnection": "Server=77.229.174.85;Port=22222;Database=herramientascacoa;User Id=cacoa;Password=cacoa2018-;"
// CONEXIÓN COACYLE // CONEXIÓN COACYLE
"WriteConnection": "Server=77.229.174.85;Port=22222;Database=herramientascoacyle;User Id=cacoa;Password=cacoa2018-;", //"WriteConnection": "Server=77.229.174.85;Port=22222;Database=herramientascoacyle;User Id=cacoa;Password=cacoa2018-;",
"ReadOnlyConnection": "Server=77.229.174.85;Port=22222;Database=herramientascoacyle;User Id=cacoa;Password=cacoa2018-;" //"ReadOnlyConnection": "Server=77.229.174.85;Port=22222;Database=herramientascoacyle;User Id=cacoa;Password=cacoa2018-;"
"WriteConnection": "Server=localhost;Port=22222;Database=herramientascoacyle;User Id=cacoa;Password=cacoa2018-;",
"ReadOnlyConnection": "Server=localhost;Port=22222;Database=herramientascoacyle;User Id=cacoa;Password=cacoa2018-;"
}, },
"AllowedHosts": "*" "AllowedHosts": "*"
} }

File diff suppressed because one or more lines are too long