FTP から .NET で PDF に注釈を追加する
FTP サーバーから PDF を読み込み、そして PDF に注釈を追加する ファイルは、オンプレミスのストレージにレガシー文書を保管している企業にとって一般的な要件です。このチュートリアルでは、FTP からファイルをダウンロードし、GroupDocs.Annotation に渡して、ハイライト、コメント、またはシェイプを適用する方法を正確に示します—ファイルをディスクに書き込むことなく行います。最後まで実行すれば、FTP でアクセス可能な任意の PDF に対して機能し、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 を使用すると、1 回のジョブで数百のファイルを取得でき、自動注釈パイプラインを実現できます。
- コンプライアンス: オンプレミスの 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 はファイルのダウンロードなど FTP 操作を処理する .NET クラスです。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(または他の注釈タイプ)を作成し、その位置、サイズ、色を設定します。例では、ほとんどの PDF で目立つ明るい黄色(BackgroundColor = 65535)を使用しています。
手順 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 は DOCX、PPTX、一般的な画像タイプなど 30 以上の形式をサポートしており、すべて同じストリームベースのアプローチで FTP からロードできます。
Q: ハイライトではなくコメント注釈を追加するには?
A: CommentAnnotation をインスタンス化し、Text プロパティを設定して、ハイライトの例と同様に Annotations コレクションに追加します。
Q: 注釈付きファイルを FTP サーバーに書き戻すことは可能ですか?
A: もちろんです。ローカルに保存した後、Method = WebRequestMethods.Ftp.UploadFile を設定した新しい FtpWebRequest を開き、ファイルストリームをリモートパスに書き戻します。
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 プロパティにパスワードを渡してください。
結論
FTP サーバー上にある add annotations to 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");