Azure Blob Storage hosts your images in the cloud. When generating PDFs, you need to fetch these images and embed them—either via URLs or Base64 encoding for reliable offline rendering.
using IronPdf;
using Azure.Storage.Blobs;
// Install via NuGet: Install-Package IronPdf
// Install via NuGet: Install-Package Azure.Storage.Blobs
var blobClient = new BlobContainerClient(connectionString, "images")
.GetBlobClient("logo.png");
var content = blobClient.DownloadContent().Value.Content.ToArray();
var base64 = Convert.ToBase64String(content);
var html = $"<img src='data:image/png;base64,{base64}' /><h1>Report</h1>";
var pdf = new [ChromePdfRenderer](https://ironpdf.com/blog/videos/how-to-render-html-string-to-pdf-in-csharp-ironpdf/)().RenderHtmlAsPdf(html);
pdf.SaveAs("report.pdf");
Base64 embedding ensures images render correctly regardless of network access during PDF generation.
How Do I Embed Blob Images with Base64?
Download the blob and convert to Base64:
using IronPdf;
using Azure.Storage.Blobs;
// Install via NuGet: Install-Package IronPdf
// Install via NuGet: Install-Package Azure.Storage.Blobs
public async Task<string> GetBlobAsBase64(string containerName, string blobName)
{
var connectionString = Environment.GetEnvironmentVariable("AZURE_STORAGE_CONNECTION");
var container = new BlobContainerClient(connectionString, containerName);
var blob = container.GetBlobClient(blobName);
var response = await blob.DownloadContentAsync();
var bytes = response.Value.Content.ToArray();
return Convert.ToBase64String(bytes);
}
// Usage
var logoBase64 = await GetBlobAsBase64("images", "company-logo.png");
var bannerBase64 = await GetBlobAsBase64("images", "header-banner.jpg");
var html = $@"
<html>
<body>
<img src='data:image/png;base64,{logoBase64}' style='height:50px;' />
<img src='data:image/jpeg;base64,{bannerBase64}' style='width:100%;' />
<h1>Monthly Report</h1>
</body>
</html>";
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("report-with-blob-images.pdf");
How Do I Use Blob URLs Directly?
For public containers or SAS tokens:
using IronPdf;
using Azure.Storage.Blobs;
using Azure.Storage.Sas;
// Install via NuGet: Install-Package IronPdf
// Install via NuGet: Install-Package Azure.Storage.Blobs
public string GetBlobUrlWithSas(string containerName, string blobName)
{
var connectionString = Environment.GetEnvironmentVariable("AZURE_STORAGE_CONNECTION");
var container = new BlobContainerClient(connectionString, containerName);
var blob = container.GetBlobClient(blobName);
// Generate SAS token valid for 1 hour
var sasBuilder = new BlobSasBuilder
{
BlobContainerName = containerName,
BlobName = blobName,
Resource = "b",
ExpiresOn = DateTimeOffset.UtcNow.AddHours(1)
};
sasBuilder.SetPermissions(BlobSasPermissions.Read);
var sasUri = blob.GenerateSasUri(sasBuilder);
return sasUri.ToString();
}
// Usage with direct URLs
var imageUrl = GetBlobUrlWithSas("images", "chart.png");
var html = $@"
<html>
<body>
<img src='{imageUrl}' />
<p>Data visualization</p>
</body>
</html>";
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
SAS tokens provide temporary access without exposing your storage key.
How Do I Handle Multiple Images?
Batch process images from a container:
using IronPdf;
using Azure.Storage.Blobs;
// Install via NuGet: Install-Package IronPdf
// Install via NuGet: Install-Package Azure.Storage.Blobs
public async Task<Dictionary<string, string>> GetImagesAsBase64(
string containerName, params string[] blobNames)
{
var connectionString = Environment.GetEnvironmentVariable("AZURE_STORAGE_CONNECTION");
var container = new BlobContainerClient(connectionString, containerName);
var images = new Dictionary<string, string>();
foreach (var blobName in blobNames)
{
var blob = container.GetBlobClient(blobName);
var response = await blob.DownloadContentAsync();
var base64 = Convert.ToBase64String(response.Value.Content.ToArray());
// Determine mime type from extension
var extension = Path.GetExtension(blobName).ToLower();
var mimeType = extension switch
{
".png" => "image/png",
".jpg" or ".jpeg" => "image/jpeg",
".gif" => "image/gif",
".svg" => "image/svg+xml",
_ => "image/png"
};
images[blobName] = $"data:{mimeType};base64,{base64}";
}
return images;
}
// Usage
var images = await GetImagesAsBase64("reports",
"logo.png", "chart1.png", "chart2.png", "footer.png");
var html = $@"
<img src='{images["logo.png"]}' />
<h1>Sales Report</h1>
<img src='{images["chart1.png"]}' />
<img src='{images["chart2.png"]}' />
<img src='{images["footer.png"]}' />";
var pdf = new ChromePdfRenderer().RenderHtmlAsPdf(html);
How Do I Save PDFs to Blob Storage?
Upload generated PDFs back to Azure:
using IronPdf;
using Azure.Storage.Blobs;
// Install via NuGet: Install-Package IronPdf
// Install via NuGet: Install-Package Azure.Storage.Blobs
public async Task SavePdfToBlob(PdfDocument pdf, string containerName, string blobName)
{
var connectionString = Environment.GetEnvironmentVariable("AZURE_STORAGE_CONNECTION");
var container = new BlobContainerClient(connectionString, containerName);
await container.CreateIfNotExistsAsync();
var blob = container.GetBlobClient(blobName);
using var stream = new MemoryStream(pdf.BinaryData);
await blob.UploadAsync(stream, overwrite: true);
// Set content type for browser viewing
await blob.SetHttpHeadersAsync(new BlobHttpHeaders
{
ContentType = "application/pdf"
});
}
// Usage
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Generated Report</h1>");
await SavePdfToBlob(pdf, "reports", $"report-{DateTime.Now:yyyy-MM-dd}.pdf");
How Do I Load PDFs from Blob Storage?
Read existing PDFs from Azure:
using IronPdf;
using Azure.Storage.Blobs;
// Install via NuGet: Install-Package IronPdf
// Install via NuGet: Install-Package Azure.Storage.Blobs
public async Task<PdfDocument> LoadPdfFromBlob(string containerName, string blobName)
{
var connectionString = Environment.GetEnvironmentVariable("AZURE_STORAGE_CONNECTION");
var container = new BlobContainerClient(connectionString, containerName);
var blob = container.GetBlobClient(blobName);
var response = await blob.DownloadContentAsync();
var bytes = response.Value.Content.ToArray();
return new PdfDocument(bytes);
}
// Usage: Load, modify, and save back
var pdf = await LoadPdfFromBlob("reports", "template.pdf");
// Add watermark
pdf.ApplyStamp(new TextStamper
{
Text = "CONFIDENTIAL",
Opacity = 20,
Rotation = -45
});
await SavePdfToBlob(pdf, "reports", "confidential-template.pdf");
How Do I Create a Complete Blob-Based Report?
Full workflow with Azure integration:
using IronPdf;
using Azure.Storage.Blobs;
// Install via NuGet: Install-Package IronPdf
// Install via NuGet: Install-Package Azure.Storage.Blobs
public class AzurePdfGenerator
{
private readonly BlobContainerClient _imageContainer;
private readonly BlobContainerClient _pdfContainer;
public AzurePdfGenerator(string connectionString)
{
_imageContainer = new BlobContainerClient(connectionString, "images");
_pdfContainer = new BlobContainerClient(connectionString, "pdfs");
}
public async Task<string> GenerateReportAsync(ReportData data)
{
// Fetch images from blob storage
var logo = await GetImageBase64("company-logo.png");
var chart = await GetImageBase64($"charts/{data.ChartId}.png");
// Build HTML with embedded images
var html = $@"
<html>
<head>
<style>
body {{ font-family: Arial; padding: 40px; }}
.header {{ display: flex; justify-content: space-between; }}
.chart {{ width: 100%; margin: 20px 0; }}
</style>
</head>
<body>
<div class='header'>
<img src='{logo}' style='height:40px;' />
<span>Generated: {DateTime.Now:g}</span>
</div>
<h1>{data.Title}</h1>
<img src='{chart}' class='chart' />
<p>{data.Summary}</p>
</body>
</html>";
// Generate PDF
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
// Save to blob storage
var blobName = $"reports/{data.ReportId}-{DateTime.Now:yyyyMMdd}.pdf";
await SavePdfAsync(pdf, blobName);
return blobName;
}
private async Task<string> GetImageBase64(string blobName)
{
var blob = _imageContainer.GetBlobClient(blobName);
var response = await blob.DownloadContentAsync();
var bytes = response.Value.Content.ToArray();
var extension = Path.GetExtension(blobName).ToLower();
var mime = extension == ".png" ? "image/png" : "image/jpeg";
return $"data:{mime};base64,{Convert.ToBase64String(bytes)}";
}
private async Task SavePdfAsync(PdfDocument pdf, string blobName)
{
await _pdfContainer.CreateIfNotExistsAsync();
var blob = _pdfContainer.GetBlobClient(blobName);
using var stream = new MemoryStream(pdf.BinaryData);
await blob.UploadAsync(stream, overwrite: true);
await blob.SetHttpHeadersAsync(new BlobHttpHeaders
{
ContentType = "application/pdf"
});
}
}
How Do I Handle Large Images?
Optimize blob images for PDF:
using IronPdf;
using Azure.Storage.Blobs;
using SkiaSharp;
// Install via NuGet: Install-Package IronPdf
// Install via NuGet: Install-Package Azure.Storage.Blobs
// Install via NuGet: Install-Package SkiaSharp
public async Task<string> GetOptimizedImageBase64(string blobName, int maxWidth = 800)
{
var blob = _container.GetBlobClient(blobName);
var response = await blob.DownloadContentAsync();
var bytes = response.Value.Content.ToArray();
// Resize if needed
using var bitmap = SKBitmap.Decode(bytes);
if (bitmap.Width > maxWidth)
{
var ratio = (float)maxWidth / bitmap.Width;
var newHeight = (int)(bitmap.Height * ratio);
using var resized = bitmap.Resize(new SKSizeI(maxWidth, newHeight), SKSamplingOptions.Default);
using var image = SKImage.FromBitmap(resized);
using var data = image.Encode(SKEncodedImageFormat.Jpeg, 85);
return $"data:image/jpeg;base64,{Convert.ToBase64String(data.ToArray())}";
}
return $"data:image/png;base64,{Convert.ToBase64String(bytes)}";
}
Quick Reference
| Operation | Method |
|---|---|
| Download blob | blob.DownloadContentAsync() |
| Convert to Base64 | Convert.ToBase64String(bytes) |
| Generate SAS URL | blob.GenerateSasUri(sasBuilder) |
| Upload PDF | blob.UploadAsync(stream) |
| Set content type | blob.SetHttpHeadersAsync(headers) |
| Embedding Method | Use Case |
|---|---|
| Base64 | Offline rendering, guaranteed display |
| SAS URL | Large images, reduce HTML size |
| Public URL | Public containers, simple setup |
Azure Blob Storage integration lets you build scalable PDF generation with cloud-hosted assets.
For more Azure integration options, see the IronPDF Azure Blob Storage documentation.
Written by Jacob Mellor, CTO at Iron Software. Jacob created IronPDF and leads a team of 50+ engineers building .NET document processing libraries.
Top comments (0)