Добавить аннотации в 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");

Связанные руководства