博客 / 詳情

返回

使用 C# 在內存中讀取與編輯 PDF(字節數組操作)

在 C# 項目開發中,我們經常需要處理 PDF 文件與字節數組(byte[])之間的轉換,例如:

  • 數據庫存儲的 PDF 文件以二進制形式存在,需要在應用中加載並編輯;
  • Web API 上傳或返回 PDF 時,通常採用字節流傳輸;
  • 服務端處理 PDF 後再將結果以 byte[] 返回給前端。

本文將介紹如何在 C# 中使用 Spire.PDF 將 PDF 加載為字節數組,直接在內存中編輯,再將修改後的結果保存為新的字節數組,而無需臨時保存到磁盤文件。

本文包含:

  • 從字節數組加載 PDF
  • 在 PDF 中添加文字標記
  • 將修改後的 PDF 保存為字節數組
  • 應用場景説明(數據庫、API、文件存儲)

本文所使用的方法需要用到 Free Spire.PDF for .NET,可通過 NuGet 安裝:

Install-Package FreeSpire.PDF

從字節數組加載 PDF

PDF 文件可能來源於數據庫、API 請求或本地文件。通過 File.ReadAllBytes(),我們可以將 PDF 文件讀取為 byte[],再通過 PdfDocument.LoadFromBytes() 加載到內存。

using Spire.Pdf;
using System.IO;

byte[] inputBytes = File.ReadAllBytes("Input.pdf");

PdfDocument doc = new PdfDocument();
doc.LoadFromBytes(inputBytes);

説明:

  • inputBytes 表示原始的 PDF 數據;
  • LoadFromBytes() 方法允許直接從內存加載 PDF,而不依賴文件路徑。

在 PDF 中添加文字標記

加載 PDF 後,可以在任意頁面上進行繪製。下面示例在第一頁底部添加一行藍色文字,作為“內存中編輯”的標記。

using Spire.Pdf.Graphics;
using System.Drawing;

// 獲取第一頁
PdfPageBase page = doc.Pages[0];

// 繪製文字
page.Canvas.DrawString(
    "Edited in memory",
    new PdfFont(PdfFontFamily.Helvetica, 12f),
    PdfBrushes.DarkBlue,
    new PointF(100, page.Size.Height - 100)
);

在上述代碼中:

  • PdfPageBase.Canvas 提供了繪製接口;
  • DrawString() 可繪製文字內容;
  • PdfFontPdfBrushesPointF 控制文字的字體、顏色和位置。

保存修改後的 PDF 為字節數組

編輯完成後,我們通常需要將結果保存為新的字節數組,便於後續存儲或通過 API 返回。

byte[] editedBytes;
using (var ms = new MemoryStream())
{
    doc.SaveToStream(ms);
    editedBytes = ms.ToArray();
}

doc.Close();

説明:

  • SaveToStream() 將文檔保存到內存流;
  • ToArray()MemoryStream 轉換為 byte[]
  • doc.Close() 釋放 PDF 對象佔用的資源。

修改後的PDF文檔:

C#在字節串中修改PDF文檔

應用場景

這種基於字節數組的 PDF 讀寫方式,適用於多種實際業務需求:

  • 數據庫存儲:將 PDF 以二進制形式存儲和讀取;
  • Web API:前端上傳 PDF 後在服務器端處理,再返回 byte[] 結果;
  • 無磁盤環境:在雲函數或無狀態服務中,避免臨時文件存儲,直接在內存中處理 PDF。

總結

通過本文示例,我們演示瞭如何在 C# 中實現 PDF 與字節數組之間的互操作:

  1. byte[] 加載 PDF;
  2. 在 PDF 頁面上添加標記;
  3. 將編輯後的 PDF 保存回字節數組。

這種方式避免了磁盤文件操作,更加高效和靈活,尤其適合數據庫、Web API 和雲服務場景。

如需進一步瞭解更多 PDF 編輯功能(插入圖片、水印、表格、加密解密等),可參考 Spire.PDF 官方文檔。

user avatar shanliangdeyanjing 頭像 u_15701057 頭像 niandb 頭像
3 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.