Извлечение векторных данных из PDF‑файла с использованием Java

Получение доступа к векторным данным из PDF‑документа

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

  1. Откройте исходный PDF в экземпляре Document.
  2. Создайте GraphicsAbsorber и обработайте нужную страницу Page для сбора операций векторной графики.
  3. Переберите извлечённые объекты GraphicElement и прочитайте их прямоугольники, позиции и коллекции операторов.
  4. Сформируйте выходной текст с деталями геометрии и количеством операторов для каждого элемента.
  5. Запишите извлечённые векторные данные в выходной файл.
public static void extractGraphicsElements(Path inputFile, Path outputFile) throws Exception {
    try (Document document = new Document(inputFile.toString())) {
        GraphicsAbsorber absorber = new GraphicsAbsorber();
        absorber.visit(document.getPages().get_Item(1));

        StringBuilder text = new StringBuilder();
        int index = 1;
        for (GraphicElement element : absorber.getElements()) {
            text.append("Element ").append(index)
                    .append(": Rectangle = ").append(element.getRectangle())
                    .append(", Position = ").append(element.getPosition())
                    .append(", Operators = ").append(element.getOperators().size())
                    .append("\n");
            index++;
        }
        Files.writeString(outputFile, text.toString());
    }
}

Сохранение векторной графики страницы в SVG

  1. Откройте исходный PDF в экземпляре Document.
  2. Получите нужную страницу Page из документа.
  3. Вызовите page.trySaveVectorGraphics(outputFile.toString()) для экспорта векторного графического содержимого этой страницы непосредственно в SVG.
public static void saveVectorGraphicsToSvg(Path inputFile, Path outputFile) {
    try (Document document = new Document(inputFile.toString())) {
        Page page = document.getPages().get_Item(1);
        page.trySaveVectorGraphics(outputFile.toString());
    }
}

Сохранение каждого извлечённого элемента в отдельный SVG

  1. Откройте исходный PDF в экземпляре Document.
  2. Создайте GraphicsAbsorber и обработайте нужную страницу Page.
  3. Создайте директорию вывода для извлечённых подпутей перед записью любых файлов.
  4. Переберите извлечённые объекты GraphicElement и вызовите saveToSvg(...) для каждого элемента.
  5. Сохраните каждый извлечённый элемент в отдельный файл SVG.
public static void extractSubpathsToSvgs(Path inputFile, Path outputDir) throws Exception {
    try (Document document = new Document(inputFile.toString())) {
        GraphicsAbsorber absorber = new GraphicsAbsorber();
        absorber.visit(document.getPages().get_Item(1));
        Path subpathsDir = outputDir.resolve("subpaths");
        Files.createDirectories(subpathsDir);

        int index = 1;
        for (GraphicElement element : absorber.getElements()) {
            element.saveToSvg(subpathsDir.resolve("subpath_" + index + ".svg").toString());
            index++;
        }
    }
}

Объединение извлечённых элементов в один SVG

  1. Откройте исходный PDF в экземпляре Document.
  2. Создайте GraphicsAbsorber и обработайте нужную страницу Page.
  3. Создайте разметку-обёртку SVG, которая будет содержать объединённые векторные фрагменты.
  4. Переберите извлечённые объекты GraphicElement и добавьте каждый сгенерированный SVG‑фрагмент.
  5. Запишите объединённый SVG‑вывод в целевой файл.
public static void extractListOfElementsToSingleImage(Path inputFile, Path outputFile) throws Exception {
    try (Document document = new Document(inputFile.toString())) {
        GraphicsAbsorber absorber = new GraphicsAbsorber();
        absorber.visit(document.getPages().get_Item(1));

        StringBuilder svg = new StringBuilder();
        svg.append("<svg xmlns=\"http://www.w3.org/2000/svg\">\n");
        for (GraphicElement element : absorber.getElements()) {
            svg.append(element.saveToSvg()).append("\n");
        }
        svg.append("</svg>\n");
        Files.writeString(outputFile, svg.toString());
    }
}

Извлечение отдельного векторного элемента

  1. Откройте исходный PDF в экземпляре Document.
  2. Создайте GraphicsAbsorber и обработайте нужную страницу Page.
  3. Получите необходимый элемент GraphicElement из извлеченной коллекции элементов.
  4. Проверьте, является ли выбранный элемент XFormPlacement, и перейдите к его вложенным элементам, если это необходимо.
  5. Сохраните выбранный векторный элемент в выходной файл SVG.
public static void extractSingleVectorElement(Path inputFile, Path outputFile) {
    try (Document document = new Document(inputFile.toString())) {
        GraphicsAbsorber graphicsAbsorber = new GraphicsAbsorber();
        Page page = document.getPages().get_Item(1);
        graphicsAbsorber.visit(page);
        if (graphicsAbsorber.getElements().size() > 1) {
            GraphicElement xformPlacement = graphicsAbsorber.getElements().get_Item(1);
            if (xformPlacement instanceof XFormPlacement) {
                XFormPlacement placement = (XFormPlacement) xformPlacement;
                if (placement.getElements().size() > 2) {
                    placement.getElements().get_Item(2).saveToSvg(outputFile.toString());
                }
            } else {
                xformPlacement.saveToSvg(outputFile.toString());
            }
        }
    }
}