Извлечение содержимого PDF из ZIP в .NET

Используйте Aspose.ZIP for .NET, чтобы открыть ZIP-архив, проверить его записи и восстановить только PDF-файлы, необходимые C#-приложению. На этой странице извлечение означает поиск элементов с расширением .pdf внутри ZIP-контейнера и запись в контролируемое место назначения. Aspose.ZIP восстанавливает файл из архива, но не интерпретирует и не конвертирует его внутреннее содержимое.

Выборочное извлечение полезно для приема документов, обработки загрузок, пакетов отчетов и рабочих процессов управления контентом. Приложение может пропускать нерелевантные записи, проверять имена и размеры и передавать утвержденные файлы на следующий этап без распаковки всего пакета.

Как извлечь PDF-файлы из ZIP с помощью C#

Установите пакет Aspose.ZIP for .NET и подключите пространство имен Aspose.Zip. Метаданные архива доступны до записи, поэтому приложение может проверить ArchiveEntry.Name, ArchiveEntry.IsDirectory и ArchiveEntry.UncompressedSize перед сохранением документные файлы.


Package Manager Console Command

PM> Install-Package Aspose.Zip

После установки откройте ZIP через Archive, переберите Archive.Entries, выберите записи не-каталоги с расширением .pdf и вызовите ArchiveEntry.Extract для каждого утвержденного назначения. Пример использует только конечное имя файла, поэтому пути из архива не могут записывать вне целевой папки.

Шаги извлечения файлов PDF в C#

  • Определите путь исходного ZIP и создайте изолированный выходной каталог.
  • Откройте пакет классом Archive.
  • Переберите Archive.Entries вместо немедленной распаковки всего пакета.
  • Пропустите каталоги и выберите имена файлов с расширением .pdf.
  • Создайте путь назначения, который остается внутри утвержденного выходного корня.
  • Отклоните записи, превышающие заданный лимит размера после распаковки.
  • Сохраните каждую утвержденную запись через ArchiveEntry.Extract.

Системные требования

  • Поддерживаемая среда выполнения .NET в Windows, Linux или macOS.
  • Visual Studio, JetBrains Rider, Visual Studio Code или другая среда разработки C#.
  • Aspose.ZIP for .NET, установленный через NuGet или подключенный как сборка.
  • Доступ на чтение к исходному ZIP и доступ на запись к каталогу назначения.
  • Четкие лимиты размера, времени выполнения и временного хранилища для недоверенных архивов.

Пример C#: извлечение выбранных файлов PDF из ZIP

Код открывает ZIP-пакет, пропускает каталоги, фильтрует записи по разрешенному расширению и записывает совпадающие файлы в один выходной каталог. Отбрасывание путей из архива не позволяет сегментам родительских каталогов управлять местом назначения. В production-коде также задайте детерминированное правило для дубликатов имен.

Извлечение файлов PDF из ZIP - C#

using Aspose.Zip;
using System;
using System.IO;

string archivePath = Path.GetFullPath("package.zip");
string outputDirectory = Path.GetFullPath("extracted-pdf");
string[] allowedExtensions = { ".pdf" };
const ulong MaxEntrySize = 100UL * 1024 * 1024;

Directory.CreateDirectory(outputDirectory);

using (var archive = new Archive(archivePath))
{
    foreach (ArchiveEntry entry in archive.Entries)
    {
        if (entry.IsDirectory) continue;

        string fileName = Path.GetFileName(entry.Name);
        if (string.IsNullOrWhiteSpace(fileName)) continue;

        string extension = Path.GetExtension(fileName);
        if (!Array.Exists(
            allowedExtensions,
            value => string.Equals(value, extension, StringComparison.OrdinalIgnoreCase)))
        {
            continue;
        }

        if (entry.UncompressedSize > MaxEntrySize)
        {
            throw new InvalidDataException(
                $"Запись '{fileName}' превышает лимит извлечения 100 MB.");
        }

        string destinationPath = Path.Combine(outputDirectory, fileName);
        entry.Extract(destinationPath);
    }
}

Заметки по реализации для файлов PDF

Фильтрация по расширению только определяет файлы-кандидаты; она не доказывает, что содержимое корректно или безопасно. Если файл будет отображаться, индексироваться или конвертироваться, проверьте структуру, кодировку, соответствие формату и содержимое документным компонентом.

Пример намеренно уплощает пути из архива. Если две утвержденные записи имеют одинаковое конечное имя файла, ArchiveEntry.Extract может перезаписать существующий файл. Определите политику до извлечения: отклонять дубликаты, создавать уникальные имена или сохранять проверенную относительную структуру папок.

Безопасность и конфиденциальность

Загруженный ZIP, имена записей и содержимое рассматривайте как недоверенный ввод. Не объединяйте ArchiveEntry.Name напрямую с выходным каталогом: запись может содержать абсолютный путь или сегменты перехода к родительским каталогам. Пример использует Path.GetFileName; если нужно сохранить папки, разрешите итоговый путь и убедитесь, что он остается внутри утвержденного корня.

Ограничивайте сжатый размер, размер после распаковки для записи и всего архива, число записей, время обработки и параллельные задачи. Используйте временное хранилище с ограниченными правами, удаляйте частичные результаты после ошибки и не записывайте в логи пароли, приватные имена файлов или извлеченное содержимое.

FAQ по извлечению файлов PDF

Как извлечь только файлы PDF из ZIP-архива в C#?

Откройте ZIP классом Archive, переберите Archive.Entries, отфильтруйте записи не-каталоги по расширению .pdf и вызовите Extract для каждого проверенного выходного пути.

Проверяет ли Aspose.ZIP внутреннее содержимое файла PDF?

Нет. Aspose.ZIP восстанавливает файл, сохраненный в архиве. Чтение, проверка или конвертация содержимого относятся к компоненту, который поддерживает этот формат.

Можно ли использовать тот же шаблон выбора для 7Z, RAR или TAR?

Идея та же, но каждый контейнер нужно открывать соответствующим архивным классом Aspose.ZIP. Типы записей и операции извлечения могут различаться.

Как обрабатывать повторяющиеся имена файлов PDF?

Определите правило до извлечения: отклонять дубликаты, создавать уникальные имена или сохранять проверенную относительную структуру папок.