Extrair SVG inline e externo de HTML em Java

Aspose.HTML for Java carrega uma página web em um HTMLDocument, permitindo que o aplicativo examine tanto a marcação SVG incorporada quanto os recursos SVG vinculados. Os gráficos inline aparecem como elementos <svg> no DOM, enquanto arquivos SVG externos podem ser referenciados por elementos como <img src="image.svg">.

Salve um gráfico inline gravando o valor de getOuterHTML() em um arquivo .svg. Para um gráfico externo, resolva sua URL relativa com base em document.getBaseURI(), solicite o recurso pelo serviço de rede do documento e salve os bytes retornados sem recodificá-los.


Salvar gráficos SVG encontrados em uma página web

O exemplo Java salva cada elemento <svg> inline e baixa arquivos SVG externos distintos referenciados por elementos <img>. Nomes separados facilitam a identificação dos dois tipos de origem no diretório de saída svg.

Extrair SVG de um site em 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++;
        }
    }
}

Etapas para extrair SVG em Java

  1. Carregue a página desejada com HTMLDocument .
  2. Colete os elementos <svg> inline com getElementsByTagName("svg") e grave o valor de getOuterHTML() de cada elemento como texto UTF-8.
  3. Colete os elementos <img> e leia seus atributos src não vazios.
  4. Resolva cada fonte relativa com Url e mantenha as URLs cujo caminho termina em .svg.
  5. Envie um RequestMessage para cada SVG externo e verifique o ResponseMessage .
  6. Salve cada resposta bem-sucedida como um arquivo .svg com Files.write().

SVG inline e SVG externo

Um SVG inline faz parte do DOM HTML. Sua marcação XML está disponível por meio do elemento <svg> correspondente e pode ser serializada com getOuterHTML().

Um SVG externo é um recurso separado referenciado por uma URL. O código baixa arquivos usados por elementos <img>; SVGs referenciados por outros elementos, CSS ou links de fragmento exigem seletores adequados a esses locais.

Leia Extract SVG From Website in Java para conhecer os fluxos documentados de SVG inline e externo.


Cuidados ao extrair SVG

  • Mantenha SVG inline e externo separados. O SVG inline é serializado a partir do DOM, enquanto um SVG externo é baixado como resposta de um recurso.
  • Use nomes de saída exclusivos. Vários gráficos inline não têm nome de arquivo original, e URLs externas diferentes podem compartilhar o mesmo segmento final de caminho.
  • Verifique cada resposta de recurso. Uma URL externa pode retornar uma página de erro, uma resposta de autenticação ou conteúdo indisponível em vez de dados SVG.
  • Planeje o processamento de grandes coleções. readAsByteArray() mantém cada resposta SVG externa na memória. Use uma estratégia de streaming quando uma página puder referenciar arquivos muito grandes ou muitos recursos.
  • Valide conteúdo não confiável. Trate SVG baixado como conteúdo ativo baseado em XML e examine scripts, links e referências externas antes de publicá-lo ou exibi-lo.
  • Respeite os direitos autorais e os termos do site. Extraia e reutilize apenas gráficos SVG que sejam seus ou para os quais você tenha autorização. O acesso público não concede permissão para redistribuir logotipos, ícones ou ilustrações protegidos.

FAQ

1. Por que algumas imagens SVG não podem ser baixadas diretamente de um site?

Muitos sites incorporam gráficos como elementos <svg> inline em vez de vinculá-los a arquivos .svg separados. Um SVG inline deve ser localizado no DOM HTML e salvo a partir da marcação retornada por getOuterHTML(), em vez de ser baixado por uma URL de recurso.

2. Como extrair arquivos SVG e ícones de uma página web em Java?

O Aspose.HTML for Java pode examinar as fontes SVG presentes em um documento carregado, mas nenhum seletor único abrange todos os locais possíveis. Verifique <svg> inline, <img src>, <object data>, <embed src>, url() do CSS e referências a sprites SVG conforme a forma como a página inclui seus gráficos.

3. A extração de SVG do HTML preserva a qualidade vetorial?

Salvar a marcação SVG inline ou os bytes originais de um SVG externo não rasteriza o gráfico, portanto seus caminhos vetoriais e dimensões escaláveis permanecem intactos. O arquivo salvo ainda pode ser renderizado de modo diferente se depender de CSS, fontes, imagens, scripts ou símbolos externos da página que não foram copiados.

4. O Aspose.HTML for Java pode extrair arquivos SVG de um site inteiro?

O Aspose.HTML for Java extrai SVG da página carregada em um HTMLDocument; ele não rastreia automaticamente todas as páginas de um domínio. Para processar um site inteiro, enumere as URLs de página permitidas, examine cada documento e elimine recursos SVG duplicados.


Instalar Aspose.HTML for Java

Adicione Aspose.HTML for Java a partir do repositório oficial da Aspose. Substitua ASPOSE_HTML_VERSION por uma versão exata disponível na página de releases do Aspose.HTML for Java e recarregue ou recompile o projeto para resolver a dependência.

Adicione o repositório e a dependência ao projeto 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>

Adicione o repositório e a dependência ao projeto Gradle:

Gradle – build.gradle

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

Use um JDK compatível com a versão selecionada. Para instalação manual do JAR, Kotlin DSL, atualizações e solução de problemas de dependência, consulte Install Aspose.HTML for Java .

Tarefas relacionadas de SVG e extração em Java

Continue com a extração de imagens, a página principal de extração de dados em Java ou exemplos de conversão de SVG.