Эта страница может содержать автоматически переведенный текст.

Разделить PDF документ в C# и VB.NET

Библиотека Docotic.Pdf позволяет разделить PDF документ на группу файлов меньшего размера. Вы можете извлечь отдельные страницы или диапазоны страниц. Вы также можете разделить PDF документы по определенным критериям.

Разделить PDF документы

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

Библиотека Docotic.Pdf 9.4.17467-dev Регрессионные тесты 14,760 прошло Всего загрузок NuGet 4,415,970

Основы разделения PDF файлов

Методы PdfDocument.CopyPages позволяют копировать страницы из объектов PdfDocument. Это основной API Docotic.Pdf для разделения PDF документов.

Разделить PDF на отдельные страницы

Следующий C# код сохраняет каждую страницу PDF в отдельный файл:

using var pdf = new PdfDocument("source.pdf");

for (int i = 0; i < pdf.PageCount; ++i)
{
    using PdfDocument copy = pdf.CopyPages(i, 1);
    copy.RemoveUnusedResources();
    copy.Save(i + ".pdf");
}

Метод PdfDocument.RemoveUnusedResources помогает уменьшить выходные файлы. Это полезно, когда скопированные страницы ссылаются на неиспользуемые шрифты, изображения, узоры. Подробнее о сжатии PDF читайте в разделе Оптимизация выходных файлов.

Разделить на группы страниц

Метод CopyPages поддерживает копирование любого диапазона страниц. Этот фрагмент кода показывает, как извлечь третью и первую страницы:

using var pdf = new PdfDocument(@"source.pdf");

using PdfDocument copy = pdf.CopyPages(new int[] { 2, 0 });
copy.RemoveUnusedResources();
copy.Save("result.pdf");

Порядок индексов страниц важен. Он определяет порядок страниц в результирующем документе.

Попробуйте пример кода Копировать страницы с GitHub.

Разделить PDF по условию

Вы можете разделить документы по содержанию. Это полезно, если вы заранее не знаете, какие страницы следует извлечь. Например, извлеките страницы, содержащие определенный текст:

string textToFind = ".NET Standard";
using (var pdf = new PdfDocument("C# in depth.pdf"))
{
    var pageIndexes = new List<int>();
    for (int i = 0; i < pdf.Pages.Count; i++)
    {
        string pageText = pdf.Pages[i].GetText();
        if (pageText.Contains(textToFind, StringComparison.CurrentCultureIgnoreCase))
            pageIndexes.Add(i);
    }

    if (pageIndexes.Count > 0)
    {
        using var copy = pdf.CopyPages(pageIndexes.ToArray());
        copy.RemoveUnusedResources();
        copy.Save(textToFind + ".pdf");
    }
}

Подробнее об извлечении текста можно прочитать в статье Извлечение текста из PDF в C# и VB.NET.

Продвинутые возможности разделения PDF файлов

Извлечь страницы

Методы CopyPages не изменяют связанный объект PdfDocument. Существуют также методы PdfDocument.ExtractPages. Они позволяют удалять извлеченные страницы из документа:

using var pdf = new PdfDocument(@"source.pdf");

using PdfDocument copy = pdf.ExtractPages(0, 3);
copy.Save("extracted.pdf");

pdf.Save("original.pdf");

Вы можете попробовать соответствующий пример кода Извлечь страницы на GitHub.

Удалить и переупорядочить страницы

Методы CopyPages и ExtractPages создают новый документ с выбранными страницами. Альтернативой является удаление страниц из текущего документа:

using var pdf = new PdfDocument(@"source.pdf");
pdf.RemovePages(0, 3);
pdf.Save("remaining.pdf")

Вы также можете изменить порядок страниц после удаления. Посмотрите соответствующие примеры кода:

Оптимизировать выходные файлы

Ранее я использовал метод RemoveUnusedResources для оптимизации полученных файлов. Docotic.Pdf предоставляет больше возможностей для сжатия PDF. Например, вы можете удалить информацию о структуре или сжать изображения. Прочтите статью Сжать PDF-документы в C# и VB.NET для получения дополнительной информации. Вы также можете попробовать пример кода Сжать PDF документ в .NET с GitHub.

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

using var pdf = new PdfDocument("source.pdf");

using PdfDocument copy = pdf.CopyPages(0, 1);
copy.RemoveUnusedResources();

using var ms = new MemoryStream();
copy.Save(ms);

byte limit = 1024 * 1024;
if (ms.Length > limit)
{
    compress(copy);
    copy.Save("result.pdf");
}

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

Извлечь содержимое страницы

Также возможно изменение содержимого страницы при разделении. Например, вы можете масштабировать извлеченные страницы перед их использованием в верстке PDF. Попробуйте соответствующий пример проекта Создать XObject со страницы с GitHub.

Или вы можете удалить или заменить некоторый контент на извлеченных страницах. Посмотрите пример кода Копирование текста, путей и изображений, в котором показано, как копировать объекты страницы PDF.

Разделить PDF на изображения

Docotic.Pdf также позволяет разделить PDF документ на изображения страниц. Более подробную информацию можно найти в статье Сконвертировать PDF в изображение в C# и VB.NET.

Разделить PDF файлы в параллельных потоках

Возможно, вы захотите распараллелить разделение больших PDF документов. Класс PdfDocument не является потокобезопасным. Но можно использовать отдельные объекты PdfDocument в каждом потоке:

string fileName = "source.pdf";
using var temp = new PdfDocument(fileName);
int pageCount = temp.PageCount;

Parallel.For(0, pageCount, i =>
{
    using var pdf = new PdfDocument(fileName);
    using var copy = pdf.CopyPages(i, 1);
    copy.RemoveUnusedResources();
    copy.Save($"split_{i}.pdf");
});

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