PDF to MemoryStream C

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

使用IronPDF的BinaryData屬性,在C# .NET中將PDF轉換為MemoryStream,從而實現無需存取文件系統即可進行網頁應用程式和資料處理的PDF記憶體操作。

我們可以在C# .NET中導出PDF到MemoryStream而不觸碰文件系統。 這可以通過System.IO .NET命名空間中。 此方法在開發基於雲的應用程式、與Azure Blob Storage合作或需要在記憶體中處理PDF以優化性能時特別有用。

能夠在記憶體流中處理PDF對於現代網頁應用程式而言是必需的,特別是在部署到Azure或其他雲平台時,文件系統的存取可能會受到限制,或當您希望避免磁碟I/O操作的負擔時。 IronPDF使此流程變得簡單,因為它具有內建的流操作方法。

快速入門:將PDF轉換為MemoryStream

使用IronPDF的API將您的PDF文件轉換為MemoryStream。 本指南幫助開發者開始在.NET應用程式中載入PDF並將其導出到MemoryStream中。 按照此範例在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保存到記憶體?

可以通過兩種方式之一將IronPdf.PdfDocument直接保存到記憶體中:

選擇使用BinaryData取決於您的具體用例。 MemoryStream在需要使用基於流的API或希望與其他.NET流操作保持相容時最理想。 當您需要將PDF資料儲存在資料庫中、在記憶體中快取或通過網路傳輸時,BinaryData作為字節陣列是完美的。

: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;
Imports IronPdf
Imports System.IO

Private renderer = New ChromePdfRenderer()

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

' Export PDF as Stream
Private pdfAsStream As MemoryStream = pdf.Stream

' Export PDF as Byte Array
Private pdfAsByte() As Byte = pdf.BinaryData
$vbLabelText   $csharpLabel

處理現有的PDF

當您需要從記憶體中載入PDF時,IronPDF提供方便的方法來處理已經存在於記憶體中的PDF:

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

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

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

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

' Load PDF from byte array
Dim pdfBytes As Byte() = File.ReadAllBytes("existing.pdf")
Dim pdfFromBytes As New PdfDocument(pdfBytes)

' Or directly from a MemoryStream
Dim memoryStream As New MemoryStream(pdfBytes)
Dim pdfFromStream As New PdfDocument(memoryStream)

' Modify the PDF (add watermark, headers, etc.)
' Then export back to memory
Dim modifiedPdfBytes As Byte() = pdfFromStream.BinaryData
$vbLabelText   $csharpLabel

高級記憶體流操作

對於更複雜的場景,例如您正在從HTML字串建立PDF將多個圖像轉換為PDF時,您可以在保持所有操作在記憶體中的同時結合多個操作:

:path=/static-assets/pdf/content-code-examples/how-to/pdf-to-memory-stream-4.cs
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 =>
    new PdfDocument(s)).ToList());

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

' Create multiple PDFs in memory
Dim renderer As New ChromePdfRenderer()
Dim pdfStreams As New List(Of MemoryStream)()

' Generate multiple PDFs from HTML
Dim htmlTemplates As String() = {
    "<h1>Report 1</h1><p>Content...</p>",
    "<h1>Report 2</h1><p>Content...</p>"
}

For Each html As String In htmlTemplates
    Dim pdf As PdfDocument = renderer.RenderHtmlAsPdf(html)
    pdfStreams.Add(pdf.Stream)
Next

' Merge all PDFs in memory
Dim mergedPdf As PdfDocument = PdfDocument.Merge(pdfStreams.Select(Function(s) New PdfDocument(s)).ToList())

' Get the final merged PDF as a stream
Dim finalStream As MemoryStream = mergedPdf.Stream
$vbLabelText   $csharpLabel

Icon Quote related to 高級記憶體流操作

我最喜歡的程式庫是IronPDF。它允許快速高效地操作PDF文件。它還有許多有價值的功能,例如導出到PDF/A格式和數位簽署PDF文件。

Milan Jovanovic related to 高級記憶體流操作

Milan Jovanovic

Microsoft MVP

查看案例研究
Icon Quote related to 高級記憶體流操作

IronOCR意味著我們每年可以從手動處理中節省$40,000,同時提高生產力,釋放資源以進行高影響的任務。我會強烈推薦它。

Brent Matzelle related to 高級記憶體流操作

Brent Matzelle

首席技術官,OPYN

查看案例研究
Icon Quote related to 高級記憶體流操作

IronSuite在我們的運營中扮演著至關重要的角色。這些工具增加了包括建立平面圖和改善庫存管理在內的業務效率。

David Jones related to 高級記憶體流操作

David Jones

首席軟體工程師,Agorus Build

查看案例研究

如何從記憶體將PDF提供給Web?

要在網頁上提供或導出PDF,您需要將PDF文件作為二進制資料而不是HTML發送。 您可以在此關於在C#中導出和保存PDF文件的指南中找到更多資訊。 在處理網頁應用程式時,特別是在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"
    };
}
Imports System.Web.Mvc
Imports System.IO

Public Function ExportPdf() As ActionResult
	' Assume pdfAsStream is a MemoryStream containing PDF data
	Dim pdfAsStream As New MemoryStream()

	Return New FileStreamResult(pdfAsStream, "application/pdf") With {.FileDownloadName = "download.pdf"}
End Function
$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");
}
Imports System.Web.Mvc
Imports IronPdf

Public Function GenerateReport(reportType As String) As ActionResult
    Dim renderer As 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
    Dim htmlContent As String = GetReportHtml(reportType)
    Dim pdf As PdfDocument = 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")
End Function
$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;
}
Imports System.IO
Imports System.Web

Public Class PdfHandler
	Implements IHttpHandler

	Public Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest
		' Assume pdfAsStream is a MemoryStream containing PDF data
		Dim pdfAsStream As New MemoryStream()

		context.Response.Clear()
		context.Response.ContentType = "application/octet-stream"
		context.Response.OutputStream.Write(pdfAsStream.ToArray(), 0, CInt(pdfAsStream.Length))
		context.Response.Flush()
	End Sub

	Public ReadOnly Property IsReusable() As Boolean Implements IHttpHandler.IsReusable
		Get
			Return False
		End Get
	End Property
End Class
$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");
    }
}
Imports Microsoft.AspNetCore.Mvc
Imports IronPdf
Imports System.Threading.Tasks

<ApiController>
<Route("api/[controller]")>
Public Class PdfController
    Inherits ControllerBase

    <HttpGet("generate")>
    Public Async Function GeneratePdf() As Task(Of IActionResult)
        Dim renderer As New ChromePdfRenderer()

        ' Render HTML to PDF asynchronously for better performance
        Dim pdf As PdfDocument = Await renderer.RenderHtmlAsPdfAsync("<h1>Dynamic PDF</h1>")

        ' Return PDF as file stream
        Return File(pdf.Stream, "application/pdf", "generated.pdf")
    End Function

    <HttpPost("convert")>
    Public Async Function ConvertHtmlToPdf(<FromBody> htmlContent As String) As Task(Of IActionResult)
        Dim renderer As New ChromePdfRenderer()

        ' Apply custom styling and rendering options
        renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print
        renderer.RenderingOptions.PrintHtmlBackgrounds = True

        Dim pdf As PdfDocument = Await renderer.RenderHtmlAsPdfAsync(htmlContent)

        ' Stream directly to response without saving to disk
        Return File(pdf.Stream, "application/pdf")
    End Function
End Class
$vbLabelText   $csharpLabel

記憶體流管理最佳實踐

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

  1. 正確處理資源:始終使用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;
        }
    }
}
Imports System
Imports System.Threading.Tasks

' Example of proper resource management with caching
Public Class PdfService
    Private ReadOnly _cache As IMemoryCache
    Private ReadOnly _renderer As ChromePdfRenderer

    Public Sub New(cache As IMemoryCache)
        _cache = cache
        _renderer = New ChromePdfRenderer()
    End Sub

    Public Async Function GetCachedPdfAsync(cacheKey As String, htmlContent As String) As Task(Of Byte())
        ' Try to get from cache first
        Dim cachedPdf As Byte() = Nothing
        If _cache.TryGetValue(cacheKey, cachedPdf) Then
            Return cachedPdf
        End If

        ' Generate PDF if not in cache
        Using pdf = Await _renderer.RenderHtmlAsPdfAsync(htmlContent)
            Dim pdfBytes As Byte() = pdf.BinaryData

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

            Return pdfBytes
        End Using
    End Function
End Class
$vbLabelText   $csharpLabel

通過遵循這些模式並利用IronPDF的記憶體流功能,您可以構建高效、可擴展的網頁應用程式,在不依賴文件系統操作的情況下處理PDF的生成和交付。 在部署到像AWS這樣的雲平台或在容器化環境中工作時,此方法特別有利。

常見問題

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

IronPDF提供兩種主要方法來將PDF轉換為記憶體:使用Stream屬性匯出為System.IO.MemoryStream,或使用BinaryData屬性匯出為字節陣列。只需建立或載入PdfDocument並存取這些屬性,即可在不觸碰檔案系統的情況下在記憶體中處理PDF。

使用記憶體中的PDF而非文件有什麼好處?

使用IronPDF在記憶體中處理PDF有多項優勢:通過避免磁碟I/O操作來提高性能,與Azure等雲端平台更好的相容性,因為文件系統存取可能受到限制,不將敏感PDF儲存到磁碟上提高了安全性,無縫整合到Web應用和API中。

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

可以。IronPDF允許您使用PdfDocument.FromStream()方法從記憶體流中載入PDF,或使用PdfDocument.FromBytes() 方法從字節陣列中載入PDF。這使您能夠處理從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屬性以將PDF作為MemoryStream獲取,非常適合雲端應用和高性能場景。

Curtis Chau
技術作家

Curtis Chau擁有Carleton大學的電腦科學學士學位,專精於前端開發,擁有Node.js、TypeScript、JavaScript和React的專業知識。Curtis熱衷於建立直觀且美觀的使用者介面,喜愛使用現代框架並建立結構良好、視覺吸引力的手冊。

除了開發,Curtis對物聯網(IoT)有濃厚的興趣,探索創新的方法來整合硬體和軟體。在空閒時間,他喜歡玩遊戲和建立Discord機器人,結合他對技術的熱愛與創造力。

準備開始了嗎?
Nuget 下載 19,936,792 | 版本: 2026.7 剛剛發布
Still Scrolling Icon

還在捲動嗎?

想快速獲得證明嗎? PM > Install-Package IronPdf
執行範例 看您的HTML變成PDF。