Ekstrak SVG Inline dan Eksternal dari HTML dengan Java

Aspose.HTML for Java memuat halaman web ke dalam HTMLDocument agar aplikasi dapat memeriksa markup SVG yang disematkan serta sumber daya SVG tertaut. Grafik inline muncul sebagai elemen <svg> dalam DOM, sedangkan file SVG eksternal dapat dirujuk oleh elemen seperti <img src="image.svg">.

Simpan grafik inline dengan menulis nilai getOuterHTML() ke file .svg. Untuk grafik eksternal, ubah URL relatif menjadi URL absolut berdasarkan document.getBaseURI(), minta sumber daya melalui layanan jaringan dokumen, lalu simpan byte yang dikembalikan tanpa mengodekannya ulang.


Simpan Grafik SVG yang Ditemukan di Halaman Web

Contoh Java menyimpan setiap elemen <svg> inline dan mengunduh file SVG eksternal unik yang dirujuk oleh elemen <img>. Nama terpisah memudahkan identifikasi kedua jenis sumber dalam direktori keluaran svg.

Ekstrak SVG dari Situs Web dengan Java

Path outputDirectory = Paths.get("svg");
Files.createDirectories(outputDirectory);

try (HTMLDocument document = new HTMLDocument("https://products.aspose.com/html/java/")) {
    // Save inline SVG elements as standalone files
    HTMLCollection inlineSvgElements = document.getElementsByTagName("svg");
    int inlineNumber = 1;

    for (Element svgElement : inlineSvgElements) {
        Path outputPath = outputDirectory.resolve("inline-" + inlineNumber + ".svg");
        byte[] svgMarkup = svgElement.getOuterHTML().getBytes(StandardCharsets.UTF_8);
        Files.write(outputPath, svgMarkup);
        inlineNumber++;
    }

    // Collect distinct external SVG sources from image elements
    HTMLCollection images = document.getElementsByTagName("img");
    Set<String> externalSources = new LinkedHashSet<>();

    for (Element image : images) {
        String source = image.getAttribute("src");
        if (source.isEmpty()) {
            continue;
        }

        Url resourceUrl = new Url(source, document.getBaseURI());
        if (resourceUrl.getPathname().toLowerCase().endsWith(".svg")) {
            externalSources.add(source);
        }
    }

    int externalNumber = 1;
    for (String source : externalSources) {
        Url resourceUrl = new Url(source, document.getBaseURI());
        RequestMessage request = new RequestMessage(resourceUrl);
        ResponseMessage response = document.getContext().getNetwork().send(request);

        if (response.isSuccess()) {
            Path outputPath = outputDirectory.resolve("external-" + externalNumber + ".svg");
            Files.write(outputPath, response.getContent().readAsByteArray());
            externalNumber++;
        }
    }
}

Langkah Mengekstrak SVG dengan Java

  1. Muat halaman tujuan dengan HTMLDocument .
  2. Kumpulkan elemen <svg> inline dengan getElementsByTagName("svg") , lalu tulis nilai getOuterHTML() setiap elemen sebagai teks UTF-8.
  3. Kumpulkan elemen <img> dan baca atribut src yang tidak kosong.
  4. Ubah setiap sumber relatif menjadi URL absolut dengan Url , lalu pertahankan URL yang path-nya berakhir dengan .svg.
  5. Kirim RequestMessage untuk setiap SVG eksternal dan periksa ResponseMessage .
  6. Simpan setiap respons yang berhasil sebagai file .svg dengan Files.write().

SVG Inline dan SVG Eksternal

SVG inline merupakan bagian dari DOM HTML. Markup XML-nya tersedia melalui elemen <svg> terkait dan dapat diserialisasi dengan getOuterHTML().

SVG eksternal adalah sumber daya terpisah yang dirujuk oleh URL. Kode mengunduh file yang digunakan elemen <img>. SVG yang dirujuk melalui elemen lain, CSS, atau tautan fragmen memerlukan selector yang sesuai dengan lokasi tersebut.

Baca Extract SVG From Website in Java untuk melihat alur kerja SVG inline dan eksternal dalam dokumentasi.


Hal Penting Saat Mengekstrak SVG

  • Pisahkan SVG inline dan eksternal. SVG inline diserialisasi dari DOM, sedangkan SVG eksternal diunduh sebagai respons sumber daya.
  • Gunakan nama keluaran yang unik. Grafik inline tidak memiliki nama file asli dan URL eksternal yang berbeda dapat memiliki segmen path terakhir yang sama.
  • Periksa setiap respons sumber daya. URL eksternal dapat mengembalikan halaman kesalahan, respons autentikasi, atau konten yang tidak tersedia, bukan data SVG.
  • Siapkan penanganan koleksi besar. readAsByteArray() menyimpan setiap respons SVG eksternal di memori. Gunakan strategi streaming jika halaman dapat merujuk file yang sangat besar atau banyak sumber daya.
  • Validasi konten yang tidak tepercaya. Perlakukan SVG yang diunduh sebagai konten aktif berbasis XML dan tinjau script, tautan, serta referensi eksternal sebelum menerbitkan atau menampilkannya.
  • Hormati hak cipta dan ketentuan situs web. Ekstrak dan gunakan kembali hanya grafik SVG milik Anda atau grafik yang boleh Anda akses. Ketersediaan publik tidak memberikan izin untuk mendistribusikan ulang logo, ikon, atau ilustrasi yang dilindungi.

Tanya Jawab

1. Mengapa beberapa gambar SVG tidak dapat diunduh langsung dari situs web?

Banyak situs web menyematkan grafik sebagai elemen <svg> alih-alih menautkan file .svg terpisah. SVG inline harus ditemukan dalam DOM HTML dan disimpan dari markup getOuterHTML(), bukan diunduh dari URL sumber daya.

2. Bagaimana cara mengekstrak file dan ikon SVG dari halaman web dengan Java?

Aspose.HTML for Java dapat memeriksa referensi SVG dalam dokumen yang dimuat, tetapi tidak ada satu selector yang mencakup semua lokasi. Periksa elemen <svg> inline, <img src>, <object data>, <embed src>, nilai CSS url(), dan referensi sprite SVG sesuai cara halaman menyertakan grafiknya.

3. Apakah ekstraksi SVG dari HTML mempertahankan kualitas vektor?

Menyimpan markup SVG inline atau byte asli SVG eksternal tidak merasterisasi grafik, sehingga path vektor dan kemampuan penskalaannya tetap dipertahankan. File yang disimpan tetap dapat dirender secara berbeda jika bergantung pada CSS halaman, font, gambar, script, atau simbol eksternal yang tidak disalin.

4. Dapatkah Aspose.HTML for Java mengekstrak file SVG dari seluruh situs web?

Aspose.HTML for Java mengekstrak SVG dari halaman yang dimuat ke HTMLDocument, tetapi tidak otomatis merayapi setiap halaman dalam suatu domain. Untuk memproses seluruh situs web, kumpulkan URL halaman yang diizinkan, periksa setiap dokumen, lalu hapus duplikat sumber daya SVG yang terkumpul.


Instal Aspose.HTML for Java

Tambahkan Aspose.HTML for Java dari repositori resmi Aspose. Ganti ASPOSE_HTML_VERSION dengan nomor versi yang tepat dari halaman rilis Aspose.HTML for Java , lalu muat ulang atau bangun ulang proyek agar dependensi dapat diselesaikan.

Tambahkan repositori dan dependensi ke proyek Maven:

Maven – pom.xml

<repositories>
    <repository>
        <id>AsposeJavaAPI</id>
        <url>https://releases.aspose.com/java/repo/</url>
    </repository>
</repositories>
<dependencies>
    <dependency>
        <groupId>com.aspose</groupId>
        <artifactId>aspose-html</artifactId>
        <version>ASPOSE_HTML_VERSION</version>
    </dependency>
</dependencies>

Tambahkan repositori dan dependensi ke proyek Gradle:

Gradle – build.gradle

repositories {
    maven {
        url = uri('https://releases.aspose.com/java/repo/')
    }
}
dependencies {
    implementation 'com.aspose:aspose-html:ASPOSE_HTML_VERSION'
}

Gunakan JDK yang kompatibel dengan rilis yang dipilih. Untuk instalasi JAR secara manual, Kotlin DSL, pembaruan, dan pemecahan masalah dependensi, lihat Install Aspose.HTML for Java .

Tugas Java Terkait SVG dan Ekstraksi

Lanjutkan dengan ekstraksi gambar, halaman utama ekstraksi data Java, atau contoh konversi SVG.