安小白的美人痣 發表於 2025-8-25 15:46:00

PDF处理控件Spire.PDF系列教程:在 C# 中实现 PDF 与字节数组的互转

<p><img src="https://image.evget.com/attachment/keditor/image/20250825/134745_0.png"></p>
<p>&nbsp;</p>
<p>在 C# 开发中,处理 PDF 的字节数组是一种常见需求。开发者常常需要将 PDF 文档存储到数据库、通过 API 传输,或者完全在内存中进行处理而不依赖文件系统。在这些场景下,<strong>在 C# 中实现 PDF 与字节数组的互转</strong>&nbsp;就显得尤为重要。</p>
<p>E-iceblue旗下Spire系列产品,是文档开发组件领域的佼佼者,支持国产化信创。本文将通过&nbsp;<strong><u>Spire.PDF for .NET</u></strong>&nbsp;演示具体实现步骤。你将学习如何将字节数组转换为 PDF,如何将 PDF 转换为字节数组,以及如何直接在内存中使用 C# 代码编辑 PDF。</p>
<p style="text-align: center"><span style="color: rgba(230, 126, 35, 1)"><strong>Spire.PDF for .NET 免费试用,请联系Spire官方授权代理商慧都科技</strong></span></p>
<p style="text-align: center"><span style="color: rgba(230, 126, 35, 1)"><strong><em>加入Spire技术交流QQ群(125237868),与更多开发者一起提升文档开发技能。</em></strong></span></p>
<h2>为什么在 C# 中要处理 PDF 与字节数组?</h2>
<p>使用&nbsp;<strong>byte[]</strong>&nbsp;作为传输格式,可以避免生成临时文件,使代码更适配云环境和容器环境。</p>
<ul>
<li><strong>数据库存储 (BLOB):</strong>&nbsp;将 PDF 以原始字节形式存储,仅在需要时加载。</li>
<li><strong>Web API:</strong>&nbsp;通过 HTTP 发送或接收 PDF,无需磁盘读写。</li>
<li><strong>内存处理:</strong>&nbsp;在流中完成 PDF 的转换或加水印操作。</li>
<li><strong>安全与隔离:</strong>&nbsp;减少文件 I/O,降低临时文件风险。</li>
</ul>
<p><strong>准备工作:</strong>&nbsp;在运行示例前,请先在项目中安装<strong><u>&nbsp;</u></strong><strong><u>Spire.PDF for .NET</u></strong>&nbsp;的 NuGet 包。</p>
<pre class="prettyprint lang-js highlighter-hljs"><code>Install-Package Spire.PDF</code></pre>
<p>安装完成后,即可通过&nbsp;<strong>byte[]</strong>&nbsp;或&nbsp;<strong>Stream</strong>&nbsp;加载 PDF,编辑页面,并将结果写回内存或磁盘,无需额外转换器。</p>
<p style="text-align: center"><span style="color: rgba(230, 126, 35, 1)"><strong>Spire.PDF for .NET 免费试用,请联系Spire官方授权代理商慧都科技</strong></span></p>
<p style="text-align: center"><span style="color: rgba(230, 126, 35, 1)"><strong><em>加入Spire技术交流QQ群(125237868),与更多开发者一起提升文档开发技能。</em></strong></span></p>
<h2>在 C# 中将字节数组转换为 PDF</h2>
<p>当上游服务(如 API 或消息队列)传递一个代表 PDF 的&nbsp;<strong>byte[]</strong>&nbsp;时,通常需要将其还原为文档,便于进一步处理或保存到磁盘。使用&nbsp;<strong>Spire.PDF for .NET</strong>,这个过程可以直接在内存中完成,无需中间临时文件。</p>
<p><strong>应用场景与方法:</strong>&nbsp;从数据库或 API 获取一个&nbsp;<strong>byte[]</strong>,在内存中构建&nbsp;<strong>PdfDocument</strong>,可选地验证一些基础信息,然后保存为 PDF。</p>
<pre class="prettyprint lang-cs highlighter-hljs"><code>using Spire.Pdf;
using System.IO;

class Program
{
    static void Main()
    {
      // 示例来源:从数据库或 API 获取的字节数组
      byte[] pdfBytes = File.ReadAllBytes("Sample.pdf"); // 请替换为实际数据来源

      // 1) 从字节数组加载 PDF(内存中完成)
      PdfDocument doc = new PdfDocument();
      doc.LoadFromBytes(pdfBytes);

      // 2) (可选)在保存或处理前查看文档信息
      // int pageCount = doc.Pages.Count;

      // 3) 保存为文件
      doc.SaveToFile("Output.pdf");
      doc.Close();
    }
}</code></pre>
<p>下图展示了字节数组到 PDF 的转换流程:</p>
<p>&nbsp;</p>
<p><img src="https://image.evget.com/attachment/keditor/image/20250825/135708_0.png"></p>
<p><strong>代码解析:</strong></p>
<ul>
<li><strong>LoadFromBytes(byte[])</strong>&nbsp;可直接在内存中初始化 PDF,适合无写入权限的服务环境。</li>
<li>加载完成后可以进行多种操作:验证页面、打码、加盖印章或路由到其他流程。</li>
<li><strong>SaveToFile(string)</strong>&nbsp;将文档保存到磁盘,便于后续处理或存储。</li>
</ul>
<h2>在 C# 中将 PDF 转换为字节数组</h2>
<p>反向转换时,将 PDF 转换为&nbsp;<strong>byte[]</strong>&nbsp;便于写入数据库、缓存,或通过 HTTP 响应返回文件。<strong><u>Spire.PDF for .NET</u></strong>&nbsp;支持将 PDF 保存到&nbsp;<strong>MemoryStream</strong>,再通过&nbsp;<strong>ToArray()</strong>&nbsp;转换为字节数组。</p>
<p><strong>应用场景与方法:</strong>&nbsp;加载现有 PDF,将其保存到&nbsp;<strong>MemoryStream</strong>,再提取&nbsp;<strong>byte[]</strong>。这种方式特别适用于 API 返回 PDF 或持久化存储。</p>
<pre class="prettyprint lang-cs highlighter-hljs"><code>using Spire.Pdf;
using System.IO;

class Program
{
    static void Main()
    {
      // 1) 从磁盘、网络或资源文件加载 PDF
      PdfDocument doc = new PdfDocument();
      doc.LoadFromFile("Input.pdf");

      // 2) 保存到内存流,避免生成临时文件
      byte[] pdfBytes;
      using (var ms = new MemoryStream())
      {
            doc.SaveToStream(ms);
            pdfBytes = ms.ToArray();
      }

      doc.Close();

      // pdfBytes 现在包含完整文档(可直接写入数据库或 API 返回)
      // 示例:return File(pdfBytes, "application/pdf");
    }
}</code></pre>
<p>下图展示了 PDF 转换为字节数组的流程:</p>
<p>&nbsp;</p>
<p><img src="https://image.evget.com/attachment/keditor/image/20250825/140036_2.png"></p>
<p>&nbsp;</p>
<p><strong>关键点总结:</strong></p>
<ul>
<li><strong>SaveToStream → ToArray</strong>&nbsp;是在 C# 中获取 PDF 字节的标准方式,无需生成临时文件。</li>
<li>这种方法适合大文件处理,内存使用量仅受限于系统资源。</li>
<li>在&nbsp;<strong>ASP.NET</strong>&nbsp;中尤其实用,可直接返回字节数组给前端或 API 调用方。</li>
</ul>
<h2>直接从字节数组创建和编辑 PDF</h2>
<p>更强大的场景是直接在内存中编辑 PDF。你可以从&nbsp;<strong>byte[]</strong>&nbsp;加载 PDF,添加文字或图片、加水印、填写表单,再将结果保存为新的&nbsp;<strong>byte[]</strong>。这种无文件管道非常适合微服务。</p>
<p><strong>应用场景与方法:</strong>&nbsp;从字节数组加载 PDF,在第一页添加文字标记,最后输出新的字节数组。</p>
<pre class="prettyprint lang-cs highlighter-hljs"><code>using Spire.Pdf;
using Spire.Pdf.Graphics;
using System.Drawing;
using System.IO;

class Program
{
    static void Main()
    {
      // 来源可以是数据库、API 或文件,这里用 byte[] 表示
      byte[] inputBytes = File.ReadAllBytes("Input.pdf");

      // 1) 内存加载 PDF
      var doc = new PdfDocument();
      doc.LoadFromBytes(inputBytes);

      // 2) 编辑:在第一页写入一个小标记
      PdfPageBase page = doc.Pages;
      page.Canvas.DrawString(
            "编辑后的PDF文档",
            new PdfTrueTypeFont(new Font("HarmonyOS Sans SC", 26f), true),
            PdfBrushes.DarkBlue,
            new PointF(100, page.Size.Height - 100)
      );

      // 3) 保存为新的字节数组
      byte[] editedBytes;
      using (var ms = new MemoryStream())
      {
            doc.SaveToStream(ms);
            editedBytes = ms.ToArray();
      }

      doc.Close();

      // editedBytes 可持久化存储或由 API 返回
    }
}</code></pre>
<p>下图展示了编辑后的 PDF 页面:</p>
<p>&nbsp;</p>
<p><img src="https://image.evget.com/attachment/keditor/image/20250825/140250_2.png"></p>
<p>&nbsp;</p>
<p><strong>要点说明:</strong></p>
<ul>
<li>同样的方式可应用于&nbsp;<strong>文本、图片、水印、批注、表单字段</strong>&nbsp;等编辑操作。</li>
<li>建议保持操作幂等(如检查是否已加盖印章),避免重复处理。</li>
<li>在 ASP.NET 中非常适合&nbsp;<strong>即时加印</strong>&nbsp;或&nbsp;<strong>条件脱敏</strong>,再返回给调用方。</li>
</ul>
<h2>使用 Spire.PDF for .NET 的优势</h2>
<p>下表总结了该 API 在字节数组处理中的优势:</p>
<table>
<thead>
<tr>
<th>需求点</th>
<th>Spire.PDF for .NET 的优势</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>I/O 灵活性</strong></td>
<td>同一个&nbsp;PdfDocument&nbsp;API 支持从文件路径、<strong>Stream</strong>&nbsp;或&nbsp;<strong>byte[]</strong>&nbsp;加载与保存</td>
</tr>
<tr>
<td><strong>内存编辑</strong></td>
<td>可绘制文本/图片、管理批注/表单、添加水印等,无需临时文件</td>
</tr>
<tr>
<td><strong>服务友好</strong></td>
<td>轻松集成到 ASP.NET 接口和后台任务</td>
</tr>
<tr>
<td><strong>处理真实文档</strong></td>
<td>支持多页 PDF,可通过流控制内存消耗</td>
</tr>
<tr>
<td><strong>代码简洁</strong></td>
<td>避免手动字节操作和复杂互操作,简化实现</td>
</tr>
</tbody>
</table>
<h2>总结</h2>
<p>本文演示了如何在 C# 中&nbsp;<strong>将字节数组转换为 PDF</strong>、如何&nbsp;<strong>将 PDF 转换为字节数组</strong>,以及如何&nbsp;<strong>直接在内存中编辑 PDF</strong>。通过流和字节数组操作,可以让 API 设计更简洁、响应更高效,同时兼顾数据库和云环境的适配性。<strong>Spire.PDF for .NET</strong>&nbsp;提供了一套一致的无文件化工作流,既适合快速转换,也能扩展为完整的内存文档处理。</p>
<h2>常见问题</h2>
<h3>可以在不保存到磁盘的情况下,通过字节数组创建 PDF 吗?</h3>
<p>可以。使用&nbsp;<strong>LoadFromBytes</strong>&nbsp;从&nbsp;<strong>byte[]</strong>&nbsp;加载 PDF,然后保存到&nbsp;<strong>MemoryStream</strong>&nbsp;或直接在 API 中返回,无需落盘。</p>
<h3>如何在 C# 中将 PDF 转换为字节数组以便存入数据库?</h3>
<p>使用&nbsp;<strong>PdfDocument.SaveToStream</strong>&nbsp;方法,并调用&nbsp;<strong>MemoryStream.ToArray()</strong>&nbsp;获取字节数组,再存储为 BLOB 或传递给其他服务。</p>
<h3>能否编辑仅存在于字节数组中的 PDF?</h3>
<p>完全可以。先通过字节数组加载 PDF,再进行文字、图片、水印、批注或表单填写等编辑,最后保存为新的&nbsp;<strong>byte[]</strong>。</p>
<h3>有哪些性能与可靠性建议?</h3>
<p>及时释放流、在合适的场景重用缓冲区、每个操作/线程单独创建&nbsp;<strong>PdfDocument</strong>。对于大文件,建议使用流式 I/O 控制内存使用,保证可预测性。</p>
<p style="text-align: center"><span style="color: rgba(230, 126, 35, 1)"><strong>Spire.PDF for .NET 免费试用,请联系Spire官方授权代理商慧都科技</strong></span></p>
<p style="text-align: center"><span style="color: rgba(230, 126, 35, 1)"><strong><em>加入Spire技术交流QQ群(125237868),与更多开发者一起提升文档开发技能。</em></strong></span></p><br><br>
来源:https://www.cnblogs.com/software-Development/p/19057122
頁: [1]
查看完整版本: PDF处理控件Spire.PDF系列教程:在 C# 中实现 PDF 与字节数组的互转