MemoryStream 到 PDF C

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

IronPDF允许在 C# 中直接将 MemoryStream 对象转换为 PDF 文档,而无需访问文件系统。 将您的 FileStream 或字节数组传递给 PdfDocument 构造函数,以便在内存中即时创建和操作 PDF。

在 C# .NET中加载和创建 MemoryStream 到 PDF 文件,而无需访问文件系统。 这是通过 System.IO 命名空间中的 MemoryStream 对象实现的。 在云环境、网络应用或文件系统访问受限的场景中使用此功能。

快速入门:使用 C# 从 MemoryStream 创建 PDF

使用IronPDF ,只需一行代码即可将 MemoryStream 转换为 PDF。 从 MemoryStream 初始化 PdfDocument,以便将 PDF 创建集成到 C# 应用程序中,而无需处理物理文件。 适用于内存数据处理、网络通信或实时数据转换。

  1. 使用 NuGet 包管理器安装 https://www.nuget.org/packages/IronPdf

    PM > Install-Package IronPdf
  2. 复制并运行这段代码。

    var bytes = File.ReadAllBytes("sample.pdf");
    var pdfDoc = new IronPdf.PdfDocument(myMemoryStream);
  3. 部署到您的生产环境中进行测试

    通过免费试用立即在您的项目中开始使用IronPDF

    arrow pointer

如何从内存中加载 PDF?

从以下.NET内存对象初始化 IronPdf.PdfDocument

  • A MemoryStream
  • A FileStream
  • 二进制数据作为 byte[]

以下是一个直接从 PDF 文件读取数据流并创建 PdfDocument 对象的示例:

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

// Read PDF file as stream
var fileByte = File.ReadAllBytes("sample.pdf");

// Instantiate PDF object from stream
PdfDocument pdf = new PdfDocument(fileByte);
$vbLabelText   $csharpLabel

我可以使用哪些类型的流对象?

该示例展示了如何从文件系统中读取 PDF 文件并创建 PdfDocument 对象。 您还可以从通过网络通信或其他数据交换协议收到的 byte[] 初始化 PdfDocument。 将 PDF 数据转换为可编辑对象,以便根据需要进行修改。

下面是一个综合示例,显示了不同的数据流来源:

using IronPdf;
using System.IO;
using System.Net.Http;

// Example 1: From FileStream
using (FileStream fileStream = File.OpenRead("document.pdf"))
{
    var pdfFromFileStream = new PdfDocument(fileStream);
}

// Example 2: From MemoryStream
byte[] pdfBytes = GetPdfBytesFromDatabase(); // Your method to get PDF bytes
using (MemoryStream memoryStream = new MemoryStream(pdfBytes))
{
    var pdfFromMemoryStream = new PdfDocument(memoryStream);
}

// Example 3: From HTTP Response
using (HttpClient client = new HttpClient())
{
    byte[] pdfData = await client.GetByteArrayAsync("https://example.com/document.pdf");
    var pdfFromHttp = new PdfDocument(pdfData);
}
using IronPdf;
using System.IO;
using System.Net.Http;

// Example 1: From FileStream
using (FileStream fileStream = File.OpenRead("document.pdf"))
{
    var pdfFromFileStream = new PdfDocument(fileStream);
}

// Example 2: From MemoryStream
byte[] pdfBytes = GetPdfBytesFromDatabase(); // Your method to get PDF bytes
using (MemoryStream memoryStream = new MemoryStream(pdfBytes))
{
    var pdfFromMemoryStream = new PdfDocument(memoryStream);
}

// Example 3: From HTTP Response
using (HttpClient client = new HttpClient())
{
    byte[] pdfData = await client.GetByteArrayAsync("https://example.com/document.pdf");
    var pdfFromHttp = new PdfDocument(pdfData);
}
$vbLabelText   $csharpLabel

什么情况下应使用 MemoryStream 而不是基于文件的操作?

MemoryStream 操作在以下场景中表现出色:

1.Web 应用程序:在ASP.NET应用程序中动态提供 PDF 服务,而无需创建临时服务器文件。

2.云环境:在 Azure FunctionsAWS Lambda 中使用,文件系统访问受限或临时存储成本高昂。

3.安全性:在内存中处理敏感文件,避免在磁盘上留下临时文件。

4.性能:对于中小型 PDF,内存操作比磁盘 I/O 更快,特别是在固态或网络附加存储的情况下。

如何将 PDF 导出到 MemoryStream?

将已加载或创建的 PDF 文档导出到 MemoryStream 进行处理或传输。 这在在网络应用程序中服务 PDF 或在数据库中存储 PDF 时非常有用。

以下是如何将 PDF 导出到 MemoryStream:

using IronPdf;
using System.IO;

// Create or load a PDF document
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>This is a PDF from HTML</p>");

// Export to MemoryStream
using (MemoryStream memoryStream = new MemoryStream())
{
    pdf.SaveAs(memoryStream);

    // Example: Convert to byte array for database storage
    byte[] pdfBytes = memoryStream.ToArray();

    // Example: Reset position to read from beginning
    memoryStream.Position = 0;

    // Use the stream as needed (e.g., return in web response)
}
using IronPdf;
using System.IO;

// Create or load a PDF document
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>This is a PDF from HTML</p>");

// Export to MemoryStream
using (MemoryStream memoryStream = new MemoryStream())
{
    pdf.SaveAs(memoryStream);

    // Example: Convert to byte array for database storage
    byte[] pdfBytes = memoryStream.ToArray();

    // Example: Reset position to read from beginning
    memoryStream.Position = 0;

    // Use the stream as needed (e.g., return in web response)
}
$vbLabelText   $csharpLabel

高级内存流操作

从多个 MemoryStreams 合并 PDF 文件

在内存中合并多个 PDF 文档,无需访问文件系统:

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

public static byte[] MergePdfsFromMemory(List<byte[]> pdfBytesList)
{
    List<PdfDocument> pdfs = new List<PdfDocument>();

    // Load all PDFs from byte arrays
    foreach (var pdfBytes in pdfBytesList)
    {
        pdfs.Add(new PdfDocument(pdfBytes));
    }

    // Merge PDFs
    PdfDocument merged = PdfDocument.Merge(pdfs);

    // Export merged PDF to byte array
    using (MemoryStream ms = new MemoryStream())
    {
        merged.SaveAs(ms);
        return ms.ToArray();
    }
}
using IronPdf;
using System.Collections.Generic;
using System.IO;

public static byte[] MergePdfsFromMemory(List<byte[]> pdfBytesList)
{
    List<PdfDocument> pdfs = new List<PdfDocument>();

    // Load all PDFs from byte arrays
    foreach (var pdfBytes in pdfBytesList)
    {
        pdfs.Add(new PdfDocument(pdfBytes));
    }

    // Merge PDFs
    PdfDocument merged = PdfDocument.Merge(pdfs);

    // Export merged PDF to byte array
    using (MemoryStream ms = new MemoryStream())
    {
        merged.SaveAs(ms);
        return ms.ToArray();
    }
}
$vbLabelText   $csharpLabel

在内存中应用安全设置

在 PDF 上设置密码和权限,同时将所有内容保存在内存中:

using IronPdf;
using System.IO;

// Load PDF from memory
byte[] unsecuredPdfBytes = GetPdfFromDatabase();
PdfDocument pdf = new PdfDocument(unsecuredPdfBytes);

// Apply security settings
pdf.SecuritySettings.UserPassword = "user123";
pdf.SecuritySettings.OwnerPassword = "owner456";
pdf.SecuritySettings.AllowUserPrinting = false;
pdf.SecuritySettings.AllowUserCopyPasteContent = false;

// Export secured PDF to memory
using (MemoryStream securedStream = new MemoryStream())
{
    pdf.SaveAs(securedStream);
    byte[] securedPdfBytes = securedStream.ToArray();
    // Store or transmit secured PDF bytes
}
using IronPdf;
using System.IO;

// Load PDF from memory
byte[] unsecuredPdfBytes = GetPdfFromDatabase();
PdfDocument pdf = new PdfDocument(unsecuredPdfBytes);

// Apply security settings
pdf.SecuritySettings.UserPassword = "user123";
pdf.SecuritySettings.OwnerPassword = "owner456";
pdf.SecuritySettings.AllowUserPrinting = false;
pdf.SecuritySettings.AllowUserCopyPasteContent = false;

// Export secured PDF to memory
using (MemoryStream securedStream = new MemoryStream())
{
    pdf.SaveAs(securedStream);
    byte[] securedPdfBytes = securedStream.ToArray();
    // Store or transmit secured PDF bytes
}
$vbLabelText   $csharpLabel

MemoryStream PDF 操作的最佳实践

1.正确释放:使用 using 语句或显式释放 MemoryStreamPdfDocument 对象,以防止内存泄漏。

2.考虑内存限制:监控大型 PDF 或大量处理的内存使用情况。 考虑实现压缩或分块处理 PDF。

3.错误处理:实施 try-catch 块,以便在处理流(尤其是损坏或畸形的 PDF 数据)时处理异常。

4.异步操作:在网络应用程序中处理 PDF 时使用 async 方法,以保持响应速度。

与 IronPDF 其他功能的集成

MemoryStreams 支持多种 PDF 操作:

准备好看看您还能做些什么吗? 请查看我们的教程页面:编辑 PDF

常见问题解答

如何在不访问文件系统的情况下用 C# 将 MemoryStream 转换为 PDF?

IronPDF 允许将 MemoryStream 对象直接转换为 PDF 文档,而无需访问文件系统。只需将 MemoryStream 传递给 PdfDocument 构造函数:var pdfDoc = new IronPdf.PdfDocument(myMemoryStream).这种方法非常适合云环境、网络应用或文件系统访问受限的情况。

我可以使用哪些类型的流对象在内存中创建 PDF?

IronPDF 的 PdfDocument 构造函数接受三种类型的内存对象:内存流(MemoryStream)、文件流(FileStream)和字节数组(byte[])。你可以从这些来源中的任何一个初始化一个 PdfDocument,使其灵活地用于各种数据源,如网络通信、数据库 blob 或 API 响应。

能否从字节数组而不是文件路径加载 PDF?

是的,IronPDF 可以直接从字节数组加载 PDF。您可以使用以下方法从二进制数据创建一个 PdfDocument 对象:var pdfDoc = new IronPdf.PdfDocument(pdfBytes)。这在通过网络通信接收 PDF 数据或从数据库检索 PDF 数据时特别有用。

如何从 HTTP 响应流创建 PDF?

使用 IronPDF,您可以从 HTTP 响应创建 PDF,方法是首先将响应转换为字节数组:byte[] pdfData = await client.GetByteArrayAsync(url);然后初始化一个 PdfDocument:var pdfFromHttp = new IronPdf.PdfDocument(pdfData).这样就能从网络 API 或远程源无缝处理 PDF。

使用 MemoryStream 进行 PDF 操作有哪些好处?

将 MemoryStream 与 IronPDF 结合使用具有以下优势:不依赖文件系统,内存处理速度更快,安全性更高(无临时文件),非常适合文件系统访问受限或受限制的云环境或容器化应用程序。

Curtis Chau
技术作家

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

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

审核者
Jeff Fritz
Jeffrey T. Fritz
首席项目经理 - .NET 社区团队
Jeff 也是 .NET 和 Visual Studio 团队的首席项目经理。他是 .NET Conf 虚拟会议系列的执行制片人,并主持“Fritz and Friends”直播节目,每周两次与观众一起谈论技术并编写代码。Jeff 撰写研讨会、演示文稿并计划包括 Microsoft Build、Microsoft Ignite、.NET Conf 和 Microsoft MVP 峰会在内的最大型微软开发者活动的内容。
准备开始了吗?
Nuget 下载 17,803,474 | 版本: 2026.3 刚刚发布
Still Scrolling Icon

还在滚动吗?

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