從 FTP 在 .NET 中為 PDF 添加註釋
Loading a PDF from an FTP server and then adding annotations to PDF files is a common requirement for enterprises that keep legacy documents on on‑premises storage. In this tutorial you’ll see exactly how to download a file from FTP, feed it into GroupDocs.Annotation, and apply highlights, comments, or shapes—all without ever writing the file to disk first. By the end you’ll have a reusable pattern that works with any FTP‑accessible PDF and can be extended to other formats supported by GroupDocs.Annotation.
快速解答
- 本教學涵蓋什麼內容? 從 FTP 載入 PDF 並使用 GroupDocs.Annotation for .NET 添加註釋。
- 目標的主要關鍵字是什麼? add annotations to pdf.
- 需要授權嗎? 可使用免費試用版,但正式環境須擁有有效的 GroupDocs.Annotation 授權。
- 可以在 .NET Core 中使用嗎? 可以,程式碼相容於 .NET Framework 4.6.1+ 與 .NET Core 2.0+。
- 支援驗證嗎? 範例示範匿名 FTP;您可以加入
NetworkCredential以使用安全存取。
「add annotations to pdf」是什麼?
Add annotations to PDF 指以程式方式在現有 PDF 文件中插入高亮、評論、印章或圖形。GroupDocs.Annotation for .NET 提供高階 API,可直接使用串流操作,因此您能在遠端 FTP 伺服器上的 PDF 進行修改,而無需先將其儲存至本機。
為什麼從 FTP 載入文件?
從 FTP 載入文件可讓應用程式存取集中儲存的檔案,無需手動複製,透過即時處理降低延遲,並支援按需抓取文件的自動化工作流程,確保始終使用最新版本,同時遵守內部資料處理政策的合規要求。
- 集中式儲存: 超過 70 % 的舊有企業仍依賴 FTP 進行大量文件歸檔。
- 批次處理: FTP 允許一次作業抓取數百個檔案,從而實現自動化註釋流水線。
- 合規性: 本地 FTP 將資料保留在受控的網路區域內,符合多項法規要求。
前置條件
- C# 基礎 – 熟悉串流與非同步模式。
- GroupDocs.Annotation for .NET – 從 官方發佈頁面 下載,並參閱一般的 發佈頁面。
- FTP 憑證 – 主機、使用者名稱、密碼(如需)以及讀取目標檔案的權限。
- 開發工具 – Visual Studio 2019+ 以及 .NET Framework 4.6.1 或 .NET Core 2.0+。
如何在 .NET 中從 FTP 為 PDF 添加註釋?
本指南將示範如何從 FTP 伺服器下載 PDF,將串流傳入 GroupDocs.Annotation,新增高亮註釋,並儲存已註釋的檔案——全部不寫入暫存檔至磁碟。AnnotationConfig 用於設定 GroupDocs.Annotation 以特定文件串流與格式運作。FtpWebRequest 為 .NET 類別,負責 FTP 操作如下載檔案。HighlightAnnotation 代表放置於 PDF 頁面的視覺高亮。
步驟 1:定義本機輸出路徑
首先,決定處理完畢後註釋 PDF 的儲存位置。使用 Path.Combine 可確保在 Windows 與 Linux 上的路徑分隔符正確。
注意: 在呼叫
Save之前必須先確保輸出資料夾已存在。如有需要,請以程式方式建立。
步驟 2:從 FTP 取得 PDF 串流
輔助方法 GetFileFromFtp 會開啟 FtpWebRequest,讀取回應至 MemoryStream,並回傳指向開頭的串流。此串流即為 GroupDocs.Annotation 所使用的來源。
安全提示: 在正式環境中,務必設定
request.Credentials = new NetworkCredential(user, pass),並啟用 SSL (EnableSsl = true) 以保護憑證。
步驟 3:以串流初始化 GroupDocs.Annotation
AnnotationConfig 物件告訴 GroupDocs.Annotation 您正在處理的檔案類型以及要讀取的串流。直接傳入串流可避免暫存檔並減少 I/O 開銷。
步驟 4:新增高亮註釋
建立 HighlightAnnotation(或其他任意註釋類型),並設定其位置、大小與顏色。範例使用鮮黃色 (BackgroundColor = 65535),在大多數 PDF 上都相當顯眼。
步驟 5:儲存已註釋的文件
呼叫 annotation.Save(outputPath) 將更新後的 PDF 寫入步驟 1 中定義的位置。主控台輸出會確認成功並顯示完整路徑。
步驟 6:將所有程式碼包在 try/catch 中
網路操作容易發生逾時與權限錯誤。將整個流程包在 try/catch 區塊中,記錄例外,並視需要重新嘗試下載。
常見 FTP 載入問題與解決方案
連線逾時
FTP 伺服器可能在短時間後關閉閒置連線。可透過設定 request.Timeout = 30000(30 秒)或更長時間來延長逾時。
驗證失敗
若收到 530 錯誤,請再次確認使用者名稱/密碼,並確保帳號對目標目錄具讀取權限。切換至 FTPS(EnableSsl = true)通常可解決憑證相關問題。
防火牆與被動模式
許多企業防火牆會阻擋主動 FTP 使用的資料通道。使用 request.UsePassive = true 啟用被動模式,讓客戶端自行開啟資料連線。
大檔案處理
對於超過 100 MB 的 PDF,建議將回應直接串流至暫存檔,然後再以 FileStream 開啟供 GroupDocs.Annotation 使用。此作法可避免整個檔案佔用記憶體。
安全性考量
- 絕不硬編碼憑證 – 請將其儲存於 Azure Key Vault、AWS Secrets Manager 或環境變數中。
- 優先使用 FTPS 或 SFTP – 純 FTP 會以明文傳輸憑證。
- 驗證 URL – 將 FTP 主機限制於白名單,以防止 SSRF 攻擊。
- 清理檔名 – 拒絕包含
..或非預期字元的路徑,以防止目錄遍歷。
真實案例
- 法規審查平台 – 從本地 FTP 歸檔抓取合規 PDF,讓稽核人員添加評論,並將已註釋的版本儲存回安全位置。
- 舊版報表自動化 – 每日財務報表會放置於 FTP 投遞資料夾;服務自動高亮關鍵數字並將已註釋的報表以電郵發送給相關人員。
- 遷移助理 – 將文件從 FTP 移至雲端 DMS 時,為每個檔案加上遷移狀態標記,免除人工操作。
效能最佳化建議
- 重複使用
FtpWebRequest物件 以處理多個檔案,減少握手開銷。 - 非同步執行 FTP 呼叫 (
await GetFileFromFtpAsync) 以保持 UI 執行緒回應。 - 本機快取常用 PDF 短時間(例如 5 分鐘),當同一檔案被重複註釋時使用。
- 批次註釋 – 將多個 PDF 載入各自的
Annotation實例,套用註釋後一次性寫入 I/O 操作。
常見問與答
Q: 我可以註釋 PDF 以外的檔案類型嗎?
A: 可以,GroupDocs.Annotation 支援超過 30 種格式,包括 DOCX、PPTX 以及常見影像類型,皆可使用相同的串流方式從 FTP 載入。
Q: 如何新增評論註釋而非高亮?
A: 建立 CommentAnnotation,設定其 Text 屬性,然後將其加入 Annotations 集合,操作方式與高亮範例相同。
Q: 能否將已註釋的檔案寫回 FTP 伺服器?
A: 當然可以。先在本機儲存後,開啟新的 FtpWebRequest,設定 Method = WebRequestMethods.Ftp.UploadFile,將檔案串流寫回遠端路徑。
Q: 官方支援哪些 .NET 版本?
A: GroupDocs.Annotation for .NET 相容於 .NET Framework 4.6.1+、.NET Core 2.0+、.NET 5 與 .NET 6。
Q: 如何處理受密碼保護的 PDF?
A: 在載入串流前,於 AnnotationConfig 建構子中透過 Password 屬性傳入密碼。
結論
您現在已掌握完整、可投入生產環境的 add annotations to pdf 檔案處理模式,適用於位於 FTP 伺服器上的 PDF。透過直接將檔案串流至 GroupDocs.Annotation,您可避免不必要的磁碟 I/O,保持應用程式輕量,並完整掌控安全性與效能。可在此基礎上加入驗證、進度回報或批次處理,以滿足企業文件工作流程的需求。
如需進一步協助,請造訪 支援論壇。
最後更新: 2026-07-06
測試環境: GroupDocs.Annotation 23.12 for .NET
作者: GroupDocs
using GroupDocs.Annotation.Models;
using GroupDocs.Annotation.Models.AnnotationModels;
using System;
using System.IO;
using System.Net;
string outputPath = Path.Combine("Your Document Directory", "result" + Path.GetExtension("input.pdf"));
string filePath = "sample.pdf";
using (Annotator annotator = new Annotator(GetFileFromFtp(filePath)))
{
// Annotation code will be added here
}
AreaAnnotation area = new AreaAnnotation()
{
Box = new Rectangle(100, 100, 100, 100),
BackgroundColor = 65535,
};
annotator.Add(area);
annotator.Save(outputPath);
Console.WriteLine($"\nDocument saved successfully.\nCheck output in {outputPath}.");
private static Stream GetFileFromFtp(string filePath)
{
Uri uri = new Uri(filePath);
FtpWebRequest request = CreateRequest(uri);
using (WebResponse response = request.GetResponse())
return GetFileStream(response);
}
private static FtpWebRequest CreateRequest(Uri uri)
{
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(uri);
request.Method = WebRequestMethods.Ftp.DownloadFile;
return request;
}
private static Stream GetFileStream(WebResponse response)
{
MemoryStream fileStream = new MemoryStream();
using (Stream responseStream = response.GetResponseStream())
responseStream.CopyTo(fileStream);
fileStream.Position = 0;
return fileStream;
}
request.Timeout = 30000; // 30 seconds
request.Credentials = new NetworkCredential("username", "password");