c# pdf page count – Извлечение информации о документе с GroupDocs.Annotation
Введение
Когда‑то вы, вероятно, оказывались перед горой документов и задавались вопросом, что в них находится, не открывая каждый по отдельности? Вы определённо не одиноки в этой проблеме. Будь то система управления документами, обработка юридических файлов или просто организация цифровых активов компании, знание того, как извлекать информацию о документе в C# — включая c# pdf page count — может стать настоящим прорывом.
Ручная проверка свойств файлов отнимает время и подвержена ошибкам. С GroupDocs.Annotation for .NET вы можете автоматизировать весь процесс и получить тип файла, количество страниц, размер документа и многое другое всего в нескольких строках кода. В этом руководстве объясняется, почему это важно, как настроить библиотеку и пошаговый код, готовый к использованию.
Быстрые ответы
- Что извлекает GroupDocs.Annotation? Тип файла, количество страниц, размер и базовые метаданные.
- Сколько форматов поддерживается? Более 50 входных и выходных форматов, включая PDF, DOCX, XLSX, PPTX и распространённые типы изображений.
- Можно ли получить c# pdf page count без загрузки всего файла? Да —
GetDocumentInfo()читает только заголовочную информацию, необходимую для подсчёта страниц. - Нужна ли лицензия для разработки? Бесплатная пробная версия подходит для тестирования; полная лицензия требуется для продакшна.
- Безопасен ли API для многопоточных веб‑приложений? Абсолютно — просто правильно освобождайте экземпляры
Annotator.
Что такое c# pdf page count?
c# pdf page count — это общее количество страниц, которое возвращает PDF‑файл при запросе через API. С помощью GroupDocs.Annotation вы получаете это значение мгновенно через метод GetDocumentInfo() без рендеринга всего документа. Этот счёт берётся из внутренней структуры PDF, позволяя принимать решения о обработке, хранении или отображении без открытия файла в просмотрщике. Это особенно полезно для пакетной валидации, проверок соответствия и предварительных просмотров UI, где важны ограничения по страницам.
Почему стоит извлекать информацию о документе с GroupDocs.Annotation?
GroupDocs.Annotation поддерживает более 50 форматов документов и может обрабатывать файлы со сотнями страниц без загрузки их полностью в память, предоставляя метаданные менее чем за 200 мс на типичном сервере. Такая скорость и широта форматов делают её идеальной для масштабной автоматизации, проверок соответствия и интеллектуальной классификации контента.
Предпосылки и настройка
Что понадобится
- Visual Studio 2019 или новее (Community Edition подходит)
- .NET Framework 4.6.1+ или .NET Core 2.0+
- Базовые знания C# и знакомство с NuGet
Установка GroupDocs.Annotation
Подключить библиотеку к проекту просто. Выберите удобный способ:
Вариант 1: Package Manager Console (рекомендовано)
Install-Package GroupDocs.Annotation -Version 25.4.0
Вариант 2: .NET CLI
dotnet add package GroupDocs.Annotation --version 25.4.0
Вариант 3: Package Manager UI
Если предпочитаете кликать вместо ввода команд, найдите «GroupDocs.Annotation» в UI менеджера пакетов NuGet и установите последнюю версию.
Получение лицензии
- Начните с бесплатной пробной версии: скачайте с GroupDocs website — без обязательств.
- Нужен больше времени? Получите temporary license для продленного тестирования.
- Готовы к продакшну? Purchase a full license, когда будете готовы к развертыванию.
Pro tip: Бесплатная пробная версия содержит водяные знаки, но прекрасно подходит для обучения и тестирования кода.
Для последних изменений см. release notes.
Как получить c# pdf page count с помощью GroupDocs.Annotation?
Annotator — основной класс, который загружает документ и предоставляет функции аннотирования и получения метаданных.
Загрузите PDF через new Annotator("file.pdf") и вызовите GetDocumentInfo() — свойство PageCount вернёт точное количество страниц всего в две строки кода. GetDocumentInfo() возвращает объект DocumentInfo, содержащий метаданные, такие как количество страниц, тип файла и размер. Этот метод читает только необходимые заголовочные данные, поэтому даже большие PDF‑файлы обрабатываются эффективно.
Базовая настройка и загрузка документа
using System;
using GroupDocs.Annotation;
class Program
{
static void Main(string[] args)
{
// Initialize the annotator with a document path
using (Annotator annotator = new Annotator("YOUR_DOCUMENT_DIRECTORY/input.pdf"))
{
Console.WriteLine("Document loaded successfully!");
// We'll add the extraction code here next
}
}
}
Извлечение метаданных документа
DocumentInfo инкапсулирует извлечённые свойства файла, делая их простыми для чтения и использования в вашем приложении.
using (Annotator annotator = new Annotator("YOUR_DOCUMENT_DIRECTORY/input.pdf"))
{
// Extract document info
IDocumentInfo info = annotator.Document.GetDocumentInfo();
// Always check if info was retrieved successfully
if (info == null || info.PageCount == 0)
{
throw new Exception("Unexpected document information!");
}
// Display the extracted information
Console.WriteLine($"\
File type: {info.FileType}\
Number of pages: {info.PageCount}\
Document size: {info.Size} bytes.");
// Convert size to more readable format
string readableSize = FormatFileSize(info.Size);
Console.WriteLine($"Document size (formatted): {readableSize}");
}
// Helper method to format file size
static string FormatFileSize(long bytes)
{
string[] suffixes = { "B", "KB", "MB", "GB", "TB" };
int counter = 0;
decimal number = bytes;
while (Math.Round(number / 1024) >= 1)
{
number /= 1024;
counter++;
}
return string.Format("{0:n1}{1}", number, suffixes[counter]);
}
Расширенный вывод информации
Если требуется более подробный контекст — например, превышает ли документ пороговый размер — вы можете расширить базовый пример дополнительными проверками и бизнес‑логикой.
using (Annotator annotator = new Annotator("YOUR_DOCUMENT_DIRECTORY/input.pdf"))
{
IDocumentInfo info = annotator.Document.GetDocumentInfo();
if (info == null)
{
Console.WriteLine("Could not retrieve document information.");
return;
}
// Comprehensive info display
Console.WriteLine("=== Document Information ===");
Console.WriteLine($"File Type: {info.FileType}");
Console.WriteLine($"Page Count: {info.PageCount}");
Console.WriteLine($"Size: {FormatFileSize(info.Size)}");
// Additional checks you might want to perform
if (info.PageCount > 100)
{
Console.WriteLine("⚠️ Large document detected - consider batch processing");
}
if (info.Size > 10 * 1024 * 1024) // 10MB
{
Console.WriteLine("⚠️ Large file size - may impact processing time");
}
Console.WriteLine("=== Analysis Complete ===");
}
Распространённые проблемы и решения
Проблема 1: Ошибки «File Not Found»
Прямой ответ: Убедитесь, что путь к файлу абсолютный или правильно привязан к базовому каталогу приложения, и процесс имеет права чтения.
string documentPath = @"C:\Documents\test.pdf";
// Always check if file exists first
if (!File.Exists(documentPath))
{
Console.WriteLine($"File not found: {documentPath}");
return;
}
try
{
using (Annotator annotator = new Annotator(documentPath))
{
// Your code here
}
}
catch (Exception ex)
{
Console.WriteLine($"Error loading document: {ex.Message}");
}
Проблема 2: Неподдерживаемый формат файла
Прямой ответ: Проверьте, что расширение файла соответствует одному из более чем 50 поддерживаемых форматов; если нет, конвертируйте его в поддерживаемый тип перед вызовом GetDocumentInfo().
try
{
using (Annotator annotator = new Annotator(documentPath))
{
IDocumentInfo info = annotator.Document.GetDocumentInfo();
if (info == null)
{
Console.WriteLine("Unsupported file format or corrupted document");
return;
}
// Process the info
}
}
catch (UnsupportedFileTypeException ex)
{
Console.WriteLine($"File type not supported: {ex.Message}");
}
Проблема 3: Проблемы с памятью при больших документах
Прямой ответ: Реализуйте проверки размера перед загрузкой и используйте конструкции using для гарантированного освобождения экземпляра Annotator, предотвращая утечки памяти.
const long MAX_FILE_SIZE = 50 * 1024 * 1024; // 50MB limit
FileInfo fileInfo = new FileInfo(documentPath);
if (fileInfo.Length > MAX_FILE_SIZE)
{
Console.WriteLine("File too large for processing");
return;
}
// Use proper disposal patterns
using (Annotator annotator = new Annotator(documentPath))
{
// Process quickly and dispose
IDocumentInfo info = annotator.Document.GetDocumentInfo();
// Handle info immediately
}
// Annotator is automatically disposed here
Реальные сценарии использования
Интеграция в систему управления документами
Когда пользователь загружает файл, сначала извлеките его метаданные, чтобы решить, куда хранить, как индексировать или какой процесс утверждения требуется.
public class DocumentProcessor
{
public DocumentMetadata ProcessUpload(string filePath)
{
using (Annotator annotator = new Annotator(filePath))
{
IDocumentInfo info = annotator.Document.GetDocumentInfo();
return new DocumentMetadata
{
FileName = Path.GetFileName(filePath),
FileType = info.FileType.ToString(),
PageCount = info.PageCount,
FileSizeBytes = info.Size,
ProcessedDate = DateTime.UtcNow,
Category = DetermineCategory(info)
};
}
}
private string DetermineCategory(IDocumentInfo info)
{
// Business logic for automatic categorization
if (info.FileType.ToString().Contains("Pdf"))
{
return info.PageCount > 20 ? "Legal Document" : "Standard Document";
}
return "Other";
}
}
Пакетный анализ документов
Обрабатывайте папку файлов в фоновом задании, фиксируя количество страниц и тип каждого документа для последующей отчётности.
public void AnalyzeDocumentFolder(string folderPath)
{
string[] supportedExtensions = { ".pdf", ".docx", ".xlsx", ".pptx" };
foreach (string file in Directory.GetFiles(folderPath))
{
if (!supportedExtensions.Contains(Path.GetExtension(file).ToLower()))
continue;
try
{
using (Annotator annotator = new Annotator(file))
{
IDocumentInfo info = annotator.Document.GetDocumentInfo();
Console.WriteLine($"{Path.GetFileName(file)}: {info.FileType}, {info.PageCount} pages");
}
}
catch (Exception ex)
{
Console.WriteLine($"Failed to process {file}: {ex.Message}");
}
}
}
Соответствие и валидация
В регулируемых отраслях часто требуется, чтобы документы имели ограниченное количество страниц или размер. Используйте извлечённые метаданные для автоматического отклонения несоответствующих загрузок.
public bool ValidateDocument(string filePath, DocumentRequirements requirements)
{
using (Annotator annotator = new Annotator(filePath))
{
IDocumentInfo info = annotator.Document.GetDocumentInfo();
// Check file type
if (requirements.AllowedTypes != null &&
!requirements.AllowedTypes.Contains(info.FileType.ToString()))
{
return false;
}
// Check page count limits
if (info.PageCount < requirements.MinPages ||
info.PageCount > requirements.MaxPages)
{
return false;
}
// Check file size
if (info.Size > requirements.MaxSizeBytes)
{
return false;
}
return true;
}
}
Советы по оптимизации производительности
1. Реализуйте кэширование
Кешируйте результаты DocumentInfo для часто запрашиваемых файлов, чтобы избежать повторных операций ввода‑вывода.
private static readonly Dictionary<string, IDocumentInfo> _infoCache =
new Dictionary<string, IDocumentInfo>();
public IDocumentInfo GetDocumentInfoCached(string filePath)
{
string fileHash = GetFileHash(filePath);
if (_infoCache.ContainsKey(fileHash))
{
return _infoCache[fileHash];
}
using (Annotator annotator = new Annotator(filePath))
{
IDocumentInfo info = annotator.Document.GetDocumentInfo();
_infoCache[fileHash] = info;
return info;
}
}
2. Асинхронная обработка множества документов
Используйте Task.Run или асинхронные потоки для одновременной обработки большого количества файлов без блокировки основного потока.
public async Task<List<DocumentMetadata>> ProcessDocumentsAsync(string[] filePaths)
{
var tasks = filePaths.Select(async path =>
{
return await Task.Run(() =>
{
using (Annotator annotator = new Annotator(path))
{
IDocumentInfo info = annotator.Document.GetDocumentInfo();
return new DocumentMetadata(path, info);
}
});
});
return (await Task.WhenAll(tasks)).ToList();
}
3. Лучшие практики управления памятью
- Всегда оборачивайте
Annotatorв блокusing. - Обрабатывайте документы партиями, а не все сразу.
- Для файлов более 100 МБ рассмотрите возможность предварительного стриминга на диск, а затем чтения метаданных.
Руководство по устранению неполадок
Проблемы, связанные с лицензией
License — объект, регистрирующий ваш файл активации продукта в библиотеке GroupDocs. Убедитесь, что файл лицензии находится в корневой папке приложения и объект License создаётся до любых других вызовов GroupDocs.
// Set license before using any GroupDocs functionality
License license = new License();
license.SetLicense("path/to/your/license.lic");
// Or use stream for embedded licenses
using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("YourApp.license.lic"))
{
license.SetLicense(stream);
}
Проблемы с производительностью
Прямой ответ: Профилируйте приложение, ограничьте размер файлов 100 МБ для обработки в реальном времени и включите кэширование повторных чтений.
Платформенно‑специфические проблемы
Прямой ответ: Используйте Path.Combine для кроссплатформенной сборки путей; Windows использует обратные слеши, а Linux — прямые.
// Use Path.Combine for cross-platform compatibility
string documentPath = Path.Combine(baseDirectory, "documents", fileName);
Обработка защищённых паролем документов
Прямой ответ: Передайте пароль в конструктор Annotator или задайте его через LoadOptions перед вызовом GetDocumentInfo().
LoadOptions loadOptions = new LoadOptions() { Password = "your-password" };
using (Annotator annotator = new Annotator("protected-document.pdf", loadOptions))
{
// Extract information normally
}
Обновление GroupDocs.Annotation
Прямой ответ: Выполните dotnet add package GroupDocs.Annotation --version <latest> или используйте UI менеджера пакетов NuGet для получения последней версии.
Update-Package GroupDocs.Annotation
Часто задаваемые вопросы
В: Какие форматы документов поддерживает GroupDocs.Annotation для извлечения информации?
О: GroupDocs.Annotation поддерживает более 50 форматов, включая PDF, DOCX, XLSX, PPTX, JPEG, PNG, TIFF, CAD‑файлы и многие другие.
В: Можно ли извлечь пользовательские метаданные или свойства из документов?
О: GetDocumentInfo() предоставляет основные метаданные, такие как тип файла, количество страниц и размер. Для пользовательских свойств, например автора или даты создания, комбинируйте GroupDocs.Annotation с GroupDocs.Metadata или используйте нативные API формата файла.
В: Как работать с документами, защищёнными паролем?
О: Укажите пароль при создании экземпляра Annotator, например new Annotator("secure.pdf", new LoadOptions { Password = "pwd" }).
В: Можно ли извлекать информацию о документе без загрузки всего файла в память?
О: Да — GetDocumentInfo() читает только заголовок файла, поэтому потребление памяти остаётся низким даже для PDF‑файлов со сотнями страниц.
В: Подойдёт ли это для веб‑приложения или многопоточной среды?
О: Абсолютно. GroupDocs.Annotation потокобезопасен; просто создавайте новый Annotator для каждого запроса и своевременно освобождайте его.
Заключение и дальнейшие шаги
Теперь у вас есть полностью готовый к продакшну подход к извлечению c# pdf page count, типа файла и размера с помощью GroupDocs.Annotation. Вы узнали, как настроить библиотеку, получить метаданные, справиться с типичными подводными камнями и оптимизировать производительность для масштабных сценариев.
Следующие действия:
- Клонируйте пример проекта и запустите предоставленные шаблоны с реальными файлами.
- Исследуйте дополнительные возможности GroupDocs.Annotation, такие как рендеринг аннотаций и сравнение документов.
- Интегрируйте извлечение метаданных в ваш текущий конвейер загрузки, чтобы автоматизировать классификацию и валидацию.
Помните, надёжная обработка документов начинается с достоверных метаданных. С GroupDocs.Annotation вы сможете создавать более умные, быстрые и масштабируемые решения.
Последнее обновление: 2026-06-01
Тестировано с: GroupDocs.Annotation 25.4.0 (latest)
Автор: GroupDocs
Важные ссылки:
- Documentation
- API Reference
- Download Latest Version
- Purchase Licenses
- Free Trial Download
- Temporary License Request
- Community Support Forum