Cómo usar direcciones URL base en la generación de PDFs con C#

How to Use Base URLs & Asset Encoding in C# .NET 10

This article was translated from English: Does it need improvement?
Translated
View the article in English

Los URLs base en IronPDF permiten que los activos CSS, JavaScript e imagen sean cargados correctamente durante la conversión HTML a PDF al especificar el parámetro BaseUrlOrPath, que puede ser una URL web o una ruta de archivo local para la resolución de activos relativos. En los portales de facturación electrónica española —plataformas web ASP.NET donde los usuarios acceden a sus facturas Facturae, gestionan sus envíos al SII o consultan el estado de sus registros VeriFactu ante la AEAT— la configuración correcta de la URL base es imprescindible para que las plantillas de factura carguen el logotipo corporativo, los estilos CSS de la empresa y los recursos gráficos desde rutas relativas al portal, generando PDFs visualmente idénticos a la vista web.

Inicio rápido: Implementar URL base en IronPDF

Empiece a utilizar IronPDF implementando direcciones URL base para cargar activos sin problemas durante la conversión de HTML a PDF en .NET C#. Este ejemplo demuestra cómo establecer el BaseUrlOrPath para asegurar que todos los CSS, JavaScript e imágenes sean referenciados correctamente, simplificando la generación de PDFs con una configuración mínima.

  1. Instala IronPDF con el Administrador de Paquetes NuGet

    PM > Install-Package IronPdf
  2. Copie y ejecute este fragmento de código.

    new IronPdf.ChromePdfRenderer().RenderHtmlAsPdf("<img src='icons/logo.png'>", @"C:\site\assets\").SaveAs("with-assets.pdf");
  3. Despliegue para probar en su entorno real

    Comienza a usar IronPDF en tu proyecto hoy mismo con una prueba gratuita

    arrow pointer

Convert.ToBase64String


¿Cómo renderizar archivos PDF a partir de cadenas HTML con activos de imagen y CSS?

Al convertir cadenas de HTML a PDF, establece un parámetro BaseUrlOrPath para activos como archivos CSS, JavaScript e imágenes. El BaseUrlOrPath especifica la URL base desde la cual se cargan todos los activos de manera relativa. CustomCssUrl

Puede tratarse de una URL web que empiece por 'http' para cargar activos remotos o de una ruta de archivo local para acceder a activos en disco. Configurar correctamente el BaseUrlOrPath asegura que los activos se carguen adecuadamente durante la conversión. Para obtener más información sobre la conversión de HTML a PDF, consulte nuestro completo Tutorial de HTML a PDF.

:path=/static-assets/pdf/content-code-examples/how-to/base-urls-baseurl.cs
using IronPdf;

// Instantiate ChromePdfRenderer
ChromePdfRenderer renderer = new ChromePdfRenderer();

string baseUrl = @"C:\site\assets\";
string html = "<img src='icons/iron.png'>";

// Render HTML to PDF
PdfDocument pdf = renderer.RenderHtmlAsPdf(html, baseUrl);

// Export PDF
pdf.SaveAs("html-with-assets.pdf");
Imports IronPdf

' Instantiate ChromePdfRenderer
Private renderer As New ChromePdfRenderer()

Private baseUrl As String = "C:\site\assets\"
Private html As String = "<img src='icons/iron.png'>"

' Render HTML to PDF
Private pdf As PdfDocument = renderer.RenderHtmlAsPdf(html, baseUrl)

' Export PDF
pdf.SaveAs("html-with-assets.pdf")
$vbLabelText   $csharpLabel

Para situaciones complejas en las que intervienen recursos externos, consulte nuestra guía sobre gestión de fuentes o adición de imágenes a PDF.

¿Cómo configuro las URL base en aplicaciones MVC?

En las aplicaciones MVC, especificar las rutas de los archivos de imagen requiere una configuración cuidadosa. Para asegurar que IronPDF encuentre las imágenes y las muestre correctamente en el sitio web, configure el baseUrl y el atributo HTML src="" correctamente.

Con la jerarquía de archivos mostrada abajo configurada

  • baseUrlOrPath a @"wwwroot/image"
  • Atributo src a "../image/Sample.jpg"
wwwroot
└── image
    ├── Sample.jpg
    └── Sample.png

Por ejemplo:

:path=/static-assets/pdf/content-code-examples/how-to/base-mvc.cs
// Instantiate ChromePdfRenderer
ChromePdfRenderer renderer = new ChromePdfRenderer();

// Render HTML to PDF
PdfDocument pdf = renderer.RenderHtmlAsPdf("html.Result", @"wwwroot/image");
' Instantiate ChromePdfRenderer
Dim renderer As New ChromePdfRenderer()

' Render HTML to PDF
Dim pdf As PdfDocument = renderer.RenderHtmlAsPdf("html.Result", "wwwroot/image")
$vbLabelText   $csharpLabel

<img src="../image/Sample.jpg"/>
<img src="../image/Sample.png"/>

<img src="../image/Sample.jpg"/>
<img src="../image/Sample.png"/>
HTML

Para implementaciones específicas de ASP.NET Core MVC, consulte nuestra guía CSHTML to PDF (MVC Core) guide.

¿Qué formatos de ruta de archivo debo evitar?

Advertencia

Formatos de ruta de archivo que no funcionan

Estos formatos funcionan en el navegador Chrome pero apuntan a directorios incorrectos en aplicaciones MVC. Funcionan con IronPDF si se proporciona baseUrlOrPath en el método RenderHtmlAsPdf:

<img src="image/footer.png"/>  
<img src="./image/footer.png"/>  
<img src="image/footer.png"/>  
<img src="./image/footer.png"/>  
HTML

Estos formatos funcionan con aplicaciones MVC, pero fallan con las rutas de archivos IronPDF:

<img src="/image/footer.png"/>  
<img src="~/image/footer.png"/>
<img src="/image/footer.png"/>  
<img src="~/image/footer.png"/>
HTML

)}]

¿Cuáles son los consejos habituales para solucionar problemas de carga de activos?

Cuando los activos no se cargan, tenga en cuenta estos pasos para solucionar problemas:

  1. Verifica rutas absolutas: Usa rutas de archivo absolutas durante el desarrollo para confirmar la accesibilidad
  2. Verifica permisos de archivos: Asegúrate de que la aplicación tenga acceso de lectura a directorios de activos
  3. Prueba con URLs remotas: Usa URLs completamente calificadas para aislar problemas de rutas
  4. Habilitar registro: Utilice el registro personalizado de IronPDF para depurar la carga de activos
// Example: Debug asset loading with absolute paths
ChromePdfRenderer renderer = new ChromePdfRenderer();

// Enable debug logging
renderer.RenderingOptions.EnableJavaScript = true;
renderer.RenderingOptions.WaitFor.RenderDelay(500); // Give assets time to load

// Use absolute path for testing
string absoluteBasePath = Path.GetFullPath(@"C:\MyProject\wwwroot\assets");
string html = @"
    <html>
    <head>
        <link rel='stylesheet' href='styles/main.css'>
    </head>
    <body>
        <img src='images/logo.png' />
        <script src='scripts/app.js'></script>
    </body>
    </html>";

PdfDocument pdf = renderer.RenderHtmlAsPdf(html, absoluteBasePath);
// Example: Debug asset loading with absolute paths
ChromePdfRenderer renderer = new ChromePdfRenderer();

// Enable debug logging
renderer.RenderingOptions.EnableJavaScript = true;
renderer.RenderingOptions.WaitFor.RenderDelay(500); // Give assets time to load

// Use absolute path for testing
string absoluteBasePath = Path.GetFullPath(@"C:\MyProject\wwwroot\assets");
string html = @"
    <html>
    <head>
        <link rel='stylesheet' href='styles/main.css'>
    </head>
    <body>
        <img src='images/logo.png' />
        <script src='scripts/app.js'></script>
    </body>
    </html>";

PdfDocument pdf = renderer.RenderHtmlAsPdf(html, absoluteBasePath);
Imports System.IO

' Example: Debug asset loading with absolute paths
Dim renderer As New ChromePdfRenderer()

' Enable debug logging
renderer.RenderingOptions.EnableJavaScript = True
renderer.RenderingOptions.WaitFor.RenderDelay(500) ' Give assets time to load

' Use absolute path for testing
Dim absoluteBasePath As String = Path.GetFullPath("C:\MyProject\wwwroot\assets")
Dim html As String = "
    <html>
    <head>
        <link rel='stylesheet' href='styles/main.css'>
    </head>
    <body>
        <img src='images/logo.png' />
        <script src='scripts/app.js'></script>
    </body>
    </html>"

Dim pdf As PdfDocument = renderer.RenderHtmlAsPdf(html, absoluteBasePath)
$vbLabelText   $csharpLabel

¿Cómo añadir encabezados y pies de página HTML con imágenes?

Al renderizar encabezados y pies de página HTML en nuevos o existentes PDFs, se tratan como documentos HTML independientes y no heredan el BaseURL del PDF. Para conocer todas las opciones de encabezado y pie de página, consulte nuestra guía de encabezados y pies de página.

Establezca un BaseURL desde el que se puedan cargar los activos: ChromePdfRenderOptions

¿Por qué los encabezados no heredan las URL base del documento principal?

Los encabezados y pies de página se presentan como documentos HTML independientes por motivos de rendimiento y aislamiento. Este diseño permite:

  • Estilo independiente sin afectar el contenido principal
  • Renderizado consistente en todas las páginas
  • Mejor gestión de memoria para documentos grandes
  • Flexibilidad para utilizar diferentes fuentes de recursos

¿Cómo establecer diferentes URL base para encabezados y contenido?

Especifique diferentes URL de base para encabezados, pies de página y contenido principal para organizar los activos de forma eficaz:

ChromePdfRenderer renderer = new ChromePdfRenderer();

// Main content base URL
string contentBaseUrl = @"C:\website\public\";

// Header specific assets
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter()
{
    HtmlFragment = "<img src='header-logo.png'><link rel='stylesheet' href='header.css'>",
    BaseUrl = new Uri(@"C:\website\headers\").AbsoluteUri
};

// Footer specific assets
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter()
{
    HtmlFragment = "<div class='footer'>© 2024 Company</div><link rel='stylesheet' href='footer.css'>",
    BaseUrl = new Uri(@"C:\website\footers\").AbsoluteUri
};

// Render main content with its own base URL
PdfDocument pdf = renderer.RenderHtmlAsPdf("<h1>Main Content</h1>", contentBaseUrl);
ChromePdfRenderer renderer = new ChromePdfRenderer();

// Main content base URL
string contentBaseUrl = @"C:\website\public\";

// Header specific assets
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter()
{
    HtmlFragment = "<img src='header-logo.png'><link rel='stylesheet' href='header.css'>",
    BaseUrl = new Uri(@"C:\website\headers\").AbsoluteUri
};

// Footer specific assets
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter()
{
    HtmlFragment = "<div class='footer'>© 2024 Company</div><link rel='stylesheet' href='footer.css'>",
    BaseUrl = new Uri(@"C:\website\footers\").AbsoluteUri
};

// Render main content with its own base URL
PdfDocument pdf = renderer.RenderHtmlAsPdf("<h1>Main Content</h1>", contentBaseUrl);
Dim renderer As New ChromePdfRenderer()

' Main content base URL
Dim contentBaseUrl As String = "C:\website\public\"

' Header specific assets
renderer.RenderingOptions.HtmlHeader = New HtmlHeaderFooter() With {
    .HtmlFragment = "<img src='header-logo.png'><link rel='stylesheet' href='header.css'>",
    .BaseUrl = New Uri("C:\website\headers\").AbsoluteUri
}

' Footer specific assets
renderer.RenderingOptions.HtmlFooter = New HtmlHeaderFooter() With {
    .HtmlFragment = "<div class='footer'>© 2024 Company</div><link rel='stylesheet' href='footer.css'>",
    .BaseUrl = New Uri("C:\website\footers\").AbsoluteUri
}

' Render main content with its own base URL
Dim pdf As PdfDocument = renderer.RenderHtmlAsPdf("<h1>Main Content</h1>", contentBaseUrl)
$vbLabelText   $csharpLabel

¿Cómo convierto archivos HTML a PDF con recursos locales?

Al convertir archivos HTML a PDF, se asume que todos los activos son locales a ese archivo. Obtenga más información sobre la conversión de archivos HTML en nuestra Guía de conversión de archivos HTML a PDF.

:path=/static-assets/pdf/content-code-examples/how-to/base-html-file.cs
using IronPdf;

// Instantiate ChromePdfRenderer
ChromePdfRenderer renderer = new ChromePdfRenderer();

// Render HTML file to PDF
PdfDocument pdf = renderer.RenderHtmlFileAsPdf("C:\\Assets\\TestInvoice1.html");

// Export PDF
pdf.SaveAs("Invoice.pdf");
Imports IronPdf

' Instantiate ChromePdfRenderer
Private renderer As New ChromePdfRenderer()

' Render HTML file to PDF
Private pdf As PdfDocument = renderer.RenderHtmlFileAsPdf("C:\Assets\TestInvoice1.html")

' Export PDF
pdf.SaveAs("Invoice.pdf")
$vbLabelText   $csharpLabel

En el ejemplo anterior, todos los archivos JS, CSS y de imagen se cargan desde la carpeta C:\Assets del disco, el mismo directorio que el archivo HTML.

Para mayor comodidad, use CustomCssUrl en HtmlToPdf para Hojas de Estilo Adicionales para especificar una hoja de estilo adicional utilizada solo para el renderizado PDF en .NET si se desea. Por ejemplo:

:path=/static-assets/pdf/content-code-examples/how-to/base-html-file-baseurl.cs
using IronPdf;

// Instantiate ChromePdfRenderer
ChromePdfRenderer renderer = new ChromePdfRenderer();

// Set additional CSS url
renderer.RenderingOptions.CustomCssUrl = "./style.css";

// Render HTML file to PDF
PdfDocument pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1>");

// Export PDF
pdf.SaveAs("tryCss.pdf");
Imports IronPdf

' Instantiate ChromePdfRenderer
Private renderer As New ChromePdfRenderer()

' Set additional CSS url
renderer.RenderingOptions.CustomCssUrl = "./style.css"

' Render HTML file to PDF
Dim pdf As PdfDocument = renderer.RenderHtmlAsPdf("<h1>Hello World</h1>")

' Export PDF
pdf.SaveAs("tryCss.pdf")
$vbLabelText   $csharpLabel

CustomCssUrl

Por favor notaLa propiedad ChromePdfRenderOptions.CustomCssUrl actualmente solo funciona al renderizar desde cadenas HTML a PDFs usando el método RenderHtmlAsPdf.)})]

¿Cuándo debo usar CustomCssUrl para estilos adicionales?

CustomCssUrl es ideal para:

  • Estilos específicos de impresión: Oculta menús de navegación o elementos interactivos
  • Optimización de diseño PDF: Ajusta márgenes y saltos de página para impresión
  • Formateo condicional: Aplica estilos solo al generar PDFs
  • Pruebas A/B: Pruebe diferentes diseños de PDF sin modificar el HTML de origen

¿Cómo se manejan las rutas relativas de activos en archivos HTML?

Cuando trabaje con archivos HTML que contengan rutas relativas, asegúrese de que su estructura de archivos admite las referencias:

// Example HTML file structure
/*
C:\Projects\Reports\
    ├── invoice.html
    ├── css\
    │   └── styles.css
    ├── js\
    │   └── calculations.js
    └── images\
        └── logo.png
*/

// HTML content with relative paths
string htmlContent = @"
<!DOCTYPE html>
<html>
<head>
    <link rel='stylesheet' href='css/styles.css'>
    <script src='js/calculations.js'></script>
</head>
<body>
    <img src='images/logo.png' alt='Company Logo'>
    <h1>Invoice #12345</h1>
</body>
</html>";

// Save HTML and render
File.WriteAllText(@"C:\Projects\Reports\invoice.html", htmlContent);
ChromePdfRenderer renderer = new ChromePdfRenderer();
PdfDocument pdf = renderer.RenderHtmlFileAsPdf(@"C:\Projects\Reports\invoice.html");
pdf.SaveAs("invoice-output.pdf");
// Example HTML file structure
/*
C:\Projects\Reports\
    ├── invoice.html
    ├── css\
    │   └── styles.css
    ├── js\
    │   └── calculations.js
    └── images\
        └── logo.png
*/

// HTML content with relative paths
string htmlContent = @"
<!DOCTYPE html>
<html>
<head>
    <link rel='stylesheet' href='css/styles.css'>
    <script src='js/calculations.js'></script>
</head>
<body>
    <img src='images/logo.png' alt='Company Logo'>
    <h1>Invoice #12345</h1>
</body>
</html>";

// Save HTML and render
File.WriteAllText(@"C:\Projects\Reports\invoice.html", htmlContent);
ChromePdfRenderer renderer = new ChromePdfRenderer();
PdfDocument pdf = renderer.RenderHtmlFileAsPdf(@"C:\Projects\Reports\invoice.html");
pdf.SaveAs("invoice-output.pdf");
Imports System.IO
Imports IronPdf

' Example HTML file structure
'
' C:\Projects\Reports\
'     ├── invoice.html
'     ├── css\
'     │   └── styles.css
'     ├── js\
'     │   └── calculations.js
'     └── images\
'         └── logo.png
'

' HTML content with relative paths
Dim htmlContent As String = "
<!DOCTYPE html>
<html>
<head>
    <link rel='stylesheet' href='css/styles.css'>
    <script src='js/calculations.js'></script>
</head>
<body>
    <img src='images/logo.png' alt='Company Logo'>
    <h1>Invoice #12345</h1>
</body>
</html>"

' Save HTML and render
File.WriteAllText("C:\Projects\Reports\invoice.html", htmlContent)
Dim renderer As New ChromePdfRenderer()
Dim pdf As PdfDocument = renderer.RenderHtmlFileAsPdf("C:\Projects\Reports\invoice.html")
pdf.SaveAs("invoice-output.pdf")
$vbLabelText   $csharpLabel

¿Cómo codifico imágenes directamente en HTML usando Base64?

Las imágenes pueden codificarse directamente en archivos HTML o cadenas, lo que evita problemas con imágenes perdidas. Utilice la codificación base64 para este enfoque. Utilice la codificación base64 para este enfoque. Usa codificación base64 para este enfoque:

  1. Primero obtén los datos binarios de la imagen leyendo el archivo o recibiéndolos a través de una solicitud de red.
  2. Use el método Convert.ToBase64String en Microsoft .NET para convertir datos binarios a base64.
  3. Construir la etiqueta de imagen en HTML usando "data:image/svg+xml;base64," antes de los datos base64. Tenga en cuenta que el tipo de imagen se especifica antes de los datos base64. Visitar MDN Web Docs sobre tipos y formatos de imágenes para más información sobre tipos de formato de imagen.
:path=/static-assets/pdf/content-code-examples/how-to/add-images-to-pdfs-base64-image.cs
using IronPdf;
using System;
using System.IO;

ChromePdfRenderer renderer = new ChromePdfRenderer();

// Import image file binary data
byte[] binaryData = File.ReadAllBytes("ironpdf-logo-text-dotnet.svg");

// Convert the binary data to base 64
string imgDataUri = Convert.ToBase64String(binaryData);

// Embed in HTML
string html = $"<img src='data:image/svg+xml;base64,{imgDataUri}'>";

// Convert HTML to PDF
PdfDocument pdf = renderer.RenderHtmlAsPdf(html);

// Export the PDF
pdf.SaveAs("embedImageBase64.pdf");
Imports IronPdf
Imports System
Imports System.IO

Private renderer As New ChromePdfRenderer()

' Import image file binary data
Private binaryData() As Byte = File.ReadAllBytes("ironpdf-logo-text-dotnet.svg")

' Convert the binary data to base 64
Private imgDataUri As String = Convert.ToBase64String(binaryData)

' Embed in HTML
Private html As String = $"<img src='data:image/svg+xml;base64,{imgDataUri}'>"

' Convert HTML to PDF
Private pdf As PdfDocument = renderer.RenderHtmlAsPdf(html)

' Export the PDF
pdf.SaveAs("embedImageBase64.pdf")
$vbLabelText   $csharpLabel

¿Por qué elegir la codificación Base64 en lugar de las referencias de archivos?

La codificación Base64 ofrece varias ventajas:

  • HTML autónomo: Sin dependencias externas, simplificando la distribución
  • Compatibilidad multiplataforma: Funciona independientemente de las diferencias del sistema de archivos
  • Seguridad: No se requiere acceso al sistema de archivos, reduciendo riesgos de seguridad
  • Confiabilidad: Elimina errores de activos faltantes en producción
  • Control de versiones: Las imágenes son parte del HTML, simplificando la versión

Sin embargo, hay que tener en cuenta las siguientes ventajas y desventajas:

  • Aumento de tamaño del HTML: La codificación base64 aumenta el tamaño aproximadamente un 33%
  • Sin almacenamiento en caché: Las imágenes incrustadas no pueden ser almacenadas en caché por separado
  • Uso de memoria: Toda la imagen debe cargarse en memoria

¿Qué formatos de imagen funcionan mejor con la codificación Base64?

Los distintos formatos de imagen tienen una eficacia variable cuando se codifican en base64:

// Example: Encoding different image formats
public string EncodeImageWithMimeType(string imagePath)
{
    byte[] imageBytes = File.ReadAllBytes(imagePath);
    string base64 = Convert.ToBase64String(imageBytes);

    // Determine MIME type based on extension
    string extension = Path.GetExtension(imagePath).ToLower();
    string mimeType = extension switch
    {
        ".png" => "image/png",      // Best for graphics with transparency
        ".jpg" or ".jpeg" => "image/jpeg",  // Best for photographs
        ".gif" => "image/gif",       // Best for simple animations
        ".svg" => "image/svg+xml",   // Best for scalable graphics
        ".webp" => "image/webp",     // Best overall compression
        _ => "image/png"             // Default fallback
    };

    return $"data:{mimeType};base64,{base64}";
}

// Usage
string encodedImage = EncodeImageWithMimeType("logo.png");
string html = $"<img src='{encodedImage}' alt='Company Logo'>";
// Example: Encoding different image formats
public string EncodeImageWithMimeType(string imagePath)
{
    byte[] imageBytes = File.ReadAllBytes(imagePath);
    string base64 = Convert.ToBase64String(imageBytes);

    // Determine MIME type based on extension
    string extension = Path.GetExtension(imagePath).ToLower();
    string mimeType = extension switch
    {
        ".png" => "image/png",      // Best for graphics with transparency
        ".jpg" or ".jpeg" => "image/jpeg",  // Best for photographs
        ".gif" => "image/gif",       // Best for simple animations
        ".svg" => "image/svg+xml",   // Best for scalable graphics
        ".webp" => "image/webp",     // Best overall compression
        _ => "image/png"             // Default fallback
    };

    return $"data:{mimeType};base64,{base64}";
}

// Usage
string encodedImage = EncodeImageWithMimeType("logo.png");
string html = $"<img src='{encodedImage}' alt='Company Logo'>";
Imports System.IO

Public Function EncodeImageWithMimeType(imagePath As String) As String
    Dim imageBytes As Byte() = File.ReadAllBytes(imagePath)
    Dim base64 As String = Convert.ToBase64String(imageBytes)

    ' Determine MIME type based on extension
    Dim extension As String = Path.GetExtension(imagePath).ToLower()
    Dim mimeType As String = extension.ToLower() Select Case extension
        Case ".png"
            mimeType = "image/png" ' Best for graphics with transparency
        Case ".jpg", ".jpeg"
            mimeType = "image/jpeg" ' Best for photographs
        Case ".gif"
            mimeType = "image/gif" ' Best for simple animations
        Case ".svg"
            mimeType = "image/svg+xml" ' Best for scalable graphics
        Case ".webp"
            mimeType = "image/webp" ' Best overall compression
        Case Else
            mimeType = "image/png" ' Default fallback
    End Select

    Return $"data:{mimeType};base64,{base64}"
End Function

' Usage
Dim encodedImage As String = EncodeImageWithMimeType("logo.png")
Dim html As String = $"<img src='{encodedImage}' alt='Company Logo'>"
$vbLabelText   $csharpLabel

¿Cómo afecta la codificación Base64 al tamaño de los archivos PDF?

La codificación Base64 afecta al tamaño del PDF de forma predecible:

// Comparison example
public void CompareFileSizes()
{
    ChromePdfRenderer renderer = new ChromePdfRenderer();

    // Method 1: External image reference
    string htmlExternal = "<img src='large-photo.jpg'>";
    PdfDocument pdfExternal = renderer.RenderHtmlAsPdf(htmlExternal, @"C:\images\");

    // Method 2: Base64 encoded image
    byte[] imageBytes = File.ReadAllBytes(@"C:\images\large-photo.jpg");
    string base64Image = Convert.ToBase64String(imageBytes);
    string htmlBase64 = $"<img src='data:image/jpeg;base64,{base64Image}'>";
    PdfDocument pdfBase64 = renderer.RenderHtmlAsPdf(htmlBase64);

    // Compare sizes
    Console.WriteLine($"Original image: {imageBytes.Length / 1024} KB");
    Console.WriteLine($"PDF with external image: {pdfExternal.BinaryData.Length / 1024} KB");
    Console.WriteLine($"PDF with base64 image: {pdfBase64.BinaryData.Length / 1024} KB");
}
// Comparison example
public void CompareFileSizes()
{
    ChromePdfRenderer renderer = new ChromePdfRenderer();

    // Method 1: External image reference
    string htmlExternal = "<img src='large-photo.jpg'>";
    PdfDocument pdfExternal = renderer.RenderHtmlAsPdf(htmlExternal, @"C:\images\");

    // Method 2: Base64 encoded image
    byte[] imageBytes = File.ReadAllBytes(@"C:\images\large-photo.jpg");
    string base64Image = Convert.ToBase64String(imageBytes);
    string htmlBase64 = $"<img src='data:image/jpeg;base64,{base64Image}'>";
    PdfDocument pdfBase64 = renderer.RenderHtmlAsPdf(htmlBase64);

    // Compare sizes
    Console.WriteLine($"Original image: {imageBytes.Length / 1024} KB");
    Console.WriteLine($"PDF with external image: {pdfExternal.BinaryData.Length / 1024} KB");
    Console.WriteLine($"PDF with base64 image: {pdfBase64.BinaryData.Length / 1024} KB");
}
' Comparison example
Public Sub CompareFileSizes()
    Dim renderer As New ChromePdfRenderer()

    ' Method 1: External image reference
    Dim htmlExternal As String = "<img src='large-photo.jpg'>"
    Dim pdfExternal As PdfDocument = renderer.RenderHtmlAsPdf(htmlExternal, "C:\images\")

    ' Method 2: Base64 encoded image
    Dim imageBytes As Byte() = File.ReadAllBytes("C:\images\large-photo.jpg")
    Dim base64Image As String = Convert.ToBase64String(imageBytes)
    Dim htmlBase64 As String = $"<img src='data:image/jpeg;base64,{base64Image}'>"
    Dim pdfBase64 As PdfDocument = renderer.RenderHtmlAsPdf(htmlBase64)

    ' Compare sizes
    Console.WriteLine($"Original image: {imageBytes.Length \ 1024} KB")
    Console.WriteLine($"PDF with external image: {pdfExternal.BinaryData.Length \ 1024} KB")
    Console.WriteLine($"PDF with base64 image: {pdfBase64.BinaryData.Length \ 1024} KB")
End Sub
$vbLabelText   $csharpLabel

Para obtener resultados óptimos:

  • Usa base64 para iconos pequeños y logotipos (< 50KB)
  • Usa referencias externas para imágenes grandes y fotografías
  • Considera la compresión antes de la codificación
  • Usa formatos de imagen adecuados para el tipo de contenido

Para conocer técnicas avanzadas de optimización de PDF, consulte nuestra Guía de compresión de PDF.

URLs base en portales de facturación electrónica española

Los portales de gestión de facturas electrónicas en España presentan desafíos específicos de resolución de rutas que hacen que la configuración correcta de BaseUrlOrPath sea crítica:

  • Portales Facturae con rutas MVC relativas: Las plataformas web que gestionan el ciclo de vida de facturas Facturae (creación, firma con FNMT, envío a FACe y archivo) suelen generar el PDF de cada factura desde una vista Razor. Los logos corporativos, los estilos de factura y los iconos de estado se referencian con rutas relativas como ~/assets/invoice/ en el markup HTML. La correcta configuración de baseUrlOrPath garantiza que el PDF generado por IronPDF cargue estos activos desde el servidor, produciendo un documento visualmente idéntico a la vista web que el usuario ve antes de firmar.

  • Portales VeriFactu con recursos hospedados en Azure: Los ISVs que despliegan sus sistemas de facturación VeriFactu en Azure (región Spain Central, para cumplir la LOPDGDD) frecuentemente sirven los activos CSS de sus plantillas de factura desde Azure Blob Storage o Azure CDN. Configurar BaseUrlOrPath con la URL del endpoint de Azure garantiza que IronPDF resuelva correctamente los estilos y logotipos durante la generación del PDF, incluso cuando el servidor de aplicaciones y el almacenamiento de activos están en dominios distintos.

  • Encabezados y pies de página con datos fiscales: Las facturas electrónicas españolas deben incluir en el encabezado o pie de página datos como el NIF/CIF del emisor, la referencia de la factura y el importe total con IVA desglosado. Al renderizar estos encabezados como fragmentos HTML independientes en IronPDF, la propiedad BaseUrl del HtmlHeaderFooter debe apuntar al directorio correcto para que cargue los estilos específicos del encabezado de factura, separados de los estilos del cuerpo principal del documento.

  • Gestión de facturas con imágenes de firma y sello: Muchas facturas electrónicas españolas incluyen la imagen escaneada de la firma del responsable o el sello de la empresa. Cuando estas imágenes están referenciadas con rutas relativas al sistema de archivos del servidor de facturas (en lugar de incrustadas en Base64), la URL base debe apuntar al directorio correcto para que IronPDF las resuelva durante la conversión, garantizando que el PDF archivado en el repositorio documental de la empresa (obligatorio bajo la LOPDGDD para la trazabilidad de documentos fiscales) sea visualmente completo.

Preguntas Frecuentes

¿Cómo me aseguro de que los activos CSS y JavaScript se cargan correctamente al convertir HTML a PDF?

IronPDF permite especificar un parámetro BaseUrlOrPath durante la conversión de HTML a PDF. Este parámetro puede ser una URL web o una ruta de archivo local que sirva como referencia base para todas las rutas de activos relativas en su HTML, garantizando que CSS, JavaScript y las imágenes se carguen correctamente.

¿Para qué sirve el parámetro BaseUrlOrPath?

El parámetro BaseUrlOrPath en IronPDF especifica la URL base desde la que se cargan todos los activos (CSS, JavaScript, imágenes) relativos durante la conversión de HTML a PDF. Puede establecerse como una URL web que empiece por 'http' para activos remotos o como una ruta de archivo local para activos basados en disco.

¿Cómo puedo renderizar un PDF con activos en una sola línea de código?

Puede utilizar ChromePdfRenderer de IronPDF para renderizar HTML con activos en una sola línea: `new IronPdf.ChromePdfRenderer().RenderHtmlAsPdf("", @"C:\site\assets\").SaveAs("with-assets.pdf");`. Esto establece la BaseUrlOrPath para garantizar que todos los activos se cargan correctamente.

¿Cómo se configuran las rutas de imágenes en las aplicaciones MVC para la generación de PDF?

En las aplicaciones MVC que utilizan IronPDF, establezca la baseUrlOrPath en su subdirectorio wwwroot (por ejemplo, @"wwwroot/image") y configure el atributo HTML src con la ruta relativa (por ejemplo, "../image/Sample.jpg"). De este modo, las imágenes se mostrarán correctamente tanto en el sitio web como en el PDF generado.

¿Puedo utilizar activos locales y remotos al convertir HTML a PDF?

Sí, IronPDF admite activos locales y remotos. Para los activos remotos, establezca BaseUrlOrPath en una URL web que empiece por 'http'. Para los activos locales, utilice una ruta de archivo en su disco. Esta flexibilidad le permite hacer referencia a activos de varias fuentes durante la generación de PDF.

¿Qué ocurre si no establezco el parámetro BaseUrlOrPath?

Si no se establece el parámetro BaseUrlOrPath en IronPDF, las rutas relativas de los activos en el HTML no se resolverán correctamente, lo que provocará que falten estilos CSS, funcionalidad JavaScript e imágenes en el PDF generado. Especifique siempre este parámetro cuando su HTML contenga referencias relativas a activos.

¿Por qué es crítica la configuración de BaseUrlOrPath en portales de facturación Facturae?

Los portales web ASP.NET que gestionan el ciclo de vida de facturas Facturae referencian logos corporativos, estilos CSS y recursos gráficos con rutas relativas al portal. Sin la configuración correcta de BaseUrlOrPath, IronPDF no puede resolver estos activos durante la generación del PDF, produciendo facturas con imágenes rotas o sin estilos. Esto es especialmente problemático cuando el PDF generado se adjunta al XML Facturae para envío a FACe, ya que el documento debe ser visualmente correcto antes de la firma con certificado FNMT.

Curtis Chau
Escritor Técnico

Curtis Chau tiene una licenciatura en Ciencias de la Computación (Carleton University) y se especializa en el desarrollo front-end con experiencia en Node.js, TypeScript, JavaScript y React. Apasionado por crear interfaces de usuario intuitivas y estéticamente agradables, disfruta trabajando con frameworks modernos y creando manuales bien ...

Leer más
¿Listo para empezar?
Nuget Descargas 19,014,616 | Versión: 2026.5 just released
Still Scrolling Icon

¿Aún desplazándote?

¿Quieres una prueba rápida? PM > Install-Package IronPdf
ejecutar una muestra Mira cómo tu HTML se convierte en PDF.