DEV Community

IronSoftware
IronSoftware

Posted on

PDF Images from Azure Blob Storage in C#

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");
Enter fullscreen mode Exit fullscreen mode

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");
Enter fullscreen mode Exit fullscreen mode

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);
Enter fullscreen mode Exit fullscreen mode

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);
Enter fullscreen mode Exit fullscreen mode

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");
Enter fullscreen mode Exit fullscreen mode

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");
Enter fullscreen mode Exit fullscreen mode

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"
        });
    }
}
Enter fullscreen mode Exit fullscreen mode

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)}";
}
Enter fullscreen mode Exit fullscreen mode

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)