Renderizando PDFs com imagens do Armazenamento de Blobs do Azure em C
Para renderizar PDFs com imagens do Azure Blob Storage em C#, recupere os dados do blob como binários, converta-os em uma string base64, incorpore-os em uma tag img do HTML e use o ChromePdfRenderer do IronPDF para converter o HTML em PDF.
O Azure Blob Storage é um serviço de armazenamento em nuvem fornecido pelo Microsoft Azure. Ele armazena grandes quantidades de dados não estruturados, como texto ou dados binários, acessíveis via HTTP ou HTTPS. Ao trabalhar com PDFs em C#, o IronPDF oferece recursos poderosos para lidar com vários formatos e fontes de imagem, incluindo aquelas armazenadas em serviços de nuvem como o Azure Blob Storage.
Para usar imagens armazenadas no Armazenamento de Blobs do Azure, você deve lidar com o formato de dados binários em vez de referências diretas a arquivos. A solução é converter as imagens em strings base64 e incorporá-las em tags . Essa abordagem funciona perfeitamente com os recursos de conversão de HTML para PDF do IronPDF , mantendo a qualidade e a formatação da imagem.
Início rápido: Renderizar PDFs com imagens do Armazenamento de Blobs do Azure
-
Instale IronPDF com o Gerenciador de Pacotes NuGet
PM > Install-Package IronPdf -
Copie e execute este trecho de código.
var blobBase64 = Convert.ToBase64String(new BlobContainerClient("conn","cont").GetBlobClient("img.jpg").DownloadContent().Value.Content.ToArray()); new IronPdf.ChromePdfRenderer().RenderHtmlAsPdf($"<img src=\"data:image/jpeg;base64,{blobBase64}\" />").SaveAs("blobImage.pdf"); -
Implante para testar em seu ambiente de produção.
Comece a usar IronPDF em seu projeto hoje com uma avaliação gratuita
Fluxo de trabalho mínimo (5 etapas)
- Baixe o IronPDF para renderizar imagens armazenadas no Azure Blob.
- Gerencie o processo de recuperação do blob.
- Utilize o método `ToBase64String` para converter bytes em base64.
- Inclua as informações em base64 na tag `img`
- Converter o HTML para PDF
Como faço para converter imagens do Azure Blob em HTML?
Configure uma conta do Azure Storage com um contêiner contendo blobs e, em seguida, gerencie a autenticação e a conexão em seu projeto C#. Utilize o pacote NuGet Azure.Storage.Blobs juntamente com o IronPDF. Para cenários de autenticação complexos, explore os recursos de cabeçalho de solicitação HTTP do IronPDF para acesso seguro a blobs.
Use o método DownloadToStreamAsync para baixar imagens como fluxos. Converta os dados do fluxo para Base64 e incorpore-os em tags HTML. Incorpore a variável
imageTag no seu documento HTML. Essa técnica funciona bem para criar relatórios ou documentos com imagens de armazenamento em nuvem carregadas dinamicamente.
using Azure.Storage.Blobs;
using System;
using System.IO;
using System.Threading.Tasks;
public async Task ConvertBlobToHtmlAsync()
{
// Define your connection string and container name
string connectionString = "your_connection_string";
string containerName = "your_container_name";
// Initialize BlobServiceClient with the connection string
BlobServiceClient blobServiceClient = new BlobServiceClient(connectionString);
// Get the BlobContainerClient for the specified container
BlobContainerClient blobContainer = blobServiceClient.GetBlobContainerClient(containerName);
// Get the reference to the blob and initialize a stream
BlobClient blobClient = blobContainer.GetBlobClient("867.jpg");
using var stream = new MemoryStream();
// Download the blob data to the stream
await blobClient.DownloadToAsync(stream);
stream.Position = 0; // Reset stream position
// Convert the stream to a byte array
byte[] array = stream.ToArray();
// Convert bytes to base64
var base64 = Convert.ToBase64String(array);
// Create an img tag with the base64-encoded string
var imageTag = $"<img src=\"data:image/jpeg;base64,{base64}\"/><br/>";
// Use the imageTag in your HTML document as needed
}
using Azure.Storage.Blobs;
using System;
using System.IO;
using System.Threading.Tasks;
public async Task ConvertBlobToHtmlAsync()
{
// Define your connection string and container name
string connectionString = "your_connection_string";
string containerName = "your_container_name";
// Initialize BlobServiceClient with the connection string
BlobServiceClient blobServiceClient = new BlobServiceClient(connectionString);
// Get the BlobContainerClient for the specified container
BlobContainerClient blobContainer = blobServiceClient.GetBlobContainerClient(containerName);
// Get the reference to the blob and initialize a stream
BlobClient blobClient = blobContainer.GetBlobClient("867.jpg");
using var stream = new MemoryStream();
// Download the blob data to the stream
await blobClient.DownloadToAsync(stream);
stream.Position = 0; // Reset stream position
// Convert the stream to a byte array
byte[] array = stream.ToArray();
// Convert bytes to base64
var base64 = Convert.ToBase64String(array);
// Create an img tag with the base64-encoded string
var imageTag = $"<img src=\"data:image/jpeg;base64,{base64}\"/><br/>";
// Use the imageTag in your HTML document as needed
}
Imports Azure.Storage.Blobs
Imports System
Imports System.IO
Imports System.Threading.Tasks
Public Async Function ConvertBlobToHtmlAsync() As Task
' Define your connection string and container name
Dim connectionString As String = "your_connection_string"
Dim containerName As String = "your_container_name"
' Initialize BlobServiceClient with the connection string
Dim blobServiceClient As New BlobServiceClient(connectionString)
' Get the BlobContainerClient for the specified container
Dim blobContainer As BlobContainerClient = blobServiceClient.GetBlobContainerClient(containerName)
' Get the reference to the blob and initialize a stream
Dim blobClient As BlobClient = blobContainer.GetBlobClient("867.jpg")
Dim stream = New MemoryStream()
' Download the blob data to the stream
Await blobClient.DownloadToAsync(stream)
stream.Position = 0 ' Reset stream position
' Convert the stream to a byte array
Dim array() As Byte = stream.ToArray()
' Convert bytes to base64
Dim base64 = Convert.ToBase64String(array)
' Create an img tag with the base64-encoded string
Dim imageTag = $"<img src=""data:image/jpeg;base64,{base64}""/><br/>"
' Use the imageTag in your HTML document as needed
End Function
Ao trabalhar com várias imagens ou formatos diferentes, aproveite o suporte do IronPDF para diversos tipos de imagem, incluindo JPG, PNG, SVG e GIF. O método de codificação base64 funciona universalmente em todos esses formatos.
Trabalhando com diferentes formatos de imagem
O Armazenamento de Blobs do Azure suporta vários formatos de imagem, e o IronPDF processa todos eles quando codificados corretamente. Aqui está um exemplo aprimorado que determina dinamicamente o tipo MIME:
public string GetImageMimeType(string blobName)
{
var extension = Path.GetExtension(blobName).ToLower();
return extension switch
{
".jpg" or ".jpeg" => "image/jpeg",
".png" => "image/png",
".gif" => "image/gif",
".svg" => "image/svg+xml",
".webp" => "image/webp",
_ => "image/jpeg" // default fallback
};
}
public async Task<string> CreateImageTagFromBlob(BlobClient blobClient)
{
using var stream = new MemoryStream();
await blobClient.DownloadToAsync(stream);
stream.Position = 0;
var base64 = Convert.ToBase64String(stream.ToArray());
var mimeType = GetImageMimeType(blobClient.Name);
return $"<img src=\"data:{mimeType};base64,{base64}\" alt=\"{Path.GetFileNameWithoutExtension(blobClient.Name)}\"/>";
}
public string GetImageMimeType(string blobName)
{
var extension = Path.GetExtension(blobName).ToLower();
return extension switch
{
".jpg" or ".jpeg" => "image/jpeg",
".png" => "image/png",
".gif" => "image/gif",
".svg" => "image/svg+xml",
".webp" => "image/webp",
_ => "image/jpeg" // default fallback
};
}
public async Task<string> CreateImageTagFromBlob(BlobClient blobClient)
{
using var stream = new MemoryStream();
await blobClient.DownloadToAsync(stream);
stream.Position = 0;
var base64 = Convert.ToBase64String(stream.ToArray());
var mimeType = GetImageMimeType(blobClient.Name);
return $"<img src=\"data:{mimeType};base64,{base64}\" alt=\"{Path.GetFileNameWithoutExtension(blobClient.Name)}\"/>";
}
Imports System.IO
Imports System.Threading.Tasks
Public Function GetImageMimeType(blobName As String) As String
Dim extension = Path.GetExtension(blobName).ToLower()
Select Case extension
Case ".jpg", ".jpeg"
Return "image/jpeg"
Case ".png"
Return "image/png"
Case ".gif"
Return "image/gif"
Case ".svg"
Return "image/svg+xml"
Case ".webp"
Return "image/webp"
Case Else
Return "image/jpeg" ' default fallback
End Select
End Function
Public Async Function CreateImageTagFromBlob(blobClient As BlobClient) As Task(Of String)
Using stream As New MemoryStream()
Await blobClient.DownloadToAsync(stream)
stream.Position = 0
Dim base64 = Convert.ToBase64String(stream.ToArray())
Dim mimeType = GetImageMimeType(blobClient.Name)
Return $"<img src=""data:{mimeType};base64,{base64}"" alt=""{Path.GetFileNameWithoutExtension(blobClient.Name)}""/>"
End Using
End Function
Como faço para converter HTML em PDF?
Converta o imageTag para PDF usando o método RenderHtmlAsPdf do ChromePdfRenderer . O mecanismo de renderização Chrome do IronPDF mantém a qualidade e o posicionamento da imagem durante a conversão. Para obter os melhores resultados, configure as opções de renderização para controlar a qualidade da saída em PDF.
Eis como ligar para RenderHtmlAsPdf:
:path=/static-assets/pdf/content-code-examples/how-to/images-azure-blob-storage-html-to-pdf.cs
using IronPdf;
// Instantiate Renderer
var renderer = new ChromePdfRenderer();
// Create a PDF from a HTML string using C#
var pdf = renderer.RenderHtmlAsPdf(imageTag);
// Export to a file
pdf.SaveAs("imageToPdf.pdf");
Imports IronPdf
' Instantiate Renderer
Private renderer = New ChromePdfRenderer()
' Create a PDF from a HTML string using C#
Private pdf = renderer.RenderHtmlAsPdf(imageTag)
' Export to a file
pdf.SaveAs("imageToPdf.pdf")
Ajuste a variável "htmlContent" para incluir seu conteúdo HTML real com imageTag.
Exemplo funcional completo
Aqui está um exemplo completo que combina a recuperação de dados do Armazenamento de Blobs do Azure com a renderização do IronPDF , incluindo tratamento de erros e otimização:
using Azure.Storage.Blobs;
using IronPdf;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Threading.Tasks;
public class AzureBlobToPdfConverter
{
private readonly string _connectionString;
private readonly ChromePdfRenderer _renderer;
public AzureBlobToPdfConverter(string connectionString)
{
_connectionString = connectionString;
_renderer = new ChromePdfRenderer();
// Configure rendering options for better image quality
_renderer.RenderingOptions.ImageQuality = 100;
_renderer.RenderingOptions.DpiResolution = 300;
}
public async Task<PdfDocument> ConvertBlobImagesToPdfAsync(string containerName, List<string> blobNames)
{
var htmlBuilder = new StringBuilder();
htmlBuilder.Append("<html><body style='margin: 20px;'>");
var blobServiceClient = new BlobServiceClient(_connectionString);
var containerClient = blobServiceClient.GetBlobContainerClient(containerName);
foreach (var blobName in blobNames)
{
try
{
var blobClient = containerClient.GetBlobClient(blobName);
var imageTag = await CreateImageTagFromBlob(blobClient);
htmlBuilder.Append(imageTag);
htmlBuilder.Append("<br/><br/>"); // Add spacing between images
}
catch (Exception ex)
{
// Log error and continue with other images
Console.WriteLine($"Error processing blob {blobName}: {ex.Message}");
}
}
htmlBuilder.Append("</body></html>");
// Convert the complete HTML to PDF
return _renderer.RenderHtmlAsPdf(htmlBuilder.ToString());
}
private async Task<string> CreateImageTagFromBlob(BlobClient blobClient)
{
using var stream = new MemoryStream();
await blobClient.DownloadToAsync(stream);
stream.Position = 0;
var base64 = Convert.ToBase64String(stream.ToArray());
var mimeType = GetImageMimeType(blobClient.Name);
return $"<img src=\"data:{mimeType};base64,{base64}\" " +
$"alt=\"{Path.GetFileNameWithoutExtension(blobClient.Name)}\" " +
$"style=\"max-width: 100%; height: auto;\"/>";
}
private string GetImageMimeType(string blobName)
{
var extension = Path.GetExtension(blobName).ToLower();
return extension switch
{
".jpg" or ".jpeg" => "image/jpeg",
".png" => "image/png",
".gif" => "image/gif",
".svg" => "image/svg+xml",
".webp" => "image/webp",
_ => "image/jpeg"
};
}
}
using Azure.Storage.Blobs;
using IronPdf;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Threading.Tasks;
public class AzureBlobToPdfConverter
{
private readonly string _connectionString;
private readonly ChromePdfRenderer _renderer;
public AzureBlobToPdfConverter(string connectionString)
{
_connectionString = connectionString;
_renderer = new ChromePdfRenderer();
// Configure rendering options for better image quality
_renderer.RenderingOptions.ImageQuality = 100;
_renderer.RenderingOptions.DpiResolution = 300;
}
public async Task<PdfDocument> ConvertBlobImagesToPdfAsync(string containerName, List<string> blobNames)
{
var htmlBuilder = new StringBuilder();
htmlBuilder.Append("<html><body style='margin: 20px;'>");
var blobServiceClient = new BlobServiceClient(_connectionString);
var containerClient = blobServiceClient.GetBlobContainerClient(containerName);
foreach (var blobName in blobNames)
{
try
{
var blobClient = containerClient.GetBlobClient(blobName);
var imageTag = await CreateImageTagFromBlob(blobClient);
htmlBuilder.Append(imageTag);
htmlBuilder.Append("<br/><br/>"); // Add spacing between images
}
catch (Exception ex)
{
// Log error and continue with other images
Console.WriteLine($"Error processing blob {blobName}: {ex.Message}");
}
}
htmlBuilder.Append("</body></html>");
// Convert the complete HTML to PDF
return _renderer.RenderHtmlAsPdf(htmlBuilder.ToString());
}
private async Task<string> CreateImageTagFromBlob(BlobClient blobClient)
{
using var stream = new MemoryStream();
await blobClient.DownloadToAsync(stream);
stream.Position = 0;
var base64 = Convert.ToBase64String(stream.ToArray());
var mimeType = GetImageMimeType(blobClient.Name);
return $"<img src=\"data:{mimeType};base64,{base64}\" " +
$"alt=\"{Path.GetFileNameWithoutExtension(blobClient.Name)}\" " +
$"style=\"max-width: 100%; height: auto;\"/>";
}
private string GetImageMimeType(string blobName)
{
var extension = Path.GetExtension(blobName).ToLower();
return extension switch
{
".jpg" or ".jpeg" => "image/jpeg",
".png" => "image/png",
".gif" => "image/gif",
".svg" => "image/svg+xml",
".webp" => "image/webp",
_ => "image/jpeg"
};
}
}
Imports Azure.Storage.Blobs
Imports IronPdf
Imports System
Imports System.Collections.Generic
Imports System.IO
Imports System.Text
Imports System.Threading.Tasks
Public Class AzureBlobToPdfConverter
Private ReadOnly _connectionString As String
Private ReadOnly _renderer As ChromePdfRenderer
Public Sub New(connectionString As String)
_connectionString = connectionString
_renderer = New ChromePdfRenderer()
' Configure rendering options for better image quality
_renderer.RenderingOptions.ImageQuality = 100
_renderer.RenderingOptions.DpiResolution = 300
End Sub
Public Async Function ConvertBlobImagesToPdfAsync(containerName As String, blobNames As List(Of String)) As Task(Of PdfDocument)
Dim htmlBuilder As New StringBuilder()
htmlBuilder.Append("<html><body style='margin: 20px;'>")
Dim blobServiceClient As New BlobServiceClient(_connectionString)
Dim containerClient = blobServiceClient.GetBlobContainerClient(containerName)
For Each blobName In blobNames
Try
Dim blobClient = containerClient.GetBlobClient(blobName)
Dim imageTag = Await CreateImageTagFromBlob(blobClient)
htmlBuilder.Append(imageTag)
htmlBuilder.Append("<br/><br/>") ' Add spacing between images
Catch ex As Exception
' Log error and continue with other images
Console.WriteLine($"Error processing blob {blobName}: {ex.Message}")
End Try
Next
htmlBuilder.Append("</body></html>")
' Convert the complete HTML to PDF
Return _renderer.RenderHtmlAsPdf(htmlBuilder.ToString())
End Function
Private Async Function CreateImageTagFromBlob(blobClient As BlobClient) As Task(Of String)
Using stream As New MemoryStream()
Await blobClient.DownloadToAsync(stream)
stream.Position = 0
Dim base64 = Convert.ToBase64String(stream.ToArray())
Dim mimeType = GetImageMimeType(blobClient.Name)
Return $"<img src=""data:{mimeType};base64,{base64}"" " &
$"alt=""{Path.GetFileNameWithoutExtension(blobClient.Name)}"" " &
$"style=""max-width: 100%; height: auto;""/>"
End Using
End Function
Private Function GetImageMimeType(blobName As String) As String
Dim extension = Path.GetExtension(blobName).ToLower()
Return extension Select Case extension
Case ".jpg", ".jpeg"
Return "image/jpeg"
Case ".png"
Return "image/png"
Case ".gif"
Return "image/gif"
Case ".svg"
Return "image/svg+xml"
Case ".webp"
Return "image/webp"
Case Else
Return "image/jpeg"
End Select
End Function
End Class
Considerações sobre o desempenho
Ao trabalhar com imagens grandes ou múltiplos objetos, implemente técnicas assíncronas e de multithreading para melhorar o desempenho. Adicione mecanismos de cache para evitar o download repetido dos mesmos blobs.
Para ambientes de produção, especialmente implantações no Azure, consulte o guia de implantação do Azure da IronPDF para obter as melhores práticas e recomendações de configuração. Para operações que exigem muita memória, utilize os recursos de fluxo de memória do IronPDF para otimizar o uso de recursos.
Segurança e Autenticação
Garanta a autenticação adequada ao acessar o Armazenamento de Blobs do Azure. Para maior segurança, implemente cabeçalhos HTTP personalizados ao acessar recursos protegidos. Considere implementar proteção por senha em PDFs para documentos confidenciais que contenham imagens de blobs do Azure.
Solução de problemas comuns
Caso encontre problemas de integração com o armazenamento de blobs, consulte o guia de solução de problemas do Azure da IronPDF para obter soluções para problemas comuns. Para problemas específicos relacionados a imagens, a documentação de renderização de imagens fornece orientações detalhadas sobre como lidar com vários cenários.
Perguntas frequentes
Como faço para gerar PDFs com imagens armazenadas no Armazenamento de Blobs do Azure?
Para gerar PDFs com imagens do Armazenamento de Blobs do Azure, recupere os dados do blob como binários, converta-os em uma string base64, incorpore-os em uma tag img do HTML e use o ChromePdfRenderer do IronPDF para converter o HTML em PDF. Essa abordagem funciona perfeitamente com os recursos de conversão de HTML para PDF do IronPDF, mantendo a qualidade da imagem.
Qual é a maneira mais rápida de renderizar uma imagem do Azure Blob em um PDF?
O método mais rápido é usar o IronPDF com uma abordagem de uma linha: recupere o blob usando BlobContainerClient, converta-o para base64 com Convert.ToBase64String(), incorpore-o em uma tag img e renderize com o método ChromePdfRenderer().RenderHtmlAsPdf() do IronPDF.
Por que não consigo usar referências diretas a arquivos de imagens do Armazenamento de Blobs do Azure em PDFs?
O Armazenamento de Blobs do Azure exige o processamento de dados em formato binário, em vez de referências diretas a arquivos. A solução é converter as imagens em strings base64 e incorporá-las em tags , que o IronPDF pode então processar por meio de seus recursos de conversão de HTML para PDF.
Quais pacotes NuGet eu preciso para trabalhar com imagens do Azure Blob em PDFs?
Você precisará do pacote NuGet Azure.Storage.Blobs para operações de armazenamento de blobs, juntamente com o IronPDF para renderização de PDFs. O IronPDF fornece o ChromePdfRenderer para converter HTML com imagens base64 incorporadas em documentos PDF.
Como faço para lidar com a autenticação para acesso seguro ao Azure Blob ao gerar PDFs?
Configure uma conta do Azure Storage com autenticação e conexão adequadas em seu projeto C#. Para cenários de autenticação complexos, você pode explorar os recursos de cabeçalho de solicitação HTTP do IronPDF para lidar com o acesso seguro a blobs ao renderizar PDFs.

