Tus datos: una clase de C#
[PdfDataSource("Factura")]
public record FacturaDto(
string Numero,
ClienteDto Cliente,
List<LineaDto> Lineas,
decimal Total);
Empezar
Diseñas la plantilla de forma visual dentro de Visual Studio o VS Code. Al compilar, queda embebida en tu DLL. En producción tu código genera el PDF en el servidor, sin navegador y sin archivos que copiar.
[PdfDataSource("Factura")]
public record FacturaDto(
string Numero,
ClienteDto Cliente,
List<LineaDto> Lineas,
decimal Total);
Instala solo uno. XtudioPdf.AspNetCore ya incluye el motor.
| Tu proyecto | Paquete |
|---|---|
| Web API, Minimal API, MVC o Razor Pages (ASP.NET Core) | XtudioPdf.AspNetCore |
| Worker Service, consola, escritorio (WPF, WinForms, MAUI), Azure Functions o una librería propia | XtudioPdf.Core |
Requiere .NET 8 o .NET 10. Funciona en Windows, Linux, macOS y Docker. No es compatible con .NET Framework (4.x).
Extensiones → Administrar extensiones → busca “XtudioPdf” → Instalar, y reinicia Visual Studio.
Extensiones (Ctrl+Shift+X) → busca “XtudioPdf” → Instalar.
Eso es todo. La primera vez que abres un .pdfx, la extensión instala sola el diseñador (la herramienta xtudiopdf) y lo mantiene actualizado. Sin extensión, instálalo a mano: dotnet tool install -g XtudioPdf.Tool
Clic derecho en la carpeta donde guardas tus reportes y agrega un documento XtudioPdf. Ponle un nombre, por ejemplo Factura.
xtudiopdf new FacturaDoble clic en Factura.pdfx y el diseñador se abre como una pestaña más de tu editor. No necesitas ejecutar tu app.
1
2
3
4
La pestaña Datos muestra las propiedades de tu clase. Nunca escribes un campo a mano: lo eliges.
1
2
3
4
{{Cliente.Nombre}}.{{Total:N2}} o el monto en letras {{Total:letras}} van después de los dos puntos.
La previsualización usa tus datos de ejemplo: el archivo .sample.json junto a la plantilla o un método estático GetSampleData() en tu clase.
Cada .pdfx del proyecto se embebe al compilar y se valida contra su clase: si un campo no existe, el compilador te avisa.
// Program.cs
builder.Services.AddPdfReports();
// Reportes/FacturaReporte.cs: se crea sola; XtudioPdf la completa a partir del .pdfx
public sealed partial class FacturaReporte
{
public byte[] Generar(FacturaDto datos) => Render(datos);
}
// Tu endpoint devuelve el PDF
app.MapGet("/facturas/{id:int}/pdf", async (int id, FacturaReporte reporte, AppDb db) =>
await db.Facturas.FindAsync(id) is { } factura
? Results.File(reporte.Generar(factura), "application/pdf", $"factura-{id}.pdf")
: Results.NotFound());
Sin ASP.NET Core (XtudioPdf.Core):
var templates = new PdfTemplates().AddAssembly(typeof(Program).Assembly);
byte[] pdf = templates.Render("Factura", factura);
Qué haces con los bytes depende de ti: devolverlos desde tu API, guardarlos, adjuntarlos a un correo o enviarlos a la autoridad tributaria junto con el XML.
Community funciona sin clave e incluye el 100% de las funciones para desarrolladores individuales y empresas con menos de $1M USD de ingresos anuales. Con una clave Pro, ponla en appsettings.json o en la variable de entorno XTUDIOPDF_LICENSE_KEY.
"XtudioPdf": { "LicenseKey": "XTPD.…" }