PDF to MemoryStream C

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

在 C# .NET 中使用 IronPDF 的 Stream 属性或 BinaryData 属性将 PDF 转换为 MemoryStream,从而无需访问文件系统即可在内存中操作 PDF,用于网络应用程序和数据处理。

我们可以在 C# .NET 中将 PDF 导出到 MemoryStream,而无需接触文件系统。 这是通过.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 保存到内存中?

代码 973 可以通过以下两种方式之一直接保存到内存中:

选择使用 Stream 还是 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;
$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?

要在网上提供或导出 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"
    };
}
$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

内存流管理的最佳实践

在网络应用程序中使用 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 的内存流功能,您可以构建高效、可扩展的网络应用程序,无需依赖文件系统操作即可处理 PDF 的生成和交付。 当部署到 AWS 等云平台或在容器化环境中工作时,这种方法尤其有益。

常见问题解答

如何用 C# 将 PDF 转换为 MemoryStream?

IronPDF 提供了两种将 PDF 转换为内存的主要方法:使用 Stream 属性以 System.IO.MemoryStream 的形式导出,或使用 BinaryData 属性以字节数组的形式导出。只需创建或加载一个 PdfDocument 并访问这些属性,即可在内存中处理 PDF,而无需接触文件系统。

在内存中处理 PDF 而不是文件有什么好处?

使用 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 下载 17,803,474 | 版本: 2026.3 刚刚发布
Still Scrolling Icon

还在滚动吗?

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