在 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()可繪製文字內容;PdfFont、PdfBrushes和PointF控制文字的字體、顏色和位置。
保存修改後的 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文檔:
應用場景
這種基於字節數組的 PDF 讀寫方式,適用於多種實際業務需求:
- 數據庫存儲:將 PDF 以二進制形式存儲和讀取;
- Web API:前端上傳 PDF 後在服務器端處理,再返回
byte[]結果; - 無磁盤環境:在雲函數或無狀態服務中,避免臨時文件存儲,直接在內存中處理 PDF。
總結
通過本文示例,我們演示瞭如何在 C# 中實現 PDF 與字節數組之間的互操作:
- 從
byte[]加載 PDF; - 在 PDF 頁面上添加標記;
- 將編輯後的 PDF 保存回字節數組。
這種方式避免了磁盤文件操作,更加高效和靈活,尤其適合數據庫、Web API 和雲服務場景。
如需進一步瞭解更多 PDF 編輯功能(插入圖片、水印、表格、加密解密等),可參考 Spire.PDF 官方文檔。