Mengekstrak data vektor dari file PDF menggunakan Java

Mengakses data vektor dari dokumen PDF

Gunakan GraphicsAbsorber untuk memeriksa elemen grafik vektor pada sebuah halaman dan menulis geometri dasar mereka ke file teks.

  1. Buka PDF sumber dalam sebuah instans Document.
  2. Buat sebuah GraphicsAbsorber dan kunjungi Page target untuk mengumpulkan operasi grafik vektor.
  3. Iterasikan melalui objek GraphicElement yang diekstrak dan membaca koleksi persegi panjang, posisi, dan operator mereka.
  4. Bangun teks keluaran dengan detail geometri dan hitungan operator untuk setiap elemen.
  5. Tuliskan data vektor yang diekstrak ke file keluaran.
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());
    }
}

Menyimpan grafik vektor halaman ke SVG

  1. Buka PDF sumber dalam sebuah instans Document.
  2. Dapatkan Page target dari dokumen.
  3. Panggil page.trySaveVectorGraphics(outputFile.toString()) untuk mengekspor konten grafik vektor dari halaman itu langsung ke 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());
    }
}

Menyimpan setiap elemen yang diekstrak ke file SVG terpisah

  1. Buka PDF sumber dalam sebuah instans Document.
  2. Buat sebuah GraphicsAbsorber dan kunjungi Page target.
  3. Buat direktori output untuk subpath yang diekstrak sebelum menulis file apa pun.
  4. Iterasikan melalui objek GraphicElement yang diekstrak dan panggilan saveToSvg(...) untuk setiap elemen.
  5. Simpan setiap elemen yang diekstrak ke file SVG terpisah.
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++;
        }
    }
}

Menggabungkan elemen yang diekstrak menjadi satu SVG

  1. Buka PDF sumber dalam sebuah instans Document.
  2. Buat sebuah GraphicsAbsorber dan kunjungi Page target.
  3. Buat markup pembungkus SVG yang akan berisi fragmen vektor yang digabungkan.
  4. Iterasikan melalui objek GraphicElement yang diekstrak dan tambahkan setiap fragmen SVG yang dihasilkan.
  5. Tuliskan output SVG yang digabungkan ke file target.
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());
    }
}

Mengekstrak satu elemen vektor

  1. Buka PDF sumber dalam sebuah instans Document.
  2. Buat sebuah GraphicsAbsorber dan kunjungi Page target.
  3. Dapatkan yang diperlukan GraphicElement dari koleksi elemen yang diekstrak.
  4. Periksa apakah elemen yang dipilih adalah XFormPlacement dan turun ke elemen bersarangnya bila diperlukan.
  5. Simpan elemen vektor yang dipilih ke file SVG output.
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());
            }
        }
    }
}