Visual Studio 2022+
Extensiones → Administrar extensiones → busca “XtudioPdf” → Instalar, y reinicia Visual Studio.
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.
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
Haz doble clic en un archivo .pdfx de tu proyecto y el diseñador se abre como una pestaña más, con la vista previa del PDF en vivo. Guardas con Ctrl+S. No necesitas levantar tu app.
Sin extensiones, abre el diseñador sobre una plantilla con:
Con AddXtudioPdf() el diseñador también está en /xtudiopdf mientras tu app corre en Development, para diseñar con datos reales. Nunca se abre en producción.
Crea un reporte nuevo con su DTO y su plantilla: xtudiopdf new Invoice o clic derecho en una carpeta del proyecto: Agregar → XtudioPdf document… en Visual Studio, Nuevo documento XtudioPdf… en VS Code.
Cada .pdfx del proyecto se embebe al compilar y se revisa contra su DTO: si un campo no existe, el compilador te avisa.
// Program.cs
builder.Services.AddPdfReports();
// Invoice.cs: tu DTO y su reporte
[PdfDataSource]
public sealed record InvoiceDto(string Number, string Customer, decimal Total, List<LineDto> Lines);
public sealed class InvoiceReport(PdfTemplates templates) : PdfReport<InvoiceDto>(templates);
// Tu endpoint devuelve el PDF
app.MapGet("/invoices/{id}.pdf", async (int id, InvoiceReport report, AppDb db) =>
Results.File(report.Render(await db.GetInvoiceAsync(id)), "application/pdf", $"invoice-{id}.pdf"));
Sin ASP.NET Core (XtudioPdf.Core):
var templates = new PdfTemplates().AddAssembly(typeof(Program).Assembly);
byte[] pdf = templates.Render("Invoice", invoice);
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. Si tienes una clave Pro, ponla en appsettings.json o en la variable de entorno XTUDIOPDF_LICENSE_KEY. Se valida sin conexión.
"XtudioPdf": { "LicenseKey": "XTPD.…" }