Extraer datos vectoriales de un archivo PDF usando Java

Acceder a datos vectoriales de un documento PDF

Utilice GraphicsAbsorber para inspeccionar los elementos gráficos vectoriales en una página y escribir su geometría básica en un archivo de texto.

  1. Abra el PDF de origen en una instancia de Document.
  2. Cree un GraphicsAbsorber y visite el objetivo Page para recopilar operaciones de gráficos vectoriales.
  3. Itere a través de los extraídos GraphicElement objetos y lea sus colecciones de rectángulo, posición y operadores.
  4. Construya el texto de salida con detalles de geometría y recuento de operadores para cada elemento.
  5. Escriba los datos vectoriales extraídos en el archivo de salida.
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());
    }
}

Guardar gráficos vectoriales de la página en SVG

  1. Abra el PDF de origen en una instancia de Document.
  2. Obtenga el objetivo Page del documento.
  3. Llame page.trySaveVectorGraphics(outputFile.toString()) para exportar el contenido de gráficos vectoriales de esa página directamente a 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());
    }
}

Guardar cada elemento extraído en un SVG separado

  1. Abra el PDF de origen en una instancia de Document.
  2. Cree un GraphicsAbsorber y visite el objetivo Page.
  3. Cree el directorio de salida para los subcaminos extraídos antes de escribir cualquier archivo.
  4. Itere a través de los extraídos GraphicElement objetos y llamada saveToSvg(...) para cada elemento.
  5. Guarde cada elemento extraído en un archivo SVG separado.
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++;
        }
    }
}

Combinar los elementos extraídos en un solo SVG

  1. Abra el PDF de origen en una instancia de Document.
  2. Cree un GraphicsAbsorber y visite el objetivo Page.
  3. Cree el marcado contenedor SVG que contendrá los fragmentos vectoriales combinados.
  4. Itere a través de los extraídos GraphicElement objetos y agregue cada fragmento SVG generado.
  5. Escriba la salida SVG combinada en el archivo de destino.
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());
    }
}

Extraer un único elemento vectorial

  1. Abra el PDF de origen en una instancia de Document.
  2. Cree un GraphicsAbsorber y visite el objetivo Page.
  3. Obtenga lo requerido GraphicElement de la colección de elementos extraídos.
  4. Verifique si el elemento seleccionado es un XFormPlacement y descienda a sus elementos anidados cuando sea necesario.
  5. Guarde el elemento vectorial seleccionado en el archivo SVG de salida.
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());
            }
        }
    }
}