如何在 C# 中嵌入 Data URI 圖片 | IronPDF

在 C# 與 VB 的 PDF 渲染中使用 DataURIs 嵌入圖片

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

using IronPDF 透過 C# 和 VB.NET 中的 DataURIs 將圖片直接嵌入 PDF 文件中,透過將圖片位元組轉換為 base64 字串,並將其內嵌於 HTML 標記中,以實現無縫的 PDF 渲染,從而消除對外部檔案的依賴。

在處理 HTML 字串和文件時,避免依賴資產目錄通常至關重要。 資料 URI 方案提供了一種有效的解決方案。

資料 URI 方案可將資料直接嵌入 HTML 或 CSS 程式碼中,無需另行建立獨立檔案。 DataURIs 允許將圖片、檔案和字型直接作為字串嵌入 HTML 文件中。

快速入門:使用 DataURIs 在 PDF 中嵌入圖片

透過 IronPDF 並使用 DataURIs 嵌入圖片,將 HTML 內容轉換為 PDF 文件。 本指南將示範如何透過簡單且高效的程式碼,渲染內含嵌入式圖片的 PDF 檔案。 IronPDF 可在轉換 HTML 為 PDF 時,同時維持圖片的完整性。 以下是一個簡單的範例,展示如何使用 DataURI 並以最少的程式碼,將圖片直接嵌入 PDF 文件中。

  1. using 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 中使用 DataURI 嵌入圖片?

using DataURIs 嵌入圖片,可將圖片直接包含於 HTML 標記中,無需引用外部檔案。 此方法在雲端環境、分散式系統中生成 PDF 時,或需確保所有資源皆為自包含時,效果尤佳。 IronPDF 的 HTML 轉 PDF 功能完全支援 DataURIs,可建立內嵌圖片的 Professional PDF 檔案。

此流程包含三個步驟:讀取圖像資料、將其轉換為 base64 格式,並將其嵌入 HTML 的 img 標籤中。 此方法支援多種圖像格式,包括 PNG、JPEG、GIF 和 SVG,為 PDF 生成工作流程提供靈活性。 無論處理 Azure Blob Storage 影像或本機檔案,其運作原理均保持一致。

基本圖片嵌入範例

此完整範例示範如何使用 DataURIs 將圖片嵌入 PDF/A 中:

: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")

為什麼應該使用 DataURIs 而不是檔案參照?

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 生成造成的影響通常微乎其微。 using 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

進階技巧與最佳實務

在生產環境中使用 DataURIs 時,請實作快取機制,以避免重複編碼相同的圖片。 這在使用共用資源生成多個 PDF 檔案時尤為重要。 善用 IronPDF 的 async 功能,在處理多張圖片時獲得更佳效能。

對於包含大量圖片的複雜文件,請採用混合方式:將關鍵圖片嵌入為 DataURIs,而較大且非必要的圖片則透過外部連結引用。 這在保持文件自成一體的同時,也能確保檔案大小適中。

您亦可透過 IronPDF 的 ASP.NET MVC 整合功能,將完整的 HTML 字串或 PDF 文件作為位元組陣列傳送。 此技術在建置能動態產生並提供 PDF 的網頁應用程式時效果極佳。

針對進階的 PDF 處理技術,包括浮水印、數位簽章及表單建立,IronPDF 提供詳盡的文件與範例,協助建構穩健的 PDF 解決方案。


請使用 using IronPdf 指令,將 IronPdf 命名空間加入您的 C# 或 VB.NET 專案中。

AddBookmarkAtEnd 方法用於將新書籤追加至 PDF 大綱中。

常見問題

什麼是 DataURI,以及為何要將其用於 PDF 生成?

DataURIs 是一種將資料直接以 base64 編碼字串形式嵌入 HTML 或 CSS 程式碼的方案,無需另行使用獨立的圖片檔案。IronPDF 完全支援 DataURIs,使其非常適合雲端環境、分散式系統,或當您需要不依賴外部檔案的自包含 PDF 檔案時。

如何將圖片轉換為 DataURI 格式以便嵌入 PDF?

using IronPDF 將圖片轉換為 DataURI 需經過三個步驟:首先,使用 System.IO.File.ReadAllBytes() 讀取圖片位元組;其次,使用 Convert.ToBase64String() 將位元組轉換為 base64 字串;最後,將 base64 字串嵌入 HTML img 標籤中,格式為 'data:image/png;base64,[base64string]'。

將圖片嵌入為 DataURI 時,支援哪些圖片格式?

IronPDF 支援將各種圖像格式(包括 PNG、JPEG、GIF 和 SVG)作為 DataURI 嵌入。這種靈活性讓您能夠處理不同類型的圖像,同時對 PDF 生成工作流程保持完全的控制權。

我可以在單一 PDF 中使用 DataURIs 嵌入多張圖片嗎?

是的,IronPDF 允許您在單一 PDF 文件中使用 DataURIs 嵌入多張圖片。只需將每張圖片轉換為 Base64 格式,並在透過 IronPDF 的 ChromePdfRenderer 進行渲染前,將其包含在 HTML 標記中即可。

using DataURIs 代替檔案參照會對效能造成影響嗎?

雖然 DataURIs 會因 base64 編碼而增加 HTML 字串的大小,但 IronPDF 能高效處理此轉換。當您需要無外部依賴的自包含 PDF 檔案時,這種取捨是值得的,特別是在雲端或分散式環境中。

Curtis Chau
技術撰稿人

Curtis Chau 擁有卡爾頓大學(Carleton University)的電腦科學學士學位,專精於前端開發,並精通 Node.js、TypeScript、JavaScript 及 React。他熱衷於打造直觀且美觀的用戶介面,喜歡運用現代框架,並創建結構完善、視覺上吸引人的手冊。

除了開發工作之外,Curtis 對物聯網(IoT)抱有濃厚興趣,致力於探索整合硬體與軟體的創新方法。閒暇時,他喜歡玩遊戲和開發 Discord 機器人,將對科技的熱愛與創意相結合。

準備開始了嗎?
Nuget 下載 19,014,616 | 版本: 2026.5 just released
Still Scrolling Icon

還在往下捲動嗎?

想要快速確認成果嗎? PM > Install-Package IronPdf
執行範例 觀看您的 HTML 轉為 PDF。