Добавить аннотации в PDF с FTP в .NET
Загрузка PDF с FTP‑сервера и затем добавление аннотаций в PDF файлов является распространённым требованием для компаний, которые хранят устаревшие документы в локальном хранилище. В этом руководстве вы увидите, как точно скачать файл с FTP, передать его в GroupDocs.Annotation и применить выделения, комментарии или фигуры — всё без записи файла на диск. К концу вы получите переиспользуемый шаблон, работающий с любым PDF, доступным по FTP, и его можно расширить для других форматов, поддерживаемых GroupDocs.Annotation.
Быстрые ответы
- Что покрывает это руководство? Загрузка PDF с FTP и добавление аннотаций с помощью GroupDocs.Annotation для .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 для .NET предоставляет высокоуровневый API, работающий напрямую с потоками, поэтому вы можете изменять PDF, находящийся на удалённом FTP‑сервере, без предварительного сохранения его локально.
Почему загружать документы с FTP?
Загрузка документов с FTP позволяет приложениям получать доступ к централизованно хранимым файлам без ручного копирования, уменьшает задержку за счёт обработки файлов на месте и поддерживает автоматизированные рабочие процессы, которые извлекают документы по запросу, гарантируя использование последней версии при соблюдении внутренних политик обработки данных.
- Централизованное хранилище: Более 70 % компаний с устаревшими системами всё ещё используют FTP для массовых архивов документов.
- Пакетная обработка: FTP позволяет извлекать сотни файлов за одну задачу, что даёт возможность автоматических конвейеров аннотирования.
- Соответствие требованиям: Локальный FTP сохраняет данные в контролируемых сетевых зонах, удовлетворяя многие регуляторные требования.
Предварительные требования
- Основы C# — уверенное владение потоками и асинхронными шаблонами.
- GroupDocs.Annotation для .NET — скачайте с официальной страницы релизов и ознакомьтесь с общей страницей релизов.
- Учётные данные FTP — хост, имя пользователя, пароль (если требуется) и разрешение на чтение целевых файлов.
- Инструменты разработки — Visual Studio 2019+ и .NET Framework 4.6.1 или .NET Core 2.0+.
Как добавить аннотации в PDF с FTP в .NET?
В этом руководстве мы скачиваем PDF с FTP‑сервера, передаём поток в GroupDocs.Annotation, добавляем аннотацию‑выделение и сохраняем аннотированный файл — всё без записи временных файлов на диск. AnnotationConfig настраивает GroupDocs.Annotation для работы с конкретным потоком документа и форматом. FtpWebRequest — класс .NET, который обрабатывает FTP‑операции, такие как загрузка файлов. HighlightAnnotation представляет визуальное выделение, размещённое на странице PDF.
Шаг 1: Определите локальный путь вывода
Сначала определите, куда будет сохраняться аннотированный PDF после обработки. Использование Path.Combine гарантирует правильные разделители путей в Windows и Linux.
Примечание: Папка вывода должна существовать до вызова
Save. При необходимости создайте её программно.
Шаг 2: Получите поток PDF с FTP
Вспомогательный метод GetFileFromFtp открывает FtpWebRequest, читает ответ в MemoryStream и возвращает поток, установленный в начало. Этот поток потребляется GroupDocs.Annotation.
Совет по безопасности: В продакшене всегда задавайте
request.Credentials = new NetworkCredential(user, pass)и включайте SSL (EnableSsl = true), чтобы защитить учётные данные.
Шаг 3: Инициализируйте GroupDocs.Annotation с потоком
AnnotationConfig указывает GroupDocs.Annotation тип файла, с которым вы работаете, и поток для чтения. Передача потока напрямую избавляет от временных файлов и уменьшает нагрузку ввода‑вывода.
Шаг 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, чтобы клиент открыл соединение данных.
Обработка больших файлов
Для PDF размером более 100 МБ рассмотрите возможность потоковой передачи ответа напрямую во временный файл, а затем откройте FileStream для GroupDocs.Annotation. Это предотвращает хранение всего файла в памяти.
Соображения по безопасности
- Никогда не встраивайте учётные данные в код — храните их в Azure Key Vault, AWS Secrets Manager или переменных окружения.
- Отдавайте предпочтение FTPS или SFTP — обычный FTP передаёт учётные данные в открытом виде.
- Проверяйте URL — ограничьте FTP‑хост белым списком, чтобы избежать атак SSRF.
- Очистите имена файлов — отклоняйте пути, содержащие
..или неожиданные символы, чтобы предотвратить обход каталогов.
Примеры из реального мира
- Порталы регуляторного обзора — извлекайте PDF‑файлы соответствия из локального FTP‑архива, позволяйте аудиторам добавлять комментарии и сохраняйте аннотированную версию в безопасном месте.
- Автоматизация устаревших отчётов — ежедневные финансовые отчёты попадают в FTP‑папку; сервис автоматически выделяет ключевые цифры и отправляет аннотированный отчёт заинтересованным сторонам.
- Помощники миграции — при переносе документов с FTP в облачную DMS аннотируйте каждый файл флагами статуса миграции без ручного вмешательства.
Советы по оптимизации производительности
- Повторно используйте объекты
FtpWebRequestпри обработке нескольких файлов, чтобы уменьшить накладные расходы на установление соединения. - Выполняйте FTP‑вызовы асинхронно (
await GetFileFromFtpAsync), чтобы UI‑потоки оставались отзывчивыми. - Кешируйте часто используемые PDF локально на короткий период (например, 5 минут), когда один и тот же файл аннотируется многократно.
- Пакетное аннотирование — загружайте несколько PDF в отдельные экземпляры
Annotation, применяйте аннотации и затем сохраняйте их одной операцией ввода‑вывода.
Часто задаваемые вопросы
В: Можно ли аннотировать типы файлов, отличные от PDF?
О: Да, GroupDocs.Annotation поддерживает более 30 форматов, включая DOCX, PPTX и распространённые типы изображений, все они могут быть загружены с FTP с использованием того же подхода на основе потоков.
В: Как добавить аннотацию‑комментарий вместо выделения?
О: Создайте CommentAnnotation, задайте её свойство Text и добавьте её в коллекцию Annotations, как в примере с выделением.
В: Можно ли записать аннотированный файл обратно на FTP‑сервер?
О: Конечно. После локального сохранения откройте новый FtpWebRequest с Method = WebRequestMethods.Ftp.UploadFile и запишите поток файла обратно в удалённый путь.
В: Какие версии .NET официально поддерживаются?
О: GroupDocs.Annotation для .NET работает с .NET Framework 4.6.1+, .NET Core 2.0+, .NET 5 и .NET 6.
В: Как работать с PDF, защищёнными паролем?
О: Передайте пароль в конструктор AnnotationConfig через свойство Password перед загрузкой потока.
Заключение
Теперь у вас есть полный, готовый к продакшену шаблон для add annotations to pdf файлов, находящихся на FTP‑сервере. Потоковая передача файла напрямую в GroupDocs.Annotation позволяет избежать лишних операций ввода‑вывода на диск, делает приложение лёгким и сохраняет полный контроль над безопасностью и производительностью. Расширьте эту основу аутентификацией, отчётами о прогрессе или пакетной обработкой, чтобы удовлетворить потребности корпоративных документооборотов.
Для дополнительной помощи посетите форум поддержки.
Последнее обновление: 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");