PDF to MemoryStream C

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

使用 IronPDF 的 Stream 屬性或 BinaryData 屬性,在 C# .NET中將 PDF 轉換為 MemoryStream,從而實現無需存取檔案系統即可在記憶體中操作 PDF,適用於 Web 應用程式和資料處理。

我們可以在 C# .NET中將 PDF 匯出到 MemoryStream,而無需存取檔案系統。 這是透過.NET命名空間中存在的 MemoryStream 物件實現的。 這種方法在開發基於雲端的應用程式、使用 Azure Blob 儲存體或需要在記憶體中處理 PDF 以優化效能時特別有用。

對於現代 Web 應用程式而言,在記憶體流中處理 PDF 的能力至關重要,尤其是在部署到 Azure或其他雲端平台時,檔案系統存取可能受到限制,或者當您想要避免磁碟 I/O 操作的開銷時。 IronPDF內建的流程操作方法讓這個過程變得簡單。

快速入門:將 PDF 轉換為 MemoryStream

使用 IronPDF 的 API 將 PDF 檔案轉換為 MemoryStream。 本指南可協助開發人員開始載入 PDF 並將其匯出至 MemoryStream,以便整合到.NET應用程式中。 依照這個例子,在 C# 中實作 PDF 處理功能。

  1. 使用NuGet套件管理器安裝https://www.nuget.org/packages/IronPdf

    PM > Install-Package IronPdf
  2. 複製並運行這段程式碼。

    using var stream = new IronPdf.ChromePdfRenderer().RenderHtmlAsPdf("<h1>Hello Stream!</h1>").Stream;
  3. 部署到您的生產環境進行測試

    今天就在您的專案中開始使用免費試用IronPDF

    arrow pointer

如何將PDF檔案儲存到記憶體中?

代碼 973 可以透過以下兩種方式之一直接儲存到記憶體中:

使用 Stream 還是 BinaryData 取決於您的特定使用場景。 當您需要使用基於流的 API 或希望保持與其他.NET流操作的兼容性時,MemoryStream 是理想之選。 將二進位資料作為位元組數組非常適合需要將 PDF 資料儲存在資料庫中、快取在記憶體中或透過網路傳輸的場景。

:path=/static-assets/pdf/content-code-examples/how-to/pdf-to-memory-stream-to-stream.cs
using IronPdf;
using System.IO;

var renderer = new ChromePdfRenderer();

// Convert the URL into PDF
PdfDocument pdf = renderer.RenderUrlAsPdf("https://ironpdf.com/");

// Export PDF as Stream
MemoryStream pdfAsStream = pdf.Stream;

// Export PDF as Byte Array
byte[] pdfAsByte = pdf.BinaryData;
$vbLabelText   $csharpLabel

處理現有PDF文件

當您需要從記憶體載入 PDF 檔案時, IronPDF提供了便捷的方法來處理已在記憶體中的 PDF 檔案:

using IronPdf;
using System.IO;

// Load PDF from byte array
byte[] pdfBytes = File.ReadAllBytes("existing.pdf");
PdfDocument pdfFromBytes = PdfDocument.FromFile(new MemoryStream(pdfBytes));

// Or directly from a MemoryStream
MemoryStream memoryStream = new MemoryStream(pdfBytes);
PdfDocument pdfFromStream = PdfDocument.FromFile(memoryStream);

// Modify the PDF (add watermark, headers, etc.)
// Then export back to memory
byte[] modifiedPdfBytes = pdfFromStream.BinaryData;
using IronPdf;
using System.IO;

// Load PDF from byte array
byte[] pdfBytes = File.ReadAllBytes("existing.pdf");
PdfDocument pdfFromBytes = PdfDocument.FromFile(new MemoryStream(pdfBytes));

// Or directly from a MemoryStream
MemoryStream memoryStream = new MemoryStream(pdfBytes);
PdfDocument pdfFromStream = PdfDocument.FromFile(memoryStream);

// Modify the PDF (add watermark, headers, etc.)
// Then export back to memory
byte[] modifiedPdfBytes = pdfFromStream.BinaryData;
$vbLabelText   $csharpLabel

進階記憶體流操作

對於更複雜的場景,例如從 HTML 字串建立 PDF將多個影像轉換為 PDF時,您可以組合多個操作,同時將所有內容儲存在記憶體中:

using IronPdf;
using System.IO;
using System.Collections.Generic;

// Create multiple PDFs in memory
var renderer = new ChromePdfRenderer();
List<MemoryStream> pdfStreams = new List<MemoryStream>();

// Generate multiple PDFs from HTML
string[] htmlTemplates = { 
    "<h1>Report 1</h1><p>Content...</p>", 
    "<h1>Report 2</h1><p>Content...</p>" 
};

foreach (var html in htmlTemplates)
{
    PdfDocument pdf = renderer.RenderHtmlAsPdf(html);
    pdfStreams.Add(pdf.Stream);
}

// Merge all PDFs in memory
PdfDocument mergedPdf = PdfDocument.Merge(pdfStreams.Select(s => 
    PdfDocument.FromFile(s)).ToList());

// Get the final merged PDF as a stream
MemoryStream finalStream = mergedPdf.Stream;
using IronPdf;
using System.IO;
using System.Collections.Generic;

// Create multiple PDFs in memory
var renderer = new ChromePdfRenderer();
List<MemoryStream> pdfStreams = new List<MemoryStream>();

// Generate multiple PDFs from HTML
string[] htmlTemplates = { 
    "<h1>Report 1</h1><p>Content...</p>", 
    "<h1>Report 2</h1><p>Content...</p>" 
};

foreach (var html in htmlTemplates)
{
    PdfDocument pdf = renderer.RenderHtmlAsPdf(html);
    pdfStreams.Add(pdf.Stream);
}

// Merge all PDFs in memory
PdfDocument mergedPdf = PdfDocument.Merge(pdfStreams.Select(s => 
    PdfDocument.FromFile(s)).ToList());

// Get the final merged PDF as a stream
MemoryStream finalStream = mergedPdf.Stream;
$vbLabelText   $csharpLabel

如何將記憶體中的 PDF 檔案提供給 Web?

要在網路上提供或匯出 PDF 文件,需要將 PDF 文件作為二進位資料而不是 HTML 發送。 您可以在本指南中找到有關在 C# 中匯出和儲存 PDF 文件的更多資訊。 在使用 Web 應用程式時,尤其是在ASP.NET MVC 環境中,從記憶體流提供 PDF 具有許多優勢,包括更高的效能和更低的伺服器磁碟使用率。

以下是一個 MVC 和ASP.NET的簡單範例:

如何使用 MVC 匯出 PDF?

下面程式碼片段中的流是從IronPDF檢索到的二進位資料。 回應的 MIME 類型為"application/pdf",檔案名稱指定為"download.pdf"。 這種方法與現代 MVC 應用程式無縫協作,並且可以整合到您現有的控制器中。

using System.Web.Mvc;
using System.IO;

public ActionResult ExportPdf()
{
    // Assume pdfAsStream is a MemoryStream containing PDF data
    MemoryStream pdfAsStream = new MemoryStream();

    return new FileStreamResult(pdfAsStream, "application/pdf")
    {
        FileDownloadName = "download.pdf"
    };
}
using System.Web.Mvc;
using System.IO;

public ActionResult ExportPdf()
{
    // Assume pdfAsStream is a MemoryStream containing PDF data
    MemoryStream pdfAsStream = new MemoryStream();

    return new FileStreamResult(pdfAsStream, "application/pdf")
    {
        FileDownloadName = "download.pdf"
    };
}
$vbLabelText   $csharpLabel

對於更高級的場景,例如當您使用Razor Pages或需要實作自訂標頭時:

using System.Web.Mvc;
using IronPdf;

public ActionResult GenerateReport(string reportType)
{
    var renderer = new ChromePdfRenderer();

    // Configure rendering options for better output
    renderer.RenderingOptions.MarginTop = 50;
    renderer.RenderingOptions.MarginBottom = 50;
    renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Portrait;

    // Generate PDF based on report type
    string htmlContent = GetReportHtml(reportType);
    PdfDocument pdf = renderer.RenderHtmlAsPdf(htmlContent);

    // Add metadata
    pdf.MetaData.Author = "Your Application";
    pdf.MetaData.Title = $"{reportType} Report";

    // Return as downloadable file
    return File(pdf.Stream, "application/pdf", 
        $"{reportType}_Report_{DateTime.Now:yyyyMMdd}.pdf");
}
using System.Web.Mvc;
using IronPdf;

public ActionResult GenerateReport(string reportType)
{
    var renderer = new ChromePdfRenderer();

    // Configure rendering options for better output
    renderer.RenderingOptions.MarginTop = 50;
    renderer.RenderingOptions.MarginBottom = 50;
    renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Portrait;

    // Generate PDF based on report type
    string htmlContent = GetReportHtml(reportType);
    PdfDocument pdf = renderer.RenderHtmlAsPdf(htmlContent);

    // Add metadata
    pdf.MetaData.Author = "Your Application";
    pdf.MetaData.Title = $"{reportType} Report";

    // Return as downloadable file
    return File(pdf.Stream, "application/pdf", 
        $"{reportType}_Report_{DateTime.Now:yyyyMMdd}.pdf");
}
$vbLabelText   $csharpLabel

如何使用ASP.NET匯出 PDF?

與上面的例子類似,該流是從IronPDF檢索到的二進位資料。 然後配置並刷新回應,以確保將其發送給客戶端。 此方法對於ASP.NET Web Forms 應用程式或當您需要對 HTTP 回應進行更多控制時特別有用。

using System.IO;
using System.Web;

public class PdfHandler : IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
        // Assume pdfAsStream is a MemoryStream containing PDF data
        MemoryStream pdfAsStream = new MemoryStream();

        context.Response.Clear();
        context.Response.ContentType = "application/octet-stream";
        context.Response.OutputStream.Write(pdfAsStream.ToArray(), 0, (int)pdfAsStream.Length);
        context.Response.Flush();
    }

    public bool IsReusable => false;
}
using System.IO;
using System.Web;

public class PdfHandler : IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
        // Assume pdfAsStream is a MemoryStream containing PDF data
        MemoryStream pdfAsStream = new MemoryStream();

        context.Response.Clear();
        context.Response.ContentType = "application/octet-stream";
        context.Response.OutputStream.Write(pdfAsStream.ToArray(), 0, (int)pdfAsStream.Length);
        context.Response.Flush();
    }

    public bool IsReusable => false;
}
$vbLabelText   $csharpLabel

對於現代ASP.NET Core應用程序,此流程更加簡化:

using Microsoft.AspNetCore.Mvc;
using IronPdf;
using System.Threading.Tasks;

[ApiController]
[Route("api/[controller]")]
public class PdfController : ControllerBase
{
    [HttpGet("generate")]
    public async Task<IActionResult> GeneratePdf()
    {
        var renderer = new ChromePdfRenderer();

        // Render HTML to PDF asynchronously for better performance
        PdfDocument pdf = await renderer.RenderHtmlAsPdfAsync("<h1>Dynamic PDF</h1>");

        // Return PDF as file stream
        return File(pdf.Stream, "application/pdf", "generated.pdf");
    }

    [HttpPost("convert")]
    public async Task<IActionResult> ConvertHtmlToPdf([FromBody] string htmlContent)
    {
        var renderer = new ChromePdfRenderer();

        // Apply custom styling and rendering options
        renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;
        renderer.RenderingOptions.PrintHtmlBackgrounds = true;

        PdfDocument pdf = await renderer.RenderHtmlAsPdfAsync(htmlContent);

        // Stream directly to response without saving to disk
        return File(pdf.Stream, "application/pdf");
    }
}
using Microsoft.AspNetCore.Mvc;
using IronPdf;
using System.Threading.Tasks;

[ApiController]
[Route("api/[controller]")]
public class PdfController : ControllerBase
{
    [HttpGet("generate")]
    public async Task<IActionResult> GeneratePdf()
    {
        var renderer = new ChromePdfRenderer();

        // Render HTML to PDF asynchronously for better performance
        PdfDocument pdf = await renderer.RenderHtmlAsPdfAsync("<h1>Dynamic PDF</h1>");

        // Return PDF as file stream
        return File(pdf.Stream, "application/pdf", "generated.pdf");
    }

    [HttpPost("convert")]
    public async Task<IActionResult> ConvertHtmlToPdf([FromBody] string htmlContent)
    {
        var renderer = new ChromePdfRenderer();

        // Apply custom styling and rendering options
        renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;
        renderer.RenderingOptions.PrintHtmlBackgrounds = true;

        PdfDocument pdf = await renderer.RenderHtmlAsPdfAsync(htmlContent);

        // Stream directly to response without saving to disk
        return File(pdf.Stream, "application/pdf");
    }
}
$vbLabelText   $csharpLabel

記憶體流管理最佳實踐

在 Web 應用程式中處理 PDF 記憶體流時,請考慮以下最佳實務:

1.正確釋放資源:一律使用 using 語句或明確釋放 MemoryStream 對象,以防止記憶體洩漏。

2.非同步操作:為了獲得更好的可擴展性,尤其是在處理非同步操作時,請盡可能使用非同步方法。

3.流大小考量:對於大型 PDF,考慮實現串流響應,以避免一次性將整個 PDF 載入到記憶體中。

4.快取:對於經常存取的 PDF 文件,可以考慮將位元組數組緩存在記憶體中或使用分散式快取來提高效能。

// Example of proper resource management with caching
public class PdfService
{
    private readonly IMemoryCache _cache;
    private readonly ChromePdfRenderer _renderer;

    public PdfService(IMemoryCache cache)
    {
        _cache = cache;
        _renderer = new ChromePdfRenderer();
    }

    public async Task<byte[]> GetCachedPdfAsync(string cacheKey, string htmlContent)
    {
        // Try to get from cache first
        if (_cache.TryGetValue(cacheKey, out byte[] cachedPdf))
        {
            return cachedPdf;
        }

        // Generate PDF if not in cache
        using (var pdf = await _renderer.RenderHtmlAsPdfAsync(htmlContent))
        {
            byte[] pdfBytes = pdf.BinaryData;

            // Cache for 10 minutes
            _cache.Set(cacheKey, pdfBytes, TimeSpan.FromMinutes(10));

            return pdfBytes;
        }
    }
}
// Example of proper resource management with caching
public class PdfService
{
    private readonly IMemoryCache _cache;
    private readonly ChromePdfRenderer _renderer;

    public PdfService(IMemoryCache cache)
    {
        _cache = cache;
        _renderer = new ChromePdfRenderer();
    }

    public async Task<byte[]> GetCachedPdfAsync(string cacheKey, string htmlContent)
    {
        // Try to get from cache first
        if (_cache.TryGetValue(cacheKey, out byte[] cachedPdf))
        {
            return cachedPdf;
        }

        // Generate PDF if not in cache
        using (var pdf = await _renderer.RenderHtmlAsPdfAsync(htmlContent))
        {
            byte[] pdfBytes = pdf.BinaryData;

            // Cache for 10 minutes
            _cache.Set(cacheKey, pdfBytes, TimeSpan.FromMinutes(10));

            return pdfBytes;
        }
    }
}
$vbLabelText   $csharpLabel

透過遵循這些模式並利用 IronPDF 的記憶體流功能,您可以建立高效、可擴展的 Web 應用程序,這些應用程式可以處理 PDF 的生成和交付,而無需依賴文件系統操作。 當部署到 AWS 等雲端平台或在容器化環境中工作時,這種方法尤其有利。

常見問題解答

如何在 C# 中將 PDF 轉換為 MemoryStream?

IronPDF 提供了兩種將 PDF 轉換為記憶體的主要方式:使用 Stream 屬性以 System.IO.MemoryStream 匯出,或使用 BinaryData 屬性以 byte array 匯出。只需創建或載入一個 PdfDocument 並訪問這些屬性,就可以在不觸及檔案系統的情況下在記憶體中處理 PDF。

在記憶體中處理 PDF 而非檔案有什麼好處?

使用 IronPDF 在記憶體中處理 PDF 有幾個優點:避免磁碟 I/O 作業,提高效能;與 Azure 等檔案系統存取可能受限的雲端平台有更好的相容性;不將敏感的 PDF 儲存在磁碟上,提高安全性;與 Web 應用程式和 API 無縫整合。

我可以從記憶體串流載入現有的 PDF 嗎?

是的,IronPDF允許您使用PdfDocument.FromStream()方法從記憶體中載入PDF,對於MemoryStream輸入或PdfDocument.FromBytes()方法對於位元組輸入。這使您能夠處理從 Web 請求、資料庫或其他基於記憶體的來源接收的 PDF,而無需將其保存到磁盤。

如何在 ASP.NET 或 MVC 應用程式中從記憶體提供 PDF?

IronPDF 可讓您輕鬆地在 Web 應用程式中直接從記憶體提供 PDF。您可以使用 Stream 屬性或 BinaryData 屬性來取得 PDF 內容,並在控制器動作中將其作為 FileResult 或 FileContentResult 傳回,非常適合在 ASP.NET Core 或 MVC 應用程式中即時產生和提供 PDF。

是否可以在記憶體中直接將 HTML 呈現為 PDF?

是的,IronPDF 的 ChromePdfRenderer 可以直接將 HTML 內容渲染至 MemoryStream,而無需建立臨時檔案。您可以使用 RenderHtmlAsPdf() 方法,並立即存取 Stream 屬性,以 MemoryStream 的方式取得 PDF,因此非常適合雲端應用程式和高效能的使用情境。

Curtis Chau
技術作家

Curtis Chau 擁有卡爾頓大學計算機科學學士學位,專注於前端開發,擅長於 Node.js、TypeScript、JavaScript 和 React。Curtis 熱衷於創建直觀且美觀的用戶界面,喜歡使用現代框架並打造結構良好、視覺吸引人的手冊。

除了開發之外,Curtis 對物聯網 (IoT) 有著濃厚的興趣,探索將硬體和軟體結合的創新方式。在閒暇時間,他喜愛遊戲並構建 Discord 機器人,結合科技與創意的樂趣。

準備好開始了嗎?
Nuget 下載 17,803,474 | 版本: 2026.3 剛剛發布
Still Scrolling Icon

還在滾動嗎?

想快速取得證據? PM > Install-Package IronPdf
運行範例看著你的HTML程式碼變成PDF檔。