Манипулирование PDF-документами в Java

Aspose.PDF FOSS для Java предоставляет богатый набор API для манипулирования существующими PDF-документами — разделения, объединения, извлечения страниц, вставки диапазонов страниц и изменения размера содержимого внутри страниц. Эти возможности сосредоточены в PdfFileEditor и его сопутствующих классах ContentsResizeParameters и ContentsResizeValue.

PdfFileEditor: Основные операции со страницами

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

PdfFileEditor editor = new PdfFileEditor();
// Concatenate two documents into one
editor.concatenate("first.pdf", "second.pdf", "combined.pdf");
// Extract pages 2 through 5 to a new file
editor.extract("source.pdf", 2, 5, "extracted.pdf");

Ключевые методы включают:

  • concatenate(inputFiles, outputFile) — объединяет несколько документов в порядке
  • extract(inputFile, startPage, endPage, outputFile) — экспортирует непрерывный диапазон
  • extract(inputFile, pageNumbers, outputFile) — экспортирует несмежный набор
  • splitToPages(inputFile) — разбивает на один ByteArrayOutputStream на страницу
  • insert(inputFile, insertPosition, portFile, startPage, endPage, outputFile) — вставляет диапазон
  • delete(inputFile, pageNumbers, outputFile) — удаляет конкретные страницы
  • append(inputFile, portFile, startPage, endPage, outputFile) — добавляет диапазон страниц

Для больших файлов setUseDiskBuffer(true) переключает внутреннее хранилище с кучи на диск.

Изменение размера содержимого с помощью ContentsResizeParameters

PdfFileEditor.resizeContents() корректирует содержимое в пределах существующих границ страницы. Каждый отступ — слева, справа, сверху, снизу — а также ширина и высота содержимого задаются как экземпляры ContentsResizeValue, созданные с помощью фабричных методов ContentsResizeValue.percents(value) или ContentsResizeValue.units(value).

try (Document doc = new Document("input.pdf")) {
    PdfFileEditor editor = new PdfFileEditor();
    ContentsResizeParameters params = new ContentsResizeParameters(
        ContentsResizeValue.percents(10),   // left margin
        ContentsResizeValue.percents(80),   // content width
        ContentsResizeValue.percents(10),   // right margin
        ContentsResizeValue.percents(10),   // top margin
        ContentsResizeValue.percents(80),   // content height
        ContentsResizeValue.percents(10)    // bottom margin
    );
    editor.resizeContents(doc, params);
    doc.save("resized.pdf");
}

Шестипараметрический конструктор для ContentsResizeParameters принимает значения в следующем порядке: leftMargin, contentsWidth, rightMargin, topMargin, contentsHeight, bottomMargin. Все шесть должны в сумме составлять 100% при использовании процентных значений или соответствовать размерам страницы при использовании абсолютных значений в пунктах.

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

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

PdfFileEditor editor = new PdfFileEditor();
ContentsResizeParameters params = new ContentsResizeParameters(
    ContentsResizeValue.units(28),   // left margin in points
    ContentsResizeValue.units(540),  // content width
    ContentsResizeValue.units(28),   // right margin
    ContentsResizeValue.units(28),   // top margin
    ContentsResizeValue.units(786),  // content height
    ContentsResizeValue.units(28)    // bottom margin
);
// Only resize pages 1 and 3
editor.resizeContents(doc, new int[]{1, 3}, params);

ContentsResizeValue.getValue() и isPercent() позволяют просматривать сохранённое значение и определять, представляет ли оно собой процент или абсолютное количество пунктов.

Буклет и раскладка N-Up

PdfFileEditor включает makeBooklet() для размещения страниц в двухстороннем порядке буклета и makeNUp() для укладки нескольких страниц на лист. Оба метода принимают пути к файлам или потоки:

PdfFileEditor editor = new PdfFileEditor();
// Print as a folded booklet
editor.makeBooklet("input.pdf", "booklet.pdf");
// Tile 2 columns × 3 rows per sheet
editor.makeNUp("input.pdf", "nup.pdf", 2, 3);

PdfPageEditor: Управление масштабом для каждой страницы

PdfPageEditor нацеливается на отдельные свойства страниц, такие как уровень масштабирования. setZoom() принимает множитель типа float, который управляет начальным увеличением при открытии документа в просмотрщике:

PdfPageEditor pageEditor = new PdfPageEditor();
pageEditor.bindPdf("input.pdf");
pageEditor.setZoom(1.5f);
pageEditor.save("zoomed.pdf");

Значения 0.0 или отрицательные отклоняются — getZoom() возвращает 1.0 в этих случаях. Это делает PdfPageEditor подходящим для подготовки документов, которые должны открываться с определённым увеличением для целей доступности или отображения в киоске.

Начало работы

Добавьте зависимость Maven и импортируйте пакет facades:

<dependency>
  <groupId>org.aspose</groupId>
  <artifactId>aspose-pdf-foss</artifactId>
  <version>26.8.0</version>
</dependency>
import org.aspose.pdf.*;
import org.aspose.pdf.facades.*;

Aspose.PDF FOSS для Java имеет лицензию MIT и доступен по адресу https://github.com/aspose-pdf-foss/Aspose.PDF-FOSS-for-Java.

Связанные ресурсы