如何在 C# | IronPDF 中使用数据 URI 嵌入图片

在 C## & VB PDF 渲染中使用 DataURIs 嵌入图像

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

使用C#和VB.NET中的DataURIs将图像直接嵌入PDF文档中,使用IronPDF,通过将图像字节转换为base64字符串并将其内嵌在HTML标记中,以实现无缝PDF渲染,消除外部文件依赖。

在处理 HTML 字符串和文档时,避免依赖资产目录往往至关重要。 data URI 方案提供了一个有效的解决方案。

数据 URI 方案可将数据直接嵌入 HTML 或 CSS 代码,无需单独文件。 DataURIs允许将图像、文件和字形直接注入为HTML文档的字符串。

快速入门:使用数据URI在PDF中嵌入图像

通过使用IronPDF的DataURIs嵌入图像,将HTML内容转换为PDF文档。 本指南演示了如何使用简单、高效的代码呈现带有嵌入式图像的 PDF。 IronPDF 可将 HTML 转换为 PDF,同时保持图像的完整性。 这是一个简单的示例,展示如何使用最少的代码通过DataURI将图像直接嵌入您的PDF文档。

  1. 使用 NuGet 包管理器安装 https://www.nuget.org/packages/IronPdf

    PM > Install-Package IronPdf
  2. 复制并运行这段代码。

    new IronPdf.ChromePdfRenderer.StaticRenderHtmlAsPdf("<img src='data:image/png;base64,...' />").SaveAs("output.pdf");
  3. 部署到您的生产环境中进行测试

    通过免费试用立即在您的项目中开始使用IronPDF

    arrow pointer


如何在 PDF 中使用 DataURIs 嵌入图片?

使用DataURIs嵌入图像时,图像将直接包含在HTML标记中,而不引用外部文件。 在云环境、分布式系统或确保所有资源都是独立的情况下生成 PDF 时,这种方法非常有效。 IronPDF的HTML到PDF转换完全支持DataURIs,使嵌入图像的专业PDF创建成为可能。

该过程涉及三个步骤:读取图像数据,将其转换为base64格式,并嵌入到HTML img 标签中。 这种方法适用于各种图像格式,包括 PNG、JPEG、GIF 和 SVG,为 PDF 生成工作流程提供了灵活性。 无论是使用 Azure Blob Storage 图像还是本地文件,技术都必须保持一致。

基本图像嵌入示例

本完整示例演示了如何使用 DataURIs 将图像嵌入 PDF:

: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

VB.NET 开发人员可以使用 IronPDF 的 VB.NET PDF 库实现相同的功能:

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")
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")
VB .NET

为什么要使用 DataURI 而不是文件引用?

DataURIs在生成PDF时比传统文件引用有几个优势。 首先,它们消除了对外部文件的依赖,使 PDF 生成更加可靠和便携。 这在AzureAWS Lambda等文件系统访问可能受限或对性能敏感的云环境中至关重要。

其次,DataURIs确保PDF完全自包含。 在共享或分发生成的 PDF 时,不需要担心图像链接损坏或资源丢失。 这使得DataURIs非常适合生成报告、发票或者需要归档或邮件分发的文档。

第三,DataURIs在某些场景下可以提高性能。 由于图像数据是直接嵌入 HTML 的,因此在渲染过程中不会出现额外的 HTTP 请求或文件系统操作。 这将加快 PDF 的生成速度,尤其是在处理多个小图片时。

支持哪些图像格式?

IronPDF通过DataURIs支持所有主要图像格式,在PDF生成工作流中提供灵活性:

  • PNG:透明图像或边缘锐利的图形的理想选择。 使用data:image/png;base64,
  • JPEG:最适用于照片和具有多种颜色的复杂图像。 使用data:image/jpeg;base64,
  • GIF:适用于色彩有限的简单动画或图像。 使用data:image/gif;base64,
  • SVG:非常适合可缩放矢量图形。 使用data:image/svg+xml;base64,
  • WebP:具有出色压缩能力的现代格式。 使用 data:image/webp;base64,

下面的示例展示了如何处理不同的图像格式:

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

对于高级图像处理,包括在现有 PDF 中添加图像,IronPDF 提供了全面的支持。

Base64 编码如何影响文件大小?

Base64 编码可将数据大小增加约 33%。 Base64 仅使用 64 个 ASCII 字符来表示二进制数据,每 3 个字节的原始数据需要 4 个字符来表示。 虽然这会增加整体大小,但与独立文档的优势相比,对 PDF 生成的影响往往微乎其微。

通过以下做法优化使用DataURIs时的文件大小:

  1. 在编码之前压缩图像:使用工具或库在转换为base64之前优化图像文件
  2. 选择合适的格式:照片使用JPEG,有透明度的图形使用PNG
  3. 适当调整图像大小:不要嵌入超过PDF输出需求的图像大小 4.考虑 PDF 压缩:生成后使用 IronPDF 的压缩功能

本例演示了嵌入前的图像优化:

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
Icon Quote related to Base64 编码如何影响文件大小?

我最喜欢的这种库是 IronPDF。它允许快速高效地操作 PDF 文件。它还具有许多有价值的功能,比如导出为 PDF/A 格式和数字签名 PDF 文档。

Milan Jovanovic related to Base64 编码如何影响文件大小?

Milan Jovanovic

微软MVP

查看案例研究
Icon Quote related to Base64 编码如何影响文件大小?

IronOCR 意味着我们每年可以节省 $40,000 的人工处理成本,同时提高生产力,并释放资源用于高影响任务。我强烈推荐它。

Brent Matzelle related to Base64 编码如何影响文件大小?

Brent Matzelle

首席技术官,OPYN

查看案例研究
Icon Quote related to Base64 编码如何影响文件大小?

Iron Suite 在我们的运营中起着至关重要的作用。这些工具提高了业务各方面的效率,包括创建平面图和改善库存管理。

David Jones related to Base64 编码如何影响文件大小?

David Jones

首席软件工程师,Agorus Build

查看案例研究

高级技术和最佳实践

在生产环境中使用DataURIs时,实现缓存机制以避免重复编码相同的图像。 在生成具有共享资源的多个 PDF 时,这一点尤为重要。 利用IronPDF的async功能,以获得处理多张图像时的更好性能。

对于包含许多图像的复杂文档,使用混合方法,其中关键图像作为DataURIs嵌入,而较大且可选的图像则外部引用。 这就需要在文件大小合理的情况下平衡文件的自足性。

您还可以使用 IronPDF for .NET 的 ASP.NET MVC 集成将整个 HTML 字符串或 PDF 文档作为字节数组提供。 在构建动态生成和提供 PDF 的网络应用程序时,这种技术非常有效。

对于高级 PDF 操作技术,包括水印、数字签名和表单创建,IronPDF 提供全面的文档和示例,以构建强大的 PDF 解决方案。


使用IronPdf命名空间包含在您的C#或VB.NET项目中。

AddBookmarkAtEnd方法用于将新书签追加到PDF大纲中。

常见问题解答

什么是 DataURIs,为什么要将其用于生成 PDF?

DataURIs 是一种将数据作为 base64 编码字符串直接嵌入 HTML 或 CSS 代码的方案,无需单独的图像文件。IronPDF 完全支持 DataURIs,因此非常适合云环境、分布式系统或需要独立 PDF 而不依赖外部文件的情况。

如何将图像转换为用于嵌入 PDF 的 DataURI 格式?

using IronPDF,将图像转换为 DataURI 涉及三个步骤:首先,使用 System.IO.File.ReadAllBytes() 读取图像字节。其次,使用 Convert.ToBase64String() 将字节转换为 base64。最后,将 base64 字符串嵌入 HTML img 标签,格式为 "data:image/png;base64,[base64string]"。

将图片嵌入 DataURI 时支持哪些图片格式?

IronPDF 支持嵌入各种图像格式作为 DataURI,包括 PNG、JPEG、GIF 和 SVG。这种灵活性使您可以处理不同的图像类型,同时保持对 PDF 生成工作流程的完全控制。

能否在一个 PDF 中使用 DataURIs 嵌入多个图像?

是的,IronPDF 允许您在单个 PDF 文档中使用 DataURIs 嵌入多个图像。只需将每张图片转换为其 base64 表示形式,并在使用 IronPDF 的 ChromePdfRenderer 渲染之前将其包含在 HTML 标记中即可。

using DataURIs 代替文件引用是否会影响性能?

虽然 DataURIs 会因 base64 编码而增加 HTML 字符串的大小,但 IronPDF 可以高效地处理转换。当您需要独立的 PDF 而不需要外部依赖性时,尤其是在云或分布式环境中,这种权衡是值得的。

Curtis Chau
技术作家

Curtis Chau 拥有卡尔顿大学的计算机科学学士学位,专注于前端开发,精通 Node.js、TypeScript、JavaScript 和 React。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。

除了开发之外,Curtis 对物联网 (IoT) 有浓厚的兴趣,探索将硬件和软件集成的新方法。在空闲时间,他喜欢玩游戏和构建 Discord 机器人,将他对技术的热爱与创造力相结合。

准备开始了吗?
Nuget 下载 20,296,129 | 版本: 2026.7 刚刚发布
Still Scrolling Icon

还在滚动吗?

想快速获得证据? PM > Install-Package IronPdf
运行示例看着你的HTML代码变成PDF文件。