C#에서 Azure Blob Storage에 저장된 이미지를 렌더링하는 방법 | IronPDF

C#에서 Azure Blob Storage 이미지를 사용하여 PDF 렌더링하기

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

C#에서 Azure Blob Storage 이미지를 사용하여 PDF를 렌더링하려면 Blob 데이터를 바이너리 형식으로 검색하고, 이를 base64 문자열로 변환한 다음, HTML img 태그에 삽입하고, IronPDF의 ChromePdfRenderer를 사용하여 HTML을 PDF로 변환합니다.

Azure Blob Storage는 Microsoft Azure에서 제공하는 클라우드 기반 스토리지 서비스입니다. HTTP 또는 HTTPS를 통해 접근 가능한 텍스트나 바이너리 데이터와 같은 대량의 비정형 데이터를 저장합니다. C#에서 PDF를 다룰 때 IronPDF는 Azure Blob Storage와 같은 클라우드 서비스에 저장된 이미지를 포함하여 다양한 이미지 형식과 소스를 처리할 수 있는 강력한 기능을 제공합니다 .

Azure Blob Storage에 저장된 이미지를 사용하려면 파일을 직접 참조하는 대신 바이너리 데이터 형식을 처리해야 합니다. 해결책은 이미지를 base64 문자열로 변환한 다음 img 태그에 삽입하는 것입니다. 이 접근 방식은 IronPDF의 HTML을 PDF로 변환하는 기능 과 완벽하게 호환되어 이미지 품질과 서식을 유지합니다.

빠른 시작: Azure Blob Storage 이미지를 사용하여 PDF 렌더링

Nuget Icon지금 바로 NuGet을 사용하여 PDF 만들기를 시작하세요.

  1. NuGet 패키지 관리자를 사용하여 IronPDF를 설치하세요.

    PM > Install-Package IronPdf

  2. 다음 코드 조각을 복사하여 실행하세요.

    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");
  3. 실제 운영 환경에서 테스트할 수 있도록 배포하세요.

    지금 바로 무료 체험판을 통해 프로젝트에서 IronPDF를 사용해 보세요.
    arrow pointer


Azure Blob 이미지를 HTML로 변환하는 방법은 무엇인가요?

Blob이 포함된 컨테이너가 있는 Azure Storage 계정을 설정한 다음 C# 프로젝트에서 인증 및 연결을 처리합니다. IronPDF와 함께 Azure.Storage.Blobs NuGet 패키지를 사용하십시오. 복잡한 인증 시나리오의 경우, IronPDF의 HTTP 요청 헤더 기능을 활용하여 안전한 데이터 블록 접근을 구현해 보세요.

이미지를 스트림으로 다운로드하려면 DownloadToStreamAsync 메서드를 사용하세요. 스트림 데이터를 Base64로 변환하여 HTML img 태그에 삽입합니다. imageTag 변수를 HTML 문서에 병합하세요. 이 기술은 클라우드 저장소에 저장된 이미지를 동적으로 불러와 보고서나 문서를 작성하는 데 효과적입니다.

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
}
$vbLabelText   $csharpLabel

여러 이미지 또는 서로 다른 형식의 이미지를 다룰 때는 IronPDF가 지원하는 JPG, PNG, SVG, GIF 등 다양한 이미지 형식을 활용하세요. Base64 인코딩 방식은 이러한 모든 형식에서 보편적으로 작동합니다.

다양한 이미지 형식 작업하기

Azure Blob Storage는 다양한 이미지 형식을 지원하며, IronPDF는 적절하게 인코딩된 경우 모든 형식을 처리합니다. 다음은 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)}\"/>";
}
$vbLabelText   $csharpLabel

HTML을 PDF로 변환하는 방법은 무엇인가요?

ChromePdfRendererRenderHtmlAsPdf 메서드를 사용하여 imageTag를 PDF로 변환합니다. IronPDF의 크롬 렌더링 엔진은 변환 과정에서 이미지 품질과 위치를 유지합니다. 최적의 결과를 얻으려면 렌더링 옵션을 구성하여 PDF 출력 품질을 제어하십시오.

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");
$vbLabelText   $csharpLabel

"htmlContent" 변수를 수정하여 imageTag와 함께 실제 HTML 콘텐츠를 포함시키세요.

완전한 작동 예시

다음은 오류 처리 및 최적화를 포함하여 Azure Blob Storage 검색과 IronPDF 렌더링을 결합한 포괄적인 예제입니다.

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"
        };
    }
}
$vbLabelText   $csharpLabel

성능 고려 사항

대용량 이미지나 여러 개의 데이터 덩어리를 처리할 때는 비동기 및 멀티스레딩 기법을 구현하여 성능을 향상시키세요. 동일한 데이터 블록을 반복적으로 다운로드하는 것을 방지하기 위해 캐싱 메커니즘을 추가하세요.

특히 Azure 배포와 같은 프로덕션 환경의 경우, IronPDF의 Azure 배포 가이드를 참조하여 모범 사례 및 구성 권장 사항을 확인하십시오. 메모리 사용량이 많은 작업의 경우, IronPDF의 메모리 스트림 기능을 활용하여 리소스 사용량을 최적화하십시오.

보안 및 인증

Azure Blob Storage에 액세스할 때는 올바른 인증이 이루어져야 합니다. 보안 강화를 위해 보호된 리소스에 접근할 때 사용자 지정 HTTP 헤더를 구현하십시오. Azure Blob 이미지가 포함된 중요한 문서에 대해 PDF 암호 보호 기능을 구현하는 것을 고려해 보세요.

일반적인 문제 해결

Blob 스토리지 통합 관련 문제가 발생하는 경우, 일반적인 문제 해결 방법을 알아보려면 IronPDF의 Azure 문제 해결 가이드를 참조하세요. 이미지 관련 문제의 경우, 이미지 렌더링 문서에서 다양한 시나리오 처리 방법에 대한 자세한 지침을 확인할 수 있습니다.

자주 묻는 질문

Azure Blob Storage에 저장된 이미지를 사용하여 PDF를 생성하려면 어떻게 해야 하나요?

Azure Blob Storage 이미지를 사용하여 PDF를 생성하려면, Blob 데이터를 바이너리 형식으로 가져와 base64 문자열로 변환한 다음 HTML img 태그에 삽입하고 IronPDF의 ChromePdfRenderer를 사용하여 HTML을 PDF로 변환합니다. 이 방법은 이미지 품질을 유지하면서 IronPDF의 HTML-PDF 변환 기능과 원활하게 작동합니다.

Azure Blob 이미지를 PDF로 변환하는 가장 빠른 방법은 무엇인가요?

가장 빠른 방법은 IronPDF를 사용하는 한 줄짜리 접근 방식입니다. BlobContainerClient를 사용하여 blob을 가져오고, Convert.ToBase64String()을 사용하여 base64로 변환한 다음, img 태그에 삽입하고 IronPDF의 ChromePdfRenderer().RenderHtmlAsPdf() 메서드를 사용하여 렌더링합니다.

PDF에서 Azure Blob Storage 이미지에 대한 직접 파일 참조를 사용할 수 없는 이유는 무엇입니까?

Azure Blob Storage는 직접 파일 참조가 아닌 바이너리 데이터 형식을 처리해야 합니다. 해결 방법은 이미지를 base64 문자열로 변환하여 img 태그에 삽입하는 것이며, IronPDF는 이를 HTML-PDF 변환 기능을 통해 처리할 수 있습니다.

PDF에서 Azure Blob 이미지를 사용하려면 어떤 NuGet 패키지가 필요합니까?

Blob 스토리지 작업을 위해서는 Azure.Storage.Blobs NuGet 패키지가 필요하고, PDF 렌더링을 위해서는 IronPDF가 필요합니다. IronPDF는 내장된 base64 이미지가 포함된 HTML을 PDF 문서로 변환하는 ChromePdfRenderer를 제공합니다.

PDF를 생성할 때 보안 Azure Blob 액세스에 대한 인증은 어떻게 처리해야 하나요?

C# 프로젝트에서 적절한 인증 및 연결을 사용하여 Azure Storage 계정을 설정하세요. 복잡한 인증 시나리오의 경우, PDF 렌더링 시 보안 Blob 액세스를 처리하기 위해 IronPDF의 HTTP 요청 헤더 기능을 활용할 수 있습니다.

커티스 차우
기술 문서 작성자

커티스 차우는 칼턴 대학교에서 컴퓨터 과학 학사 학위를 취득했으며, Node.js, TypeScript, JavaScript, React를 전문으로 하는 프론트엔드 개발자입니다. 직관적이고 미적으로 뛰어난 사용자 인터페이스를 만드는 데 열정을 가진 그는 최신 프레임워크를 활용하고, 잘 구성되고 시각적으로 매력적인 매뉴얼을 제작하는 것을 즐깁니다.

커티스는 개발 분야 외에도 사물 인터넷(IoT)에 깊은 관심을 가지고 있으며, 하드웨어와 소프트웨어를 통합하는 혁신적인 방법을 연구합니다. 여가 시간에는 게임을 즐기거나 디스코드 봇을 만들면서 기술에 대한 애정과 창의성을 결합합니다.

시작할 준비 되셨나요?
Nuget 다운로드 17,527,568 | 버전: 2026.2 방금 출시되었습니다