PDF to MemoryStream C

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

在C# .NET中使用IronPDF的MemoryStream,实现Web应用和数据处理的内存中PDF操作,无需文件系统访问。

我们可以在不触及文件系统的情况下将PDF导出为C# .NET中的MemoryStream。 这通过存在于System.IO .NET命名空间内的MemoryStream对象实现。 这种方法在开发基于云的应用程序、使用 Azure Blob Storage 工作,或需要在内存中处理 PDF 以优化性能时特别有用。

在内存流中处理 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 保存到内存中?

一个IronPdf.PdfDocument可以通过以下两种方式直接保存到内存中:

使用BinaryData的选择取决于您的具体使用案例。 当您需要使用基于流的API或希望保持与其他.NET流操作兼容性时,MemoryStream是理想的选项。 作为字节数组的BinaryData非常适合需要将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;
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

微软MVP

查看案例研究
Icon Quote related to 高级内存流操作

IronOCR 意味着我们每年可以节省 $40,000 的人工处理成本,同时提高生产力,并释放资源用于高影响任务。我强烈推荐它。

Brent Matzelle related to 高级内存流操作

Brent Matzelle

首席技术官,OPYN

查看案例研究
Icon Quote related to 高级内存流操作

Iron Suite 在我们的运营中起着至关重要的作用。这些工具提高了业务各方面的效率,包括创建平面图和改善库存管理。

David Jones related to 高级内存流操作

David Jones

首席软件工程师,Agorus Build

查看案例研究

如何从内存向网络提供 PDF?

要在网上提供或导出 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 而不是文件有什么好处?

using IronPDF 在内存中处理 PDF 有几个优势:避免磁盘 I/O 操作,从而提高性能;与 Azure 等文件系统访问可能受限的云平台有更好的兼容性;不在磁盘上存储敏感的 PDF,从而增强安全性;与网络应用程序和 API 无缝集成。

能否从内存流中加载现有的 PDF?

是的,IronPDF 允许您使用 PdfDocument.FromStream() 方法(针对 MemoryStream 输入)或 PdfDocument.FromBytes() 方法(针对字节数组输入)从内存加载 PDF。这样,您就可以处理从网络请求、数据库或其他内存来源接收的 PDF 文件,而无需将其保存到磁盘。

如何在 ASP.NET 或 MVC 应用程序中从内存提供 PDF?

IronPDF 可轻松地在网络应用程序中直接从内存中提供 PDF。您可以使用 Stream 属性或 BinaryData 属性获取 PDF 内容,并在控制器操作中将其作为 FileResult 或 FileContentResult 返回,非常适合在 ASP.NET Core 或 MVC 应用程序中即时生成和提供 PDF。

是否可以在内存中直接将 HTML 转换为 PDF?

是的,IronPDF 的 ChromePdfRenderer 可以直接向 MemoryStream 渲染 HTML 内容,而无需创建临时文件。您可以使用 RenderHtmlAsPdf() 方法,并立即访问 Stream 属性以获取 MemoryStream 格式的 PDF,这使其成为基于云的应用程序和高性能应用场景的理想选择。

Curtis Chau
技术作家

Curtis Chau 拥有卡尔顿大学的计算机科学学士学位,专注于前端开发,精通 Node.js、TypeScript、JavaScript 和 React。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。

除了开发之外,Curtis 对物联网 (IoT) 有浓厚的兴趣,探索将硬件和软件集成的新方法。在空闲时间,他喜欢玩游戏和构建 Discord 机器人,将他对技术的热爱与创造力相结合。

准备开始了吗?
Nuget 下载 20,296,129 | 版本: 2026.7 刚刚发布
Still Scrolling Icon

还在滚动吗?

想快速获得证据? PM > Install-Package IronPdf
运行示例看着你的HTML代码变成PDF文件。