Объединение PDF-файлов в Java

Aspose.PDF for Java поддерживает несколько стратегий объединения в зависимости от того, как должен быть собран вывод.

Объединение двух PDF-документов

Используйте этот подход, когда вам нужен самый простой процесс объединения и вы хотите добавить один полный документ к другому.

  1. Откройте оба исходных PDF в объектах Document.
  2. Добавьте коллекцию страниц Page из второго документа в первый документ.
  3. Сохраните обновлённый PDF Document.
public static void mergeTwoDocuments(Path inputFile1, Path inputFile2, Path outputFile) {
    try (Document document1 = new Document(inputFile1.toString());
         Document document2 = new Document(inputFile2.toString())) {
        document1.getPages().add(document2.getPages());
        document1.save(outputFile.toString());
    }
}

Копирование выбранного диапазона страниц между документами

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

  1. Откройте или получите исходный и целевой PDF объекты Document.
  2. Ограничьте запрашиваемый диапазон страниц границами доступной коллекции Page.
  3. Добавьте каждую страницу из проверенного диапазона в целевой документ.
private static void appendPageRange(Document sourceDocument, Document destinationDocument, int startPage, int endPage) {
    int totalPages = sourceDocument.getPages().size();
    if (totalPages == 0) {
        return;
    }

    int start = Math.max(1, startPage);
    int end = Math.min(endPage, totalPages);
    if (start > end) {
        return;
    }

    for (int pageNumber = start; pageNumber <= end; pageNumber++) {
        destinationDocument.getPages().add(sourceDocument.getPages().get_Item(pageNumber));
    }
}

Объединение нескольких PDF-документов в один файл

Используйте этот шаблон, когда вам нужно объединить список входных файлов в один выходной документ последовательно.

  1. Создайте пустой выходной PDF Document.
  2. Откройте каждый входной файл по очереди и скопируйте весь диапазон его страниц Page в выходной документ.
  3. Сохраните объединённый результат после обработки всех исходных файлов.
public static void mergeMultipleDocuments(List<Path> inputFiles, Path outputFile) {
    try (Document outputDocument = new Document()) {
        for (Path inputFile : inputFiles) {
            try (Document sourceDocument = new Document(inputFile.toString())) {
                appendPageRange(sourceDocument, outputDocument, 1, sourceDocument.getPages().size());
            }
        }
        outputDocument.save(outputFile.toString());
    }
}

Объединение выбранных диапазонов страниц из двух документов

Этот пример создает пользовательский выходной файл, беря только определённые диапазоны страниц из каждого исходного документа.

  1. Откройте оба исходных PDF объекты Document и создайте новый выходной документ.
  2. Добавьте только необходимые диапазоны страниц Page из каждого исходного документа.
  3. Сохраните собранный выходной документ.
public static void mergeSelectedPageRanges(Path inputFile1, Path inputFile2, Path outputFile) {
    try (Document document1 = new Document(inputFile1.toString());
         Document document2 = new Document(inputFile2.toString());
         Document outputDocument = new Document()) {
        appendPageRange(document1, outputDocument, 1, 2);
        appendPageRange(document2, outputDocument, 2, 3);
        outputDocument.save(outputFile.toString());
    }
}

Вставка одного PDF‑документа в другой в определённую позицию

Используйте этот подход, когда один документ должен отображаться внутри другого, а не только до или после него.

  1. Откройте базовый и вставленный PDF объекты Document и создайте новый выходной документ.
  2. Скопируйте первый диапазон страниц Page базового документа, затем добавьте весь вставляемый документ и оставшийся диапазон страниц базового документа.
  3. Сохраните переупорядоченный результат в новый файл.
public static void mergeInsertDocumentAtPosition(Path inputFile1, Path inputFile2, int insertAfterPage, Path outputFile) {
    try (Document baseDocument = new Document(inputFile1.toString());
         Document insertDocument = new Document(inputFile2.toString());
         Document outputDocument = new Document()) {
        int baseTotalPages = baseDocument.getPages().size();
        int insertIndex = Math.max(0, Math.min(insertAfterPage, baseTotalPages));

        appendPageRange(baseDocument, outputDocument, 1, insertIndex);
        appendPageRange(insertDocument, outputDocument, 1, insertDocument.getPages().size());
        appendPageRange(baseDocument, outputDocument, insertIndex + 1, baseTotalPages);

        outputDocument.save(outputFile.toString());
    }
}

Объединение двух PDF-документов с чередованием страниц

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

  1. Откройте оба исходных PDF объекты Document и создайте новый выходной документ.
  2. Переберите максимальное доступное количество страниц и добавьте каждую доступную Page поочередно из первого и второго документов.
  3. Сохраните документ с чередующимся выводом.
public static void mergeAlternatingPages(Path inputFile1, Path inputFile2, Path outputFile) {
    try (Document document1 = new Document(inputFile1.toString());
         Document document2 = new Document(inputFile2.toString());
         Document outputDocument = new Document()) {
        int document1Pages = document1.getPages().size();
        int document2Pages = document2.getPages().size();
        int maxPages = Math.max(document1Pages, document2Pages);

        for (int pageNumber = 1; pageNumber <= maxPages; pageNumber++) {
            if (pageNumber <= document1Pages) {
                outputDocument.getPages().add(document1.getPages().get_Item(pageNumber));
            }
            if (pageNumber <= document2Pages) {
                outputDocument.getPages().add(document2.getPages().get_Item(pageNumber));
            }
        }

        outputDocument.save(outputFile.toString());
    }
}

Объединение документов с разделительными страницами и закладками

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

  1. Создайте пустой выходной PDF Document и откройте каждый исходный файл поочередно.
  2. Добавьте страницу-разделитель Page с заголовком, затем создайте закладку OutlineItemCollection для этого раздела.
  3. Добавьте исходные страницы, при желании добавьте закладку, указывающую на первую страницу содержимого, и сохраните окончательный объединённый документ.
public static void mergeWithSectionSeparatorsAndBookmarks(List<Path> inputFiles, Path outputFile) {
    try (Document outputDocument = new Document()) {
        int sectionIndex = 1;
        for (Path inputFile : inputFiles) {
            try (Document sourceDocument = new Document(inputFile.toString())) {
                int sourcePageCount = sourceDocument.getPages().size();

                Page separatorPage = outputDocument.getPages().add();
                separatorPage.getParagraphs().add(new TextFragment(
                        "Section " + sectionIndex + ": " + inputFile.getFileName()));

                OutlineItemCollection sectionBookmark = new OutlineItemCollection(outputDocument.getOutlines());
                sectionBookmark.setTitle("Section " + sectionIndex);
                sectionBookmark.setAction(new GoToAction(separatorPage));
                outputDocument.getOutlines().add(sectionBookmark);

                int firstContentPageNumber = outputDocument.getPages().size() + 1;
                appendPageRange(sourceDocument, outputDocument, 1, sourcePageCount);

                if (sourcePageCount > 0 && firstContentPageNumber <= outputDocument.getPages().size()) {
                    OutlineItemCollection contentBookmark = new OutlineItemCollection(outputDocument.getOutlines());
                    contentBookmark.setTitle("Section " + sectionIndex + " Content");
                    contentBookmark.setAction(new GoToAction(outputDocument.getPages().get_Item(firstContentPageNumber)));
                    sectionBookmark.add(contentBookmark);
                }
            }
            sectionIndex++;
        }

        outputDocument.save(outputFile.toString());
    }
}