java - 在Java中读取SVG路径

标签 java parsing svg batik

我正在用 java 读取文本文件,其中使用扫描仪类读取 SVG 格式的文本。我看过推荐 batik 的答案。我想知道如何仅在 SVG 格式的路径数据上使用 Batik。我想评估路径并提取追踪路径的点。我可以使用 Batik 来执行此操作,而不必在 Batik 中评估整个文件吗?

我试图创建自己的路径解析器,但我没有足够的时间或技能来这样做。我正在通过使用 < and /> 分割 SVG 格式的标签来评估它们我一直在评估路径的 d 属性。以下是我需要评估的路径示例:

<html>
<body>

<svg width="10000" height="1000">
<path id="square" fill="#0000FF" 
d="M351.3,251 l-3.1-2.2c-0.3-0.2-0.3-0.5-0.1-0.8l2.2-3.1c0.2-0.3,0.5-0.3,0.8-0.1l3.1,2.2
c0.3,0.2,0.3,0.5,0.1,0.8l-2.2,3.1C355,251.1,354.6,251.2,354.3,251z"/>

</body>
</html>

我需要这条路径上的点。

最佳答案

使用 Batik 进行路径解析看起来相当简单:

看来您只需创建一个实现 PathHandler 接口(interface)的类即可。

class MyPathHandler implements PathHandler
{
  void  startPath() { ... }
  void  movetoAbs(float x, float y)
  ... etc...
  void  endPath() { ... }
}

然后执行:

  PathParser parser = new PathParser();
  parser.setPathHandler(new MyPathHandler());
  parser.parse("M351.3,251 l-3.1-2.2 ... snip ... C355,251.1,354.6,251.2,354.3,251z");
  parser.doParse();

每当 PathParser 遇到 M 命令等时,都会调用 moveToAbs() 方法。

如果这不起作用,那么我可以在大约一分钟的谷歌搜索中找到至少四到五个 Java 或 JS 中的 SVG 路径解析代码实例。

至于采样部分。这要棘手得多。您需要代码来测量二次和三次贝塞尔曲线以及圆弧的长度。后者可能涉及将弧 (A/a) 转换为中心参数化(规范中有关于如何执行此操作的信息)。完成这一切并非易事。如果你能在 Batik、Firefox、Chrome、Android 等中找到它,就会有它的代码。也许还有人已经构建的代码。

如果您在浏览器中执行此操作会很容易。此处已经提出了相关问题并得到了解答。

关于java - 在Java中读取SVG路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57388121/

相关文章:

java - Java ActiveRecord

java - Scanner#nextDouble 无法解析 5.2 (InputMismatchException)

java - 如何从文本文件的每一行中拆分出单独的列值?

c - 使用 strtok() 从字符串中解析标记

javascript - IE 11 "Crashes"使用动态 SVG 元素时

java - 用于移动属性的 XStream fromXML

java - 通知选项卡上的 Confluence Java 错误

javascript - 通过一个请求在 javascript 中接收多个响应

Flutter Svg 图像无法加载

javascript - Canvas - 元素叠加