Java에서 HTML의 인라인 및 외부 SVG 추출
Aspose.HTML for Java
는 웹페이지를 HTMLDocument로 로드하여 애플리케이션이 포함된 SVG 마크업과 연결된 SVG 리소스를 모두 검사할 수 있도록 합니다. 인라인 그래픽은 DOM에서 <svg> 요소로 나타나며 외부 SVG 파일은 <img src="image.svg"> 같은 요소에서 참조할 수 있습니다.
인라인 그래픽은 getOuterHTML() 값을 .svg 파일에 기록하여 저장합니다. 외부 그래픽은 document.getBaseURI()를 기준으로 상대 URL을 해석하고 문서 네트워크 서비스를 통해 리소스를 요청한 뒤 반환된 바이트를 다시 인코딩하지 않고 저장합니다.
웹페이지에서 찾은 SVG 저장
이 Java 예제는 각 인라인 <svg> 요소를 저장하고 <img> 요소에서 참조하는 중복되지 않는 외부 SVG 파일을 다운로드합니다. 두 소스 유형에 서로 다른 이름을 사용하므로 svg 출력 디렉터리에서 쉽게 구분할 수 있습니다.
Java에서 웹사이트 SVG 추출
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++;
}
}
}
Java에서 SVG를 추출하는 단계
HTMLDocument로 대상 페이지를 로드합니다.getElementsByTagName("svg")로 인라인<svg>요소를 수집하고 각 요소의getOuterHTML()값을 UTF-8 텍스트로 기록합니다.<img>요소를 수집하고 비어 있지 않은src속성을 읽습니다.Url을 사용하여 각 상대 소스를 해석하고 경로가.svg로 끝나는 URL만 유지합니다.- 외부 SVG마다
RequestMessage를 보내고ResponseMessage를 확인합니다. - 성공한 각 응답을
Files.write()로.svg파일에 저장합니다.
인라인 SVG와 외부 SVG의 차이
인라인 SVG는 HTML DOM의 일부입니다. 해당 <svg> 요소에서 XML 마크업을 가져올 수 있으며 getOuterHTML()로 직렬화할 수 있습니다.
외부 SVG는 URL로 참조되는 별도의 리소스입니다. 이 코드는 <img> 요소에서 사용하는 파일을 다운로드합니다. 다른 요소, CSS 또는 프래그먼트 링크에서 참조하는 SVG에는 해당 위치에 맞는 선택자가 필요합니다.
인라인 및 외부 SVG 작업 방식은 Extract SVG From Website in Java 를 참조하세요.
SVG 추출 시 확인할 사항
- 인라인 SVG와 외부 SVG를 구분하세요. 인라인 SVG는 DOM에서 직렬화하고 외부 SVG는 리소스 응답으로 다운로드합니다.
- 고유한 출력 이름을 사용하세요. 인라인 그래픽에는 원래 파일 이름이 없으며 서로 다른 외부 URL이 같은 마지막 경로 부분을 가질 수 있습니다.
- 각 리소스 응답을 확인하세요. 외부 URL이 SVG 데이터 대신 오류 페이지, 인증 응답 또는 사용할 수 없는 콘텐츠를 반환할 수 있습니다.
- 대규모 컬렉션을 고려하세요.
readAsByteArray()는 각 외부 SVG 응답을 메모리에 버퍼링합니다. 페이지가 매우 큰 파일이나 많은 리소스를 참조할 수 있다면 스트리밍 방식을 사용하세요. - 신뢰할 수 없는 콘텐츠를 검증하세요. 다운로드한 SVG를 XML 기반 활성 콘텐츠로 취급하고 게시하거나 표시하기 전에 스크립트, 링크 및 외부 참조를 검토하세요.
- 저작권과 웹사이트 이용 약관을 준수하세요. 소유하고 있거나 사용 권한이 있는 SVG 그래픽만 추출하고 재사용하세요. 공개되어 있다는 이유만으로 보호된 로고, 아이콘 또는 일러스트레이션의 재배포가 허용되는 것은 아닙니다.
자주 묻는 질문
1. 일부 SVG 이미지를 웹사이트에서 직접 다운로드할 수 없는 이유는 무엇인가요?
많은 웹사이트는 별도의 .svg 파일에 연결하는 대신 그래픽을 인라인 <svg> 요소로 포함합니다. 인라인 SVG는 리소스 URL에서 다운로드하는 대신 HTML DOM에서 찾아 getOuterHTML() 마크업으로 저장해야 합니다.
2. Java에서 웹페이지의 SVG 파일과 아이콘을 추출하려면 어떻게 해야 하나요?
Aspose.HTML for Java는 로드된 문서의 SVG 참조를 검사할 수 있지만 하나의 선택자로 모든 위치를 처리할 수는 없습니다. 페이지에서 그래픽을 포함하는 방식에 따라 인라인 <svg>, <img src>, <object data>, <embed src>, CSS url() 값 및 SVG 스프라이트 참조를 확인하세요.
3. HTML에서 SVG를 추출해도 벡터 품질이 유지되나요?
인라인 SVG 마크업이나 외부 SVG의 원본 바이트를 저장해도 그래픽이 래스터화되지 않으므로 벡터 경로와 확장 가능한 크기가 유지됩니다. 다만 복사하지 않은 페이지 CSS, 글꼴, 이미지, 스크립트 또는 외부 심볼에 의존하면 저장된 파일의 렌더링 결과가 달라질 수 있습니다.
4. Aspose.HTML for Java로 웹사이트 전체의 SVG 파일을 추출할 수 있나요?
Aspose.HTML for Java는 HTMLDocument에 로드된 페이지에서 SVG를 추출하지만 도메인의 모든 페이지를 자동으로 크롤링하지는 않습니다. 웹사이트 전체를 처리하려면 허용된 페이지 URL을 나열하고 각 문서를 검사한 뒤 수집된 SVG 리소스의 중복을 제거하세요.
Aspose.HTML for Java 설치
Aspose 공식 리포지토리에서 Aspose.HTML for Java를 추가합니다. ASPOSE_HTML_VERSION을
Aspose.HTML for Java releases
페이지에 표시된 정확한 버전으로 바꾼 다음, 프로젝트를 다시 로드하거나 빌드하여 종속성을 확인합니다.
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>Gradle 프로젝트에 리포지토리와 종속성을 추가합니다.
Gradle – build.gradle
repositories {
maven {
url = uri('https://releases.aspose.com/java/repo/')
}
}
dependencies {
implementation 'com.aspose:aspose-html:ASPOSE_HTML_VERSION'
}선택한 릴리스와 호환되는 JDK를 사용하세요. JAR 수동 설치, Kotlin DSL, 업데이트 및 종속성 문제 해결은 Install Aspose.HTML for Java 를 참조하세요.
SVG 및 데이터 추출 관련 Java 작업
이미지 추출, Java 데이터 추출 개요 또는 SVG 변환 예제를 계속 살펴보세요.