Extraire des données vectorielles à partir d'un fichier PDF à l'aide de Java

Accéder aux données vectorielles à partir d’un document PDF

Utilisez GraphicsAbsorber pour inspecter les éléments graphiques vectoriels sur une page et écrire leur géométrie de base dans un fichier texte.

  1. Ouvrez le PDF source dans une instance Document.

  2. Créez un GraphicsAbsorber et visitez la Page cible pour collecter les opérations graphiques vectorielles.

  3. Parcourez les objets GraphicElement extraits et lisez leurs collections de rectangles, de positions et d’opérateurs.

  4. Créez le texte de sortie avec les détails de la géométrie et du nombre d’opérateurs pour chaque élément.

  5. Écrivez les données vectorielles extraites dans le fichier de sortie.

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());
    }
}

Enregistrer les graphiques vectoriels de la page au format SVG

  1. Ouvrez le PDF source dans une instance Document.

  2. Obtenez la page cible Page du document.

  3. Appelez page.trySaveVectorGraphics(outputFile.toString()) pour exporter le contenu graphique vectoriel de cette page directement vers 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());
    }
}

Enregistrer chaque élément extrait dans un SVG distinct

  1. Ouvrez le PDF source dans une instance Document.

  2. Créez un GraphicsAbsorber et visitez la Page cible.

  3. Créez le répertoire de sortie pour les sous-chemins extraits avant d’écrire des fichiers.

  4. Parcourez les objets GraphicElement extraits et appelez saveToSvg(...) pour chaque élément.

  5. Enregistrez chaque élément extrait dans un fichier SVG distinct.

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++;
        }
    }
}

Combiner les éléments extraits en un seul SVG

  1. Ouvrez le PDF source dans une instance Document.

  2. Créez un GraphicsAbsorber et visitez la Page cible.

  3. Créez la structure du document SVG qui contiendra les fragments vectoriels combinés.

  4. Parcourez les objets GraphicElement extraits et ajoutez chaque fragment SVG généré.

  5. Écrivez la sortie SVG combinée dans le fichier cible.

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());
    }
}

Extraire un seul élément vectoriel

  1. Ouvrez le PDF source dans une instance Document.

  2. Créez un GraphicsAbsorber et visitez la Page cible.

  3. Obtenez le GraphicElement requis à partir de la collection d’éléments extraits.

  4. Vérifiez si l’élément sélectionné est un XFormPlacement et parcourez ses éléments imbriqués si nécessaire.

  5. Enregistrez l’élément vectoriel sélectionné dans le fichier SVG de sortie.

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());
            }
        }
    }
}