Java使用不同方式解析SVG文件

使用不同方式解析SVG文件

  • 使用三种方式解析SVG文件
    • 一、Apache Batik
      • 导入坐标
      • 代码示例
    • 二、Jsoup
      • 导入坐标
      • 代码示例
    • 三、XML 解析器
      • 导入坐标
      • 代码示例
  • *查看SVG文件工具*
    • Inkscape

使用三种方式解析SVG文件

找了好久的SVG文件解析!

一、Apache Batik

这是一个广泛使用的工具,具有以下优点:

  1. 功能强大:提供了全面的 SVG 解析、渲染和处理功能。可以处理复杂的 SVG 图形,包括动画、滤镜等。
  2. 成熟稳定:经过多年的发展和使用,具有较高的稳定性和可靠性。
  3. 与其他技术集成方便:可以与 Java 应用程序很好地集成,适用于各种企业级应用开发。

导入坐标

<dependency><groupId>org.apache.xmlgraphics</groupId><artifactId>batik-transcoder</artifactId><version>1.14</version>
</dependency>

代码示例

二进制流处理

import org.apache.batik.dom.svg.SAXSVGDocumentFactory;
import org.apache.batik.util.XMLResourceDescriptor;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.svg.SVGDocument;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.ByteArrayInputStream;
import java.io.IOException;public class SVGParserFromBinaryStream {public static void main(String[] args) {byte[] svgBinaryData = getSVGBinaryData(); // 假设这是获取 SVG 文件二进制流的方法try {String parser = XMLResourceDescriptor.getXMLParserClassName();SAXSVGDocumentFactory factory = new SAXSVGDocumentFactory(parser);// 将二进制流转换为输入流ByteArrayInputStream bis = new ByteArrayInputStream(svgBinaryData);SVGDocument svgDocument = (SVGDocument) factory.createDocument(null, bis);Element svgRoot = svgDocument.getDocumentElement();String widthStr = svgRoot.getAttribute("width");String heightStr = svgRoot.getAttribute("height");double width = Double.parseDouble(widthStr);double height = Double.parseDouble(heightStr);System.out.println("SVG width: " + width);System.out.println("SVG height: " + height);// 校验尺寸逻辑,比如判断是否在特定范围内if (width > 100 && height > 100) {System.out.println("SVG dimensions are valid.");} else {System.out.println("SVG dimensions are not valid.");}} catch (IOException e) {e.printStackTrace();}}// 假设的获取 SVG 文件二进制流的方法private static byte[] getSVGBinaryData() {// 实际应用中,从数据源获取二进制流并返回return new byte[0];}
}

二、Jsoup

Jsoup 主要是用于 HTML 解析的库,对于 SVG 的解析可能不是最专业的工具,但在某些情况下可以满足基本需求。
需要注意,Jsoup 对于 SVG 的解析能力有限,可能无法处理复杂的 SVG 结构和特性。
2. 成熟稳定:经过多年的发展和使用,具有较高的稳定性和可靠性。
3. 与其他技术集成方便:可以与 Java 应用程序很好地集成,适用于各种企业级应用开发。

导入坐标

<dependency><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.15.4</version>
</dependency>

代码示例

二进制流处理

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;import java.io.ByteArrayInputStream;
import java.nio.charset.StandardCharsets;public class SVGParserWithJsoup {public static void main(String[] args) {byte[] svgBinaryData = getSVGBinaryData(); // 假设这是获取 SVG 文件二进制流的方法try {String svgContent = new String(svgBinaryData, StandardCharsets.UTF_8);Document doc = Jsoup.parse(new ByteArrayInputStream(svgContent.getBytes(StandardCharsets.UTF_8)), StandardCharsets.UTF_8.name(), "");Element svgElement = doc.selectFirst("svg");if (svgElement!= null) {String widthStr = svgElement.attr("width");String heightStr = svgElement.attr("height");double width = Double.parseDouble(widthStr);double height = Double.parseDouble(heightStr);System.out.println("SVG width: " + width);System.out.println("SVG height: " + height);// 校验尺寸逻辑,比如判断是否在特定范围内if (width > 100 && height > 100) {System.out.println("SVG dimensions are valid.");} else {System.out.println("SVG dimensions are not valid.");}} else {System.out.println("No SVG element found.");}} catch (Exception e) {e.printStackTrace();}}// 假设的获取 SVG 文件二进制流的方法private static byte[] getSVGBinaryData() {// 实际应用中,从数据源获取二进制流并返回return new byte[0];}
}

三、XML 解析器

如果对 SVG 的解析需求较为简单,可以使用通用的 XML 解析器,如 Java 中的 DOM、SAX 或 StAX 解析器:

  1. 灵活性高:可以根据具体需求选择不同的解析方式,适用于各种编程语言和环境。
  2. 轻量级:如果只需要提取 SVG 文件中的特定信息,而不需要完整的图形处理功能,XML 解析器可能是一个轻量级的选择。
  3. 与其他技术集成方便:可以与 Java 应用程序很好地集成,适用于各种企业级应用开发。

导入坐标

使用 Java 的 XML 解析功能通常不需要额外引入特定的 Maven 坐标,因为它是 Java 标准库的一部分。
但是,如果你的项目中使用了日志等其他功能,可能需要引入相应的依赖。例如,如果使用日志记录异常信息,可以引入 slf4j-api 和 slf4j-simple 的依赖:

<dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.32</version>
</dependency>
<dependency><groupId>org.slf4j</groupId><artifactId>slf4j-simple</artifactId><version>1.7.32</version>
</dependency>

代码示例

二进制流处理

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;import java.io.ByteArrayInputStream;
import java.nio.charset.StandardCharsets;public class SVGParserWithXMLParser {public static void main(String[] args) {byte[] svgBinaryData = getSVGBinaryData(); // 假设这是获取 SVG 文件二进制流的方法try {String svgContent = new String(svgBinaryData, StandardCharsets.UTF_8);DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();DocumentBuilder builder = factory.newDocumentBuilder();Document doc = builder.parse(new ByteArrayInputStream(svgContent.getBytes(StandardCharsets.UTF_8)));Element svgElement = doc.getDocumentElement();if ("svg".equals(svgElement.getTagName())) {String widthStr = svgElement.getAttribute("width");String heightStr = svgElement.getAttribute("height");double width = Double.parseDouble(widthStr);double height = Double.parseDouble(heightStr);System.out.println("SVG width: " + width);System.out.println("SVG height: " + height);// 校验尺寸逻辑,比如判断是否在特定范围内if (width > 100 && height > 100) {System.out.println("SVG dimensions are valid.");} else {System.out.println("SVG dimensions are not valid.");}} else {System.out.println("No SVG element found.");}} catch (Exception e) {e.printStackTrace();}}// 假设的获取 SVG 文件二进制流的方法private static byte[] getSVGBinaryData() {// 实际应用中,从数据源获取二进制流并返回return new byte[0];}
}

查看SVG文件工具

Inkscape

这是一个矢量图形编辑软件,但也可以用于查看和分析 SVG 文件:

  1. 可视化界面:对于需要直观查看 SVG 图形的用户非常有用。可以通过界面操作来检查图形的各个元素和属性。
  2. 支持多种格式转换:除了 SVG,还支持其他常见的图形格式,可以进行格式转换和编辑。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/52103.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

集团数字化转型方案(十二)

集团数字化转型方案致力于通过构建一个集成化的数字平台&#xff0c;全面应用大数据分析、人工智能、云计算和物联网等前沿技术&#xff0c;推动业务流程、管理模式和决策机制的全面升级。该方案将从业务流程的数字化改造开始&#xff0c;优化资源配置&#xff0c;提升运营效率…

yolov8 出现loss 为nan

原因&#xff1a; 混合精度训练是一种通过同时使用 FP16 和 FP32 精度来加速深度学习训练的技术。它可以在不损失模型性能的情况下,显著减少训练时间和内存使用。下面是关于混合精度训练的一些解释: 1. 原理 混合精度训练利用了 FP16 (16位浮点)和 FP32 (32位浮点)的不同特性。…

每日一题——贪心算法

860. 柠檬水找零 - 力扣&#xff08;LeetCode&#xff09; 这道题目乍一看可能没有什么头绪&#xff0c;但是当你仔细想想就会明白一个道理&#xff0c;那就是&#xff0c;《论电子支付的重要性》哈哈哈哈&#xff0c;言归正传&#xff0c;其实很简单无非就是找钱&#xff0c;…

Alembic:python中数据库迁移的瑞士军刀

Alembic 简介 Alembic 是由 SQLAlchemy 的创始人 Mike Bayer 设计的一个数据库迁移工具。它不仅支持自动迁移脚本生成&#xff0c;还允许开发者手动编辑迁移脚本来满足特定的需求。Alembic 通过提供一个环境来跟踪数据库模式的变更历史&#xff0c;确保数据库的版本与应用代码…

linux内核 时间同步机理分析笔记

1 内核时间管理的相关组件 1.1 clocksource 和 clock_event_device 1.1.1 简介 外部时钟设备的主要作用是提供精确的计时功能和定期产生中断的功能&#xff0c;内部把提供精确计时的功能抽象为clocksource对象&#xff0c;把定期产生中断的功能抽象为clock_event_device对象…

微信支付流程

1. 创建订单 请求创建订单的 API 接口&#xff1a;把 订单金额、收货地址、订单中包含的商品信息 发送到服务器服务器响应的结果&#xff1a;订单编号 2.订单预支付 请求订单预支付的 API 接口&#xff1a;把步骤1得到的 订单编号 发送到服务器服务器响应的结果&#xff1a;…

P9145 [THUPC 2023 初赛] 世界杯

[题目通道]([THUPC 2023 初赛] 世界杯 - 洛谷) 简要题意&#xff1a;输出五常中的最强球队。 众所周知&#xff0c;每个国家的球队都有自己的长处&#xff0c;在不同规则下最强球队也有所不同。而小 M 制定的规则是输球场数最少&#xff0c;这是有道理的&#xff0c;因为输球…

《黑神话:悟空》全网互动量超1.8亿,百万天命人重走西游

四年磨一剑&#xff0c;一剑破长空。 8月20日10点&#xff0c;《黑神话&#xff1a;悟空》正式开服&#xff0c;同时轰动了国内外游戏圈子&#xff0c;冲顶国内各大社媒平台&#xff0c;一天包揽120个热搜。上线之后&#xff0c;《黑神话&#xff1a;悟空》火速登顶Steam热销游…

网络通信编程UDP/TCP

一、不同体系结构间的互联互通 通信本质&#xff1a;不同主机上进程间的通信。通过 IP 标识网络中的一台主机&#xff0c;本质上是 32 位的整型数据&#xff1b;通过端口号标识某个进程&#xff0c;本质上是 16 位的整型数据。网络模型&#xff1a;主要有 C/S&#xff08;客户…

克服编程学习中的挫折感:从心态到策略的全方位指南

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《热点时事》 期待您的关注 目录 引言 一、心态调整&#xff1a;积极乐观&#xff0c;合理期望 二、学习方法&#xff1a;有效策…

一起学Java(3)-Java项目构建工具Gradle和Maven场景定位和优缺点对比

在第一步创建的项目&#xff08;java-all-in-one&#xff09;项目里&#xff0c;我们提到了使用Gradle作为项目构建工具。看到这里&#xff0c;不知道你是否有疑惑&#xff0c;什么是项目构建工具。Java项目常用构建工具有哪些&#xff1f;都有什么特点&#xff1f; 带着疑惑&…

【教程】Ubuntu给pycharm添加侧边栏快捷方式

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 以下教程不仅限于pycharm&#xff0c;其他软件也是一样操作 1、进入到pycharm的目录&#xff0c;先通过命令行打开pycharm&#xff1a; ./bin/pycharm…

ETL开发团队应对突发技术故障和危机的策略

建立有效的监控和警报系统 首先&#xff0c;建立有效的监控和警报系统是应对突发技术故障和危机的重要步骤。通过监控ETL流程和相关系统的关键指标&#xff0c;例如数据传输速度、资源利用率和错误日志&#xff0c;您可以提前发现潜在的问题。设置警报机制&#xff0c;及时通知…

[Leetcode 61][Medium]-旋转链表

目录 一、题目描述 二、整体思路 三、代码 一、题目描述 原题链接 二、整体思路 首先发现这样的规律&#xff1a;当k大于等于链表中节点总数n时&#xff0c;会发现此时旋转后的链表和kk%n时的旋转后的链表一样。同时对于特殊情况n0和n1时&#xff0c;无论k的值为多少都可以…

C程序设计——常量后缀

本节内容&#xff0c;如果感觉学的比较吃力&#xff0c;可以最后再翻回来看。 上一节&#xff0c;我们讲了两种常量&#xff0c;在这里我个人给他们起名字&#xff0c;分别叫做数值常量、名称常量。 下面这些是数值常量&#xff1a; // 下面是数值常量 987; 0123; 0xba9; 6.…

关于HTTP HEAD介绍

一、HTTP HEAD介绍 HTTP HEAD 是一种 HTTP 请求方法&#xff0c;它用于请求服务器返回指定资源的元信息&#xff08;metadata&#xff09;&#xff0c;而不包括响应体的内容。这种请求方式常用于客户端预先评估资源的大小、最后修改日期或其他头信息&#xff0c;而无需实际下载…

论文翻译:Universal and Transferable Adversarial Attacks on Aligned Language Models

Universal and Transferable Adversarial Attacks on Aligned Language Models https://arxiv.org/pdf/2307.15043v2 通用且可转移的对抗性攻击对齐语言模型 文章目录 通用且可转移的对抗性攻击对齐语言模型摘要1 引言2 一个针对LLMs的通用攻击2.1 产生肯定回应2.2 贪婪坐标梯…

Prometheus Alertmanager告警之邮件、钉钉群、企业微信群机器人报警

文章目录 一、部署alertmanager相关组件1.alertmanager-config2.alertmanager-message-tmpl3.alertmanager 二、调试邮件告警三、钉钉群/企业微信群 报警3.1添加钉钉群机器人3.2添加企业微信群机器人3.3部署alertmanager-webhook-adaptermessage-tmplalertmanager-webhook-adap…

Vue组件命名报错 Component name “index“ should always be multi-word

原因 在Vue创建组件时我们往往会使用 index.vue 之类来命名&#xff0c;但是此时组件会报错【Component name "index" should always be multi-word】&#xff0c;组件名应该总是为多个单词组成。这是因为官方文档建议组件名写成驼峰式或者-衔接的形式&#…

【PHP入门教程】PHPStudy环境搭建+HelloWorld运行

文章目录 PHP 的历史PHP 的用途PHP 的特点和优势PHP 环境搭建环境准备安装window 安装CentOS / Ubuntu / Debian 安装 第一个Hello World使用Apache服务运行命令行运行代码 PHP 的历史 PHP&#xff08;Hypertext Preprocessor&#xff09;超文本预处理器是一种开源的通用脚本语…