Изменение порядка страниц PDF на C#: произвольная последовательность и обратный порядок
После объединения отсканированных файлов может оказаться, что страницы расположены неправильно. В других случаях требуется перенести страницы из конца документа в начало. Изменить порядок страниц PDF можно с помощью индексов, без предварительного преобразования документа в изображения.
В этой статье с помощью Spire.PDF for .NET рассматриваются два варианта: расположение страниц в заданной последовательности и изменение порядка всех страниц на обратный. В обоих примерах используется метод PdfPageCollection.ReArrange(int[] orderArray). Различие заключается в способе формирования массива, задающего порядок страниц.
1. Установка Spire.PDF for .NET
Spire.PDF for .NET — библиотека для чтения, создания и обработки PDF-файлов в приложениях .NET. В статье используются её API для загрузки документов, перестановки страниц и сохранения файлов.
Выполните следующую команду в консоли диспетчера пакетов NuGet в Visual Studio:
Install-Package Spire.PDF
Другой вариант — использовать .NET CLI из каталога проекта:
dotnet add package Spire.PDF
В примерах ниже используются инструкции верхнего уровня C#. Каждый пример можно отдельно поместить в файл Program.cs консольного проекта, поддерживающего этот синтаксис, и запустить. Если для входного файла указан относительный путь, поместите файл в рабочий каталог приложения. Также можно указать абсолютный путь.
2. Индексы страниц и массив, задающий их порядок
Перед перестановкой страниц необходимо различать позиции страниц в программе просмотра PDF и индексы, используемые в коде: индексация начинается с 0, поэтому странице 1 соответствует индекс 0, странице 2 — индекс 1 и так далее.
Метод ReArrange() принимает массив целых чисел. Каждое значение представляет индекс страницы в исходном документе, а последовательность значений определяет новый порядок страниц.
Например, для PDF из четырёх страниц можно использовать следующий массив:
new int[] { 1, 0, 2, 3 }
Соответствие будет таким:
Этот массив меняет местами первые две страницы, сохраняя порядок остальных двух.
В статье рассматривается перестановка с сохранением всех страниц. Поэтому массив должен содержать каждый индекс страницы исходного документа ровно один раз. Допустимые значения — от 0 до pdf.Pages.Count - 1.
3. Расположение страниц PDF в заданной последовательности
Произвольный порядок удобен, когда нужная последовательность уже известна: например, требуется поменять местами первые две страницы или перенести обложку в начало документа.
В следующем примере используется PDF, содержащий ровно четыре страницы . Исходная вторая страница помещается перед первой. В результате получается последовательность: исходная страница 2, исходная страница 1, исходная страница 3 и исходная страница 4.
using Spire.Pdf;
// Создаём объект документа и загружаем PDF
PdfDocument pdf = new PdfDocument();
pdf.LoadFromFile("input.pdf");
// Переставляем страницы по исходным индексам:
// меняем местами первые две страницы
pdf.Pages.ReArrange(new int[] { 1, 0, 2, 3 });
// Сохраняем результат в новый файл и закрываем документ
pdf.SaveToFile("ChangeOrder.pdf");
pdf.Close();
Код выполняет три действия:
Загружает исходный PDF с помощью LoadFromFile().
Вызывает pdf.Pages.ReArrange(), чтобы переставить страницы согласно исходным индексам, указанным в массиве.
Сохраняет результат с помощью SaveToFile(), затем закрывает документ вызовом Close().
Чтобы перенести последнюю страницу этого четырёхстраничного документа в начало, достаточно заменить массив на { 3, 0, 1, 2 }.
Массив в примере задан явно для документа из четырёх страниц. Для файлов с другим количеством страниц необходимо сформировать полный массив с учётом фактического числа страниц, а не использовать этот массив без изменений.
4. Изменение порядка всех страниц PDF на обратный
Чтобы последняя страница стала первой, предпоследняя — второй, а исходная первая страница оказалась в конце, можно автоматически сформировать массив индексов в обратном порядке на основе общего числа страниц.
По сравнению с ручным заполнением массива этот способ удобнее для документов с разным количеством страниц.
using Spire.Pdf;
using System.Linq;
// Создаём объект документа и загружаем PDF
PdfDocument pdf = new PdfDocument();
pdf.LoadFromFile("Input.pdf");
// Получаем общее количество страниц
int pageCount = pdf.Pages.Count;
// Формируем индексы страниц в обратном порядке
int[] reverseOrder = Enumerable.Range(0, pageCount)
.Reverse()
.ToArray();
// Переставляем страницы по индексам в обратном порядке
pdf.Pages.ReArrange(reverseOrder);
// Сохраняем результат в формате PDF и закрываем документ
pdf.SaveToFile("Reversed.pdf", FileFormat.PDF);
pdf.Close();
Массив индексов в обратном порядке формируется следующим образом:
Enumerable.Range(0, pageCount) создаёт pageCount последовательных целых чисел, начиная с 0, то есть все индексы страниц.
Reverse() меняет порядок элементов последовательности на обратный.
ToArray() преобразует результат в массив целых чисел, необходимый методу ReArrange().
Например, для документа из пяти страниц сначала формируется последовательность индексов { 0, 1, 2, 3 }. После её обращения получается { 3, 2, 1, 0 }. Таким образом, в выходном документе исходные страницы располагаются в порядке 4, 3, 2, 1.
5. Практические замечания
1. Порядок страниц и номера, напечатанные на страницах, — разные вещи
Перестановка изменяет положение страницы в документе. При этом номера страниц в верхних или нижних колонтитулах не переписываются в соответствии с новыми позициями. Например, если исходную страницу 5 перенести в начало, имеющуюся на ней надпись «Страница 5» потребуется обработать отдельно.
Если документ содержит оглавление, закладки или внутренние ссылки, после сохранения проверьте, что они ведут к ожидаемым разделам. Правильная последовательность страниц сама по себе не гарантирует соответствующего обновления всех элементов навигации.
2. Массив должен соответствовать фактическому количеству страниц
При перестановке с сохранением всех страниц перед вызовом метода проверьте длину массива, диапазон индексов и отсутствие повторяющихся значений. Числа в массиве обозначают исходные индексы страниц. Не следует напрямую подставлять номера страниц из программы просмотра PDF, где отсчёт начинается с 1.
3. Используйте разные пути для входного и выходного файлов
В примерах результаты сохраняются в новые файлы, чтобы упростить сравнение. При проверке сначала убедитесь, что количество страниц соответствует ожидаемому, затем просмотрите первую, последнюю и все перемещённые страницы.
4. Учитывайте различия между примером и рабочим приложением
Обработка исключений здесь опущена, чтобы сосредоточиться на основной логике перестановки страниц. В рабочем приложении также необходимо обрабатывать некорректные пути к входным файлам, ошибки чтения и отсутствие прав на запись в выходной каталог. Следует обеспечить закрытие документа и освобождение связанных ресурсов даже при возникновении исключения.
Кроме того, Spire.PDF for .NET и Free Spire.PDF for .NET — разные пакеты. При использовании пробной лицензии или бесплатной версии проверьте условия лицензирования и ограничения обработки для конкретной версии, чтобы не принять эти ограничения за ошибки в логике перестановки страниц.
6. Заключение
Основная задача при изменении порядка страниц PDF с помощью Spire.PDF for .NET — сформировать массив исходных индексов, соответствующий нужной последовательности. Если целевой порядок известен заранее, массив можно задать явно. Чтобы расположить все страницы документа в обратном порядке, сформируйте индексы на основе Pages.Count и обратите их последовательность с помощью LINQ.
В обоих случаях учитывайте, что индексация начинается с 0, а после сохранения проверяйте фактический порядок страниц и элементы навигации документа.
















