Cómo incrustar imágenes con URI de datos en C# | IronPDF

Incrustar imágenes con DataURI en C# y VB: renderizado de PDF

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

Incrusta imágenes directamente en documentos PDF usando DataURIs en C# y VB.NET con IronPDF, eliminando dependencias de archivos externos al convertir bytes de imágenes en cadenas base64 y incluirlas en línea dentro del marcado HTML para una representación PDF continua.

Al trabajar con cadenas y documentos HTML, a menudo es esencial evitar dependencias de directorios de activos. El esquema data URI ofrece una solución eficaz.

En el contexto de la facturación electrónica en España, la incrustación de imágenes mediante DataURIs en Base64 es especialmente relevante para garantizar que los PDFs de factura sean documentos autocontenidos. El reglamento VeriFactu exige que las facturas electrónicas archivadas puedan recuperarse de forma íntegra durante al menos cuatro años desde los servidores de la AEAT, lo que implica que los PDFs deben incluir todos sus recursos —logotipos, códigos QR de verificación y firmas visuales— incrustados en el propio documento. Del mismo modo, las facturas Facturae enviadas a través de FACe deben ser documentos PDF/A autocontenidos, lo que hace que la técnica DataURI sea la solución más adecuada para garantizar la integridad del archivo.

El esquema de URI de datos incorpora los datos directamente en el código HTML o CSS, eliminando la necesidad de archivos separados. DataURIs permite que imágenes, archivos y fuentes se inyecten directamente en un documento HTML como una cadena.

Inicio rápido: Incrustar imágenes en archivos PDF mediante DataURI

Transforma contenido HTML en documentos PDF incrustando imágenes usando DataURIs con IronPDF. Esta guía muestra cómo generar archivos PDF con imágenes incrustadas utilizando un código sencillo y eficaz. IronPDF convierte HTML a PDF manteniendo la integridad de la imagen. Aquí hay un ejemplo sencillo que muestra cómo incrustar una imagen directamente en tu documento PDF usando DataURI con un código mínimo.

  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.StaticRenderHtmlAsPdf("<img src='data:image/png;base64,...' />").SaveAs("output.pdf");
  3. Despliegue para probar en su entorno real

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

    arrow pointer


¿Cómo incrustar imágenes con DataURI en PDF?

Incrustar imágenes usando DataURIs incluye imágenes directamente en el marcado HTML sin hacer referencia a archivos externos. Este enfoque funciona bien cuando se generan PDF en entornos de nube, sistemas distribuidos o cuando se garantiza que todos los recursos son autocontenidos. La conversión de HTML a PDF de IronPDF admite completamente DataURIs, permitiendo la creación profesional de PDFs con imágenes incrustadas.

El proceso involucra tres pasos: leer los datos de la imagen, convertirlos a formato base64 e incrustarlos dentro de una etiqueta HTML img. Este método funciona con varios formatos de imagen, incluidos PNG, JPEG, GIF y SVG, lo que proporciona flexibilidad en los flujos de trabajo de generación de PDF. La técnica es la misma tanto si se trabaja con imágenes Azure Blob Storage como con archivos locales.

Ejemplo básico de incrustación de imágenes

Este ejemplo completo muestra cómo incrustar una imagen en un PDF utilizando DataURIs:

:path=/static-assets/pdf/content-code-examples/how-to/datauris-image.cs
using IronPdf;
using System;

// Read byte from image file
var pngBinaryData = System.IO.File.ReadAllBytes("My_image.png");

// Convert bytes to base64
var ImgDataURI = @"data:image/png;base64," + Convert.ToBase64String(pngBinaryData);

// Import base64 to img tag
var ImgHtml = $"<img src='{ImgDataURI}'>";

ChromePdfRenderer Renderer = new ChromePdfRenderer();

// Render the HTML string
var pdf = Renderer.RenderHtmlAsPdf(ImgHtml);

pdf.SaveAs("datauri_example.pdf");
Imports IronPdf
Imports System

' Read byte from image file
Private pngBinaryData = System.IO.File.ReadAllBytes("My_image.png")

' Convert bytes to base64
Private ImgDataURI = "data:image/png;base64," & Convert.ToBase64String(pngBinaryData)

' Import base64 to img tag
Private ImgHtml = $"<img src='{ImgDataURI}'>"

Private Renderer As New ChromePdfRenderer()

' Render the HTML string
Private pdf = Renderer.RenderHtmlAsPdf(ImgHtml)

pdf.SaveAs("datauri_example.pdf")
$vbLabelText   $csharpLabel

Los desarrolladores de VB.NET pueden conseguir la misma funcionalidad utilizando la biblioteca VB.NET PDF de IronPDF:

Imports IronPdf
Imports System

' Read byte from image file
Dim pngBinaryData As Byte() = System.IO.File.ReadAllBytes("My_image.png")

' Convert bytes to base64
Dim ImgDataURI As String = "data:image/png;base64," & Convert.ToBase64String(pngBinaryData)

' Import base64 to img tag
Dim ImgHtml As String = $"<img src='{ImgDataURI}'>"

Dim Renderer As New ChromePdfRenderer()

' Render the HTML string
Dim pdf = Renderer.RenderHtmlAsPdf(ImgHtml)

pdf.SaveAs("datauri_example.pdf")

¿Por qué debería usar DataURIs en lugar de referencias a archivos?

DataURIs ofrece varias ventajas sobre las referencias de archivos tradicionales al generar PDFs. En primer lugar, eliminan las dependencias de archivos externos, lo que hace que la generación de PDF sea más fiable y portátil. Esto es crucial en entornos de nube como Azure o AWS Lambda, donde el acceso al sistema de archivos puede ser limitado o sensible al rendimiento.

En segundo lugar, DataURIs asegura que los PDFs sean completamente autónomos. A la hora de compartir o distribuir los PDF generados, los enlaces de imágenes rotos o la falta de recursos no son una preocupación. Esto hace a DataURIs ideal para generar informes, facturas o documentos que requieren archivo o distribución por correo electrónico.

En tercer lugar, DataURIs puede mejorar el rendimiento en ciertos escenarios. Dado que los datos de imagen se incrustan directamente en HTML, no se producen peticiones HTTP adicionales ni operaciones del sistema de archivos durante la renderización. De este modo, se agiliza la generación de PDF, especialmente cuando se manejan varias imágenes pequeñas.

¿Qué formatos de imagen se admiten?

IronPDF admite todos los formatos de imagen principales a través de DataURIs, proporcionando flexibilidad en los flujos de trabajo de generación de PDF:

  • PNG: Ideal para imágenes con transparencia o gráficos con bordes afilados. Utiliza data:image/png;base64,
  • JPEG: mejor para fotografías e imágenes complejas con muchos colores. Utiliza data:image/jpeg;base64,
  • GIF: Adecuado para animaciones sencillas o imágenes con colores limitados. Utiliza data:image/gif;base64,
  • SVG: Perfecto para gráficos vectoriales escalables. Utiliza data:image/svg+xml;base64,
  • WebP: Formato moderno con excelente compresión. Utiliza data:image/webp;base64,

El siguiente ejemplo muestra cómo manejar diferentes formatos de imagen:

using IronPdf;
using System;
using System.IO;

public class MultiFormatImageEmbedding
{
    public static void EmbedVariousImageFormats()
    {
        var renderer = new ChromePdfRenderer();

        // Function to create DataURI from image file
        string CreateDataUri(string filePath, string mimeType)
        {
            var imageBytes = File.ReadAllBytes(filePath);
            return $"data:{mimeType};base64,{Convert.ToBase64String(imageBytes)}";
        }

        // Create HTML with multiple image formats
        var html = $@"
        <html>
        <body>
            <h1>Multi-Format Image Test</h1>
            <img src='{CreateDataUri("logo.png", "image/png")}' alt='PNG Logo' />
            <img src='{CreateDataUri("photo.jpg", "image/jpeg")}' alt='JPEG Photo' />
            <img src='{CreateDataUri("icon.svg", "image/svg+xml")}' alt='SVG Icon' />
        </body>
        </html>";

        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("multi_format_images.pdf");
    }
}
using IronPdf;
using System;
using System.IO;

public class MultiFormatImageEmbedding
{
    public static void EmbedVariousImageFormats()
    {
        var renderer = new ChromePdfRenderer();

        // Function to create DataURI from image file
        string CreateDataUri(string filePath, string mimeType)
        {
            var imageBytes = File.ReadAllBytes(filePath);
            return $"data:{mimeType};base64,{Convert.ToBase64String(imageBytes)}";
        }

        // Create HTML with multiple image formats
        var html = $@"
        <html>
        <body>
            <h1>Multi-Format Image Test</h1>
            <img src='{CreateDataUri("logo.png", "image/png")}' alt='PNG Logo' />
            <img src='{CreateDataUri("photo.jpg", "image/jpeg")}' alt='JPEG Photo' />
            <img src='{CreateDataUri("icon.svg", "image/svg+xml")}' alt='SVG Icon' />
        </body>
        </html>";

        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("multi_format_images.pdf");
    }
}
Imports IronPdf
Imports System
Imports System.IO

Public Class MultiFormatImageEmbedding
    Public Shared Sub EmbedVariousImageFormats()
        Dim renderer As New ChromePdfRenderer()

        ' Function to create DataURI from image file
        Function CreateDataUri(filePath As String, mimeType As String) As String
            Dim imageBytes = File.ReadAllBytes(filePath)
            Return $"data:{mimeType};base64,{Convert.ToBase64String(imageBytes)}"
        End Function

        ' Create HTML with multiple image formats
        Dim html = $"
        <html>
        <body>
            <h1>Multi-Format Image Test</h1>
            <img src='{CreateDataUri("logo.png", "image/png")}' alt='PNG Logo' />
            <img src='{CreateDataUri("photo.jpg", "image/jpeg")}' alt='JPEG Photo' />
            <img src='{CreateDataUri("icon.svg", "image/svg+xml")}' alt='SVG Icon' />
        </body>
        </html>"

        Dim pdf = renderer.RenderHtmlAsPdf(html)
        pdf.SaveAs("multi_format_images.pdf")
    End Sub
End Class
$vbLabelText   $csharpLabel

Para el manejo avanzado de imágenes, incluyendo añadir imágenes a PDFs existentes, IronPDF proporciona un soporte completo.

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

La codificación Base64 aumenta el tamaño de los datos en aproximadamente un 33%. Base64 representa datos binarios utilizando sólo 64 caracteres ASCII, lo que requiere 4 caracteres para representar cada 3 bytes de datos originales. Aunque esto aumenta el tamaño total, el impacto en la generación de PDF suele ser mínimo en comparación con las ventajas de los documentos autocontenidos.

Optimiza los tamaños de archivo al usar DataURIs siguiendo estas prácticas:

  1. Comprimir imágenes antes de codificar: Usa herramientas o bibliotecas para optimizar archivos de imagen antes de convertirlos a base64
  2. Elegir formatos apropiados: Usa JPEG para fotos, PNG para gráficos con transparencia
  3. Redimensionar adecuadamente las imágenes: No incrustar imágenes más grandes de lo necesario para la salida PDF
  4. Considere la compresión de PDF: Utilice las funciones de compresión de IronPDF después de la generación

Este ejemplo muestra la optimización de imágenes antes de incrustarlas:

using IronPdf;
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;

public class OptimizedImageEmbedding
{
    public static void EmbedOptimizedImage(string imagePath, int maxWidth = 800)
    {
        // Load and resize image if necessary
        using (var originalImage = Image.FromFile(imagePath))
        {
            var resizedImage = originalImage;

            if (originalImage.Width > maxWidth)
            {
                var ratio = (double)maxWidth / originalImage.Width;
                var newHeight = (int)(originalImage.Height * ratio);
                resizedImage = new Bitmap(originalImage, maxWidth, newHeight);
            }

            // Convert to optimized JPEG
            using (var ms = new MemoryStream())
            {
                var encoder = ImageCodecInfo.GetImageEncoders()
                    .First(c => c.FormatID == ImageFormat.Jpeg.Guid);
                var encoderParams = new EncoderParameters(1);
                encoderParams.Param[0] = new EncoderParameter(
                    System.Drawing.Imaging.Encoder.Quality, 85L);

                resizedImage.Save(ms, encoder, encoderParams);
                var imageBytes = ms.ToArray();

                // Create DataURI
                var dataUri = $"data:image/jpeg;base64,{Convert.ToBase64String(imageBytes)}";

                // Generate PDF
                var html = $@"
                <html>
                <body>
                    <h1>Optimized Image Example</h1>
                    <img src='{dataUri}' style='max-width: 100%;' />
                </body>
                </html>";

                var renderer = new ChromePdfRenderer();
                var pdf = renderer.RenderHtmlAsPdf(html);
                pdf.SaveAs("optimized_image.pdf");
            }

            if (resizedImage != originalImage)
                resizedImage.Dispose();
        }
    }
}
using IronPdf;
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;

public class OptimizedImageEmbedding
{
    public static void EmbedOptimizedImage(string imagePath, int maxWidth = 800)
    {
        // Load and resize image if necessary
        using (var originalImage = Image.FromFile(imagePath))
        {
            var resizedImage = originalImage;

            if (originalImage.Width > maxWidth)
            {
                var ratio = (double)maxWidth / originalImage.Width;
                var newHeight = (int)(originalImage.Height * ratio);
                resizedImage = new Bitmap(originalImage, maxWidth, newHeight);
            }

            // Convert to optimized JPEG
            using (var ms = new MemoryStream())
            {
                var encoder = ImageCodecInfo.GetImageEncoders()
                    .First(c => c.FormatID == ImageFormat.Jpeg.Guid);
                var encoderParams = new EncoderParameters(1);
                encoderParams.Param[0] = new EncoderParameter(
                    System.Drawing.Imaging.Encoder.Quality, 85L);

                resizedImage.Save(ms, encoder, encoderParams);
                var imageBytes = ms.ToArray();

                // Create DataURI
                var dataUri = $"data:image/jpeg;base64,{Convert.ToBase64String(imageBytes)}";

                // Generate PDF
                var html = $@"
                <html>
                <body>
                    <h1>Optimized Image Example</h1>
                    <img src='{dataUri}' style='max-width: 100%;' />
                </body>
                </html>";

                var renderer = new ChromePdfRenderer();
                var pdf = renderer.RenderHtmlAsPdf(html);
                pdf.SaveAs("optimized_image.pdf");
            }

            if (resizedImage != originalImage)
                resizedImage.Dispose();
        }
    }
}
Imports IronPdf
Imports System
Imports System.Drawing
Imports System.Drawing.Imaging
Imports System.IO

Public Class OptimizedImageEmbedding
    Public Shared Sub EmbedOptimizedImage(imagePath As String, Optional maxWidth As Integer = 800)
        ' Load and resize image if necessary
        Using originalImage As Image = Image.FromFile(imagePath)
            Dim resizedImage As Image = originalImage

            If originalImage.Width > maxWidth Then
                Dim ratio As Double = CDbl(maxWidth) / originalImage.Width
                Dim newHeight As Integer = CInt(originalImage.Height * ratio)
                resizedImage = New Bitmap(originalImage, maxWidth, newHeight)
            End If

            ' Convert to optimized JPEG
            Using ms As New MemoryStream()
                Dim encoder As ImageCodecInfo = ImageCodecInfo.GetImageEncoders().First(Function(c) c.FormatID = ImageFormat.Jpeg.Guid)
                Dim encoderParams As New EncoderParameters(1)
                encoderParams.Param(0) = New EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 85L)

                resizedImage.Save(ms, encoder, encoderParams)
                Dim imageBytes As Byte() = ms.ToArray()

                ' Create DataURI
                Dim dataUri As String = $"data:image/jpeg;base64,{Convert.ToBase64String(imageBytes)}"

                ' Generate PDF
                Dim html As String = $"
                <html>
                <body>
                    <h1>Optimized Image Example</h1>
                    <img src='{dataUri}' style='max-width: 100%;' />
                </body>
                </html>"

                Dim renderer As New ChromePdfRenderer()
                Dim pdf As PdfDocument = renderer.RenderHtmlAsPdf(html)
                pdf.SaveAs("optimized_image.pdf")
            End Using

            If resizedImage IsNot originalImage Then
                resizedImage.Dispose()
            End If
        End Using
    End Sub
End Class
$vbLabelText   $csharpLabel

Técnicas avanzadas y mejores prácticas

Al trabajar con DataURIs en entornos de producción, implementa mecanismos de caché para evitar codificar repetidamente las mismas imágenes. Esto es especialmente importante cuando se generan varios PDF con recursos compartidos. Aprovecha las capacidades de async de IronPDF para un mejor rendimiento al procesar múltiples imágenes.

Para documentos complejos con muchas imágenes, utiliza un enfoque híbrido donde las imágenes críticas se incrustan como DataURIs mientras que las imágenes más grandes y opcionales se referencian externamente. Esto equilibra documentos autocontenidos con tamaños de archivo razonables.

También puede servir una cadena HTML completa o un documento PDF como una matriz de bytes utilizando la integración ASP.NET MVC de IronPDF. Esta técnica funciona bien cuando se crean aplicaciones web que generan y sirven PDF de forma dinámica.

Para técnicas avanzadas de manipulación de PDF, como marcas de agua, firmas digitales y creación de formularios, IronPDF proporciona documentación completa y ejemplos para crear soluciones PDF sólidas.


DataURIs en facturas electrónicas y archivos fiscales en España

La incrustación de recursos mediante Base64 y DataURIs es una práctica esencial en los flujos de trabajo de facturación electrónica en España, donde la legislación exige documentos PDF autocontenidos para garantizar la legibilidad durante el período de conservación legalmente obligatorio.

VeriFactu y el archivo PDF autocontenido en la AEAT

El sistema VeriFactu, regulado por la AEAT para el control en tiempo real de la facturación, genera facturas que deben poder visualizarse y verificarse de forma íntegra desde el portal de la Agencia Tributaria durante cuatro años. Para garantizar que los PDFs de factura sean legibles independientemente del servidor donde se almacenen, todos los recursos visuales —logotipos corporativos, código QR con la URL de verificación de la AEAT, pie de firma electrónica y cualquier imagen incluida en la cabecera— deben incrustarse como DataURIs en Base64. De este modo, el PDF es completamente autocontenido y puede abrirse en cualquier entorno sin dependencias externas, cumpliendo los requisitos de integridad del archivo VeriFactu.

Facturae, FACe y la incrustación de recursos para PDF/A

Las facturas electrónicas enviadas a administraciones públicas a través del portal FACe deben adjuntarse en formato PDF/A, que por definición requiere que todos los recursos sean autocontenidos: fuentes incrustadas, imágenes en Base64 y sin referencias externas. Al utilizar DataURIs con IronPDF para los logotipos y elementos visuales de la factura Facturae, se garantiza la conformidad con el estándar PDF/A y se evitan los rechazos por recursos no disponibles durante la validación en FACe. Además, la correcta incrustación mediante UTF-8 es imprescindible para que los nombres de empresa con caracteres especiales del español (ñ, vocales acentuadas) se representen correctamente en los archivos de la AEAT.

Adoptar la técnica DataURI en los flujos de generación de facturas con IronPDF es una decisión de arquitectura que simplifica el cumplimiento de los requisitos de archivo exigidos por VeriFactu y FACe, reduciendo el riesgo de documentos incompletos o ilegibles en las inspecciones fiscales de la Agencia Tributaria.


Utiliza la directiva using IronPdf para incluir el espacio de nombres IronPdf en tus proyectos de C# o VB.NET.

El método AddBookmarkAtEnd se utiliza para agregar nuevos marcadores al esquema del PDF.

Preguntas Frecuentes

¿Qué son los DataURI y por qué utilizarlos para la generación de PDF?

DataURIs es un esquema que incrusta datos directamente en código HTML o CSS como cadenas codificadas en base64, eliminando la necesidad de archivos de imagen separados. IronPDF es totalmente compatible con DataURI, por lo que es ideal para entornos en la nube, sistemas distribuidos o cuando se necesitan PDF autónomos sin dependencias de archivos externos.

¿Cómo convierto una imagen a un formato DataURI para incrustarla en un PDF?

Con IronPDF, convertir una imagen a DataURI implica tres pasos: Primero, leer los bytes de la imagen utilizando System.IO.File.ReadAllBytes(). Segundo, convertir los bytes a base64 usando Convert.ToBase64String(). Por último, incrustar la cadena base64 en una etiqueta HTML img con el formato 'data:image/png;base64,[base64string]'.

¿Qué formatos de imagen se admiten al incrustar imágenes como DataURI?

IronPDF admite la incrustación de varios formatos de imagen como DataURI, incluidos PNG, JPEG, GIF y SVG. Esta flexibilidad le permite trabajar con diferentes tipos de imágenes manteniendo un control total sobre el flujo de trabajo de generación de PDF.

¿Puedo incrustar varias imágenes mediante DataURI en un solo PDF?

Sí, IronPDF le permite incrustar varias imágenes utilizando DataURIs en un único documento PDF. Simplemente convierta cada imagen a su representación base64 e inclúyalas en su marcado HTML antes de renderizarlas con ChromePdfRenderer de IronPDF.

¿Influye en el rendimiento utilizar DataURI en lugar de referencias a archivos?

Mientras que las DataURI aumentan el tamaño de la cadena HTML debido a la codificación base64, IronPDF gestiona la conversión de forma eficiente. La compensación merece la pena cuando se necesitan PDF autónomos sin dependencias externas, especialmente en entornos en la nube o distribuidos.

¿Por qué son obligatorios los DataURIs para las facturas VeriFactu y Facturae archivadas en la AEAT?

El reglamento VeriFactu exige que las facturas electrónicas archivadas en la AEAT sean recuperables de forma íntegra durante cuatro años. Los PDFs de factura Facturae enviados a FACe deben ser documentos PDF/A autocontenidos. Al incrustar logotipos, códigos QR de verificación AEAT y otros recursos como DataURIs en Base64 con IronPDF, se garantiza que los documentos sean completamente autocontenidos y legibles sin dependencias externas.

¿Cómo afecta la codificación UTF-8 a los DataURIs en facturas electrónicas con nombres en español?

La correcta codificación UTF-8 es esencial en las facturas electrónicas españolas para representar correctamente nombres de empresa y datos fiscales con caracteres especiales (ñ, vocales acentuadas). VeriFactu especifica UTF-8 para el cómputo de hash de integridad, y los PDFs archivados en la AEAT deben renderizar correctamente todos los caracteres del español para ser válidos legalmente.

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.