Разделение PDF-файлов на Java
Aspose.PDF for Java поддерживает несколько вариантов разбиения, помимо вывода «одна страница в файл».
Разбиение PDF на одностраничные файлы
Используйте этот подход, когда каждая исходная страница должна стать отдельным выходным документом.
- Откройте исходный PDF в объекте Document.
- Создайте новый PDF-документ Document для каждой страницы Page, которую нужно экспортировать.
- Добавьте выбранную страницу Page в новый документ.
- Сохраните каждый выводной PDF Document.
public static void splitDocuments(Path inputFile, Path outputDir) {
try (Document document = new Document(inputFile.toString())) {
for (int pageNumber = 1; pageNumber <= document.getPages().size(); pageNumber++) {
try (Document newDocument = new Document()) {
newDocument.getPages().add(document.getPages().get_Item(pageNumber));
newDocument.save(outputDir.resolve("Page_" + pageNumber + ".pdf").toString());
}
}
}
}
Разделение PDF на две части
Этот пример делит исходный документ на два последовательных выходных файла, основываясь на средней точке.
- Откройте исходный PDF в объекте Document.
- Определите середину доступной коллекции страниц Page.
- Скопируйте первую половину страниц в один выходной документ, а оставшиеся страницы — в другой.
- Сохраните оба полученных документа.
public static void splitDocumentsIntoTwoParts(Path inputFile, Path outputDir) {
try (Document document = new Document(inputFile.toString())) {
int totalPages = document.getPages().size();
int midPoint = totalPages / 2;
try (Document firstDocument = new Document()) {
for (int pageNumber = 1; pageNumber <= midPoint; pageNumber++) {
firstDocument.getPages().add(document.getPages().get_Item(pageNumber));
}
firstDocument.save(outputDir.resolve("Part_1.pdf").toString());
}
try (Document secondDocument = new Document()) {
for (int pageNumber = midPoint + 1; pageNumber <= totalPages; pageNumber++) {
secondDocument.getPages().add(document.getPages().get_Item(pageNumber));
}
secondDocument.save(outputDir.resolve("Part_2.pdf").toString());
}
}
}
Разделение PDF на группы страниц фиксированного размера
Используйте этот шаблон, когда каждый файл вывода должен содержать одинаковое количество страниц, за исключением, возможно, последней части.
- Откройте исходный PDF в объекте Document.
- Переберите коллекцию страниц Page группами по
pagesPerPart. - Создайте новый выходной документ для каждой группы и скопируйте рассчитанный диапазон страниц в него.
- Сохраните каждую часть с сгенерированным именем файла.
public static void splitDocumentsEveryNPages(Path inputFile, Path outputDir, int pagesPerPart) {
try (Document document = new Document(inputFile.toString())) {
int totalPages = document.getPages().size();
int partIndex = 1;
for (int startPage = 1; startPage <= totalPages; startPage += pagesPerPart) {
int endPage = Math.min(startPage + pagesPerPart - 1, totalPages);
try (Document partDocument = new Document()) {
for (int pageNumber = startPage; pageNumber <= endPage; pageNumber++) {
partDocument.getPages().add(document.getPages().get_Item(pageNumber));
}
partDocument.save(outputDir.resolve("Every_" + pagesPerPart + "_Part_" + partIndex + ".pdf").toString());
}
partIndex++;
}
}
}
Разделение PDF по пользовательским диапазонам страниц
Этот пример позволяет вам задавать явные начальные и конечные страницы для каждого выходного документа.
- Откройте исходный PDF в объекте Document.
- Задайте требуемые диапазоны страниц Page в массиве или другой коллекции.
- Проверьте каждый диапазон относительно количества страниц исходного документа и скопируйте соответствующие страницы в новый документ.
- Сохраните каждый файл вывода, основанный на диапазоне.
public static void splitDocumentsByPageRanges(Path inputFile, Path outputDir) {
try (Document document = new Document(inputFile.toString())) {
int totalPages = document.getPages().size();
Integer[][] ranges = {{1, 3}, {4, 6}, {7, null}};
for (int index = 0; index < ranges.length; index++) {
int startPage = ranges[index][0];
Integer endPage = ranges[index][1];
if (startPage > totalPages) {
continue;
}
int effectiveEnd = endPage == null ? totalPages : Math.min(endPage, totalPages);
if (startPage > effectiveEnd) {
continue;
}
try (Document rangeDocument = new Document()) {
for (int pageNumber = startPage; pageNumber <= effectiveEnd; pageNumber++) {
rangeDocument.getPages().add(document.getPages().get_Item(pageNumber));
}
rangeDocument.save(outputDir.resolve(
"Range_" + (index + 1) + "_" + startPage + "_to_" + effectiveEnd + ".pdf").toString());
}
}
}
}
Разделение первой страницы и остальных страниц
Используйте этот подход, когда обложка должна быть экспортирована отдельно от остальной части документа.
- Откройте исходный PDF в объекте Document и подтвердите, что он содержит страницы.
- Создайте один выходной документ для первой страницы Page.
- Создайте другой документ для оставшегося диапазона страниц, когда доступно более одной страницы.
- Сохраните оба результата.
public static void splitDocumentsFirstPageAndRest(Path inputFile, Path outputDir) {
try (Document document = new Document(inputFile.toString())) {
int totalPages = document.getPages().size();
if (totalPages == 0) {
return;
}
try (Document firstPageDocument = new Document()) {
firstPageDocument.getPages().add(document.getPages().get_Item(1));
firstPageDocument.save(outputDir.resolve("First_Page.pdf").toString());
}
if (totalPages == 1) {
return;
}
try (Document remainingPagesDocument = new Document()) {
for (int pageNumber = 2; pageNumber <= totalPages; pageNumber++) {
remainingPagesDocument.getPages().add(document.getPages().get_Item(pageNumber));
}
remainingPagesDocument.save(outputDir.resolve("Remaining_Pages.pdf").toString());
}
}
}
Разделение последней страницы и предыдущих страниц
В этом примере последняя страница отделяется от остальной части документа, что полезно для извлечения страниц резюме или подписей.
- Откройте исходный PDF в объекте Document и проверьте, что он не пустой.
- Скопируйте последнюю страницу Page в новый выходной документ.
- Удалите эту страницу из исходного документа, если в нём остаются другие страницы.
- Сохраните последнюю страницу и остальные страницы как отдельные файлы.
public static void splitDocumentsLastPageAndRest(Path inputFile, Path outputDir) {
try (Document document = new Document(inputFile.toString())) {
int totalPages = document.getPages().size();
if (totalPages == 0) {
return;
}
try (Document lastPageDocument = new Document()) {
lastPageDocument.getPages().add(document.getPages().get_Item(totalPages));
lastPageDocument.save(outputDir.resolve("Last_Page.pdf").toString());
}
if (totalPages == 1) {
return;
}
document.getPages().delete(totalPages);
document.save(outputDir.resolve("Previous_Pages.pdf").toString());
}
}
Разделение PDF на три части
Используйте этот шаблон, когда документ должен быть разделён на три последовательных раздела примерно одинакового размера.
- Откройте исходный PDF в объекте Document и определите общее количество страниц.
- Вычислите приблизительный размер каждой части вывода.
- Создайте до трёх документов и скопируйте соответствующие диапазоны страниц Page.
- Сохраните каждую сгенерированную часть.
public static void splitDocumentsIntoThreeParts(Path inputFile, Path outputDir) {
try (Document document = new Document(inputFile.toString())) {
int totalPages = document.getPages().size();
if (totalPages == 0) {
return;
}
int partSize = Math.max(1, (totalPages + 2) / 3);
for (int partIndex = 0; partIndex < 3; partIndex++) {
int startPage = partIndex * partSize + 1;
int endPage = Math.min((partIndex + 1) * partSize, totalPages);
if (startPage > totalPages) {
break;
}
try (Document partDocument = new Document()) {
for (int pageNumber = startPage; pageNumber <= endPage; pageNumber++) {
partDocument.getPages().add(document.getPages().get_Item(pageNumber));
}
partDocument.save(outputDir.resolve("Three_Parts_" + (partIndex + 1) + ".pdf").toString());
}
}
}
}
Разделение PDF на пользовательские группы страниц
Этот пример показывает, как создавать выходные файлы из наборов страниц, не идущих последовательно, вместо непрерывных диапазонов.
- Откройте исходный PDF в объекте Document.
- Определите пользовательские группы номеров страниц Page.
- Создайте новый выходной документ для каждой группы и добавьте в него только корректные страницы из этой группы.
- Сохраните каждый непустой документ группы.
public static void splitDocumentsCustomPageGroups(Path inputFile, Path outputDir) {
try (Document document = new Document(inputFile.toString())) {
int totalPages = document.getPages().size();
List<List<Integer>> groups = List.of(
List.of(1, 2, 5),
List.of(3, 4, 6, 7));
int groupIndex = 1;
for (List<Integer> group : groups) {
try (Document groupDocument = new Document()) {
for (Integer pageNumber : group) {
if (pageNumber >= 1 && pageNumber <= totalPages) {
groupDocument.getPages().add(document.getPages().get_Item(pageNumber));
}
}
if (groupDocument.getPages().size() > 0) {
groupDocument.save(outputDir.resolve("Custom_Group_" + groupIndex + ".pdf").toString());
}
}
groupIndex++;
}
}
}
Разделение PDF на отдельные страницы со стабильными именами файлов
Используйте эту версию, когда имена выходных файлов должны оставаться лексически сортируемыми, например в автоматизированных конвейерах.
- Откройте исходный PDF в объекте Document.
- Создайте один выходной документ для каждой страницы Page.
- Сохраните каждый файл с номером страницы, дополненным нулями.
public static void splitDocumentsWithStableFilenames(Path inputFile, Path outputDir) {
try (Document document = new Document(inputFile.toString())) {
for (int pageNumber = 1; pageNumber <= document.getPages().size(); pageNumber++) {
try (Document newDocument = new Document()) {
newDocument.getPages().add(document.getPages().get_Item(pageNumber));
newDocument.save(outputDir.resolve(String.format("Page_%03d.pdf", pageNumber)).toString());
}
}
}
}
Разделение PDF на нечётные и чётные страницы
Этот пример создает два выходных файла, разделяя страницы в зависимости от чётности их номера.
- Откройте исходный PDF в объекте Document.
- Создайте один выходной документ для страниц Page с нечётными номерами и другой — для страниц с чётными номерами.
- Перебирайте исходные страницы с необходимым шагом для каждого выходного документа.
- Сохраните результаты нечётных и чётных страниц отдельно.
public static void splitDocumentsOddEvenPages(Path inputFile, Path outputDir) {
try (Document document = new Document(inputFile.toString())) {
int totalPages = document.getPages().size();
try (Document oddDocument = new Document()) {
for (int pageNumber = 1; pageNumber <= totalPages; pageNumber += 2) {
oddDocument.getPages().add(document.getPages().get_Item(pageNumber));
}
oddDocument.save(outputDir.resolve("Odd_Pages.pdf").toString());
}
try (Document evenDocument = new Document()) {
for (int pageNumber = 2; pageNumber <= totalPages; pageNumber += 2) {
evenDocument.getPages().add(document.getPages().get_Item(pageNumber));
}
evenDocument.save(outputDir.resolve("Even_Pages.pdf").toString());
}
}
}