在 C# 與 VB 的 PDF 渲染中使用 DataURIs 嵌入圖片
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 文件中。
簡化工作流程(5 個步驟)
- 從 NuGet 下載 IronPDF
- 使用
ReadAllBytes方法 - 請使用
ToBase64String方法將位元組轉換為 base64 - 請將 base64 資訊包含在
img標籤中 - 將 HTML 轉換為 PDF
如何在 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")
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 生成過程更為可靠且具可移植性。 這在 Azure 或 AWS 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
針對進階的影像處理功能(包括將影像加入現有 PDF 檔案),IronPDF 提供全面支援。
Base64 編碼如何影響檔案大小?
Base64 編碼會使資料大小增加約 33%。 Base64 僅使用 64 個 ASCII 字元來表示二進位資料,每 3 位元組原始資料需以 4 個字元來表示。 雖然這會增加整體檔案大小,但相較於自包含文件所帶來的優勢,對 PDF 生成造成的影響通常微乎其微。
using DataURIs 時,請遵循以下做法來優化檔案大小:
- 編碼前壓縮圖片:在轉換為 base64 之前,使用工具或函式庫來優化圖片檔案
- 選擇適當的格式:照片請使用 JPEG,具透明度的圖形請使用 PNG
- 適當調整圖片大小:請勿嵌入超過 PDF 輸出所需大小的圖片
- 考慮 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
進階技巧與最佳實務
在生產環境中使用 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 檔案時,這種取捨是值得的,特別是在雲端或分散式環境中。

