Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 简化svg(删除viewBox属性)以获得纯svg路径_Javascript_Svg - Fatal编程技术网

Javascript 简化svg(删除viewBox属性)以获得纯svg路径

Javascript 简化svg(删除viewBox属性)以获得纯svg路径,javascript,svg,Javascript,Svg,我需要使用javascript在pdf文件的精确位置编写一些SVG。 我的webapp允许用户绘制他们的图形,然后我裁剪这些图形以删除未使用的空白并将其保存在pdf中。 裁剪svg会添加viewBox属性,而大多数js pdf库都不支持该属性。 这意味着位置和比例因子是错误的! 因此,我试图解决这个问题,在将svg放在pdf文件之前先简化它。 据我所知,很少有UTIL可以完成这项任务: svgcleaner 斯维戈 冲刷 不幸的是,它们都没有完全删除viewbox属性。 考虑到这个任务应该是

我需要使用javascript在pdf文件的精确位置编写一些SVG。 我的webapp允许用户绘制他们的图形,然后我裁剪这些图形以删除未使用的空白并将其保存在pdf中。 裁剪svg会添加viewBox属性,而大多数js pdf库都不支持该属性。 这意味着位置和比例因子是错误的! 因此,我试图解决这个问题,在将svg放在pdf文件之前先简化它。 据我所知,很少有UTIL可以完成这项任务:

  • svgcleaner
  • 斯维戈
  • 冲刷
不幸的是,它们都没有完全删除viewbox属性。 考虑到这个任务应该是完全自动化的,所以使用像UncScript或Adobe Idtualor之类的程序不是一个可能的解决方案。

< P>如我所说:


viewBox属性的值是由四个数字组成的列表:min-x、min-y、width和height。如果min-x=min-y=0,则可以使用其他两个数字作为svg元素的宽度和高度。但是,在裁剪svg元素时,min-x和min-y不会为0。这意味着您需要将所有内容包装在一个组中,并以相反的方向平移该组:-min-x&-min-y

或者,您可以首先将d属性转换为所有相对命令,而不是转换,您可以将第一次移动更改为(M)值,从而重新计算路径

请阅读我代码中的注释

//获取原始svg元素的viewBox并按空格或逗号将其拆分
让vb=original.getAttribute(“viewBox”).split(/[,]+/);
//console.log(vb);//["103", "118", "94", "83"]
//设置副本的宽度和高度
copy.setAttribute(“宽度”,vb[2]);
copy.setAttribute(“height”,vb[3]);
//获取原始文件的d属性
让path=document.querySelector(“原始路径”).getAttribute(“d”);
让pathRel=Snap.path.toRelative(路径);
//console.log(pathRel)
//更改第一个移动到命令的坐标
pathRel[0][1]=vb[0];
pathRel[0][2]=vb[1];
//用作复制路径的d属性的变量
让d=“”
pathRel.forEach(p=>{d+=(p.join(“”)})
//控制台日志(d)
//设置复制路径的d属性
document.querySelector(“复制路径”).setAttribute(“d”,d)
#原始{宽度:94px;}
svg{border:solid}

正如我所评论的:


viewBox属性的值是由四个数字组成的列表:min-x、min-y、width和height。如果min-x=min-y=0,则可以使用其他两个数字作为svg元素的宽度和高度。但是,在裁剪svg元素时,min-x和min-y不会为0。这意味着您需要将所有内容包装在一个组中,并以相反的方向平移该组:-min-x&-min-y

或者,您可以首先将d属性转换为所有相对命令,而不是转换,您可以将第一次移动更改为(M)值,从而重新计算路径

请阅读我代码中的注释

//获取原始svg元素的viewBox并按空格或逗号将其拆分
让vb=original.getAttribute(“viewBox”).split(/[,]+/);
//console.log(vb);//["103", "118", "94", "83"]
//设置副本的宽度和高度
copy.setAttribute(“宽度”,vb[2]);
copy.setAttribute(“height”,vb[3]);
//获取原始文件的d属性
让path=document.querySelector(“原始路径”).getAttribute(“d”);
让pathRel=Snap.path.toRelative(路径);
//console.log(pathRel)
//更改第一个移动到命令的坐标
pathRel[0][1]=vb[0];
pathRel[0][2]=vb[1];
//用作复制路径的d属性的变量
让d=“”
pathRel.forEach(p=>{d+=(p.join(“”)})
//控制台日志(d)
//设置复制路径的d属性
document.querySelector(“复制路径”).setAttribute(“d”,d)
#原始{宽度:94px;}
svg{border:solid}


viewBox属性的值是由四个数字组成的列表:min-x、min-y、width和height。如果min-x=min-y=0,则可以使用其他两个数字作为svg元素的宽度和高度。但是,在裁剪svg元素时,min-x和min-y不会为0。这意味着您需要将所有内容包装在一个组中,并以相反的方向转换组:-min-x&-min-yth这似乎是我唯一的选择!将所有内容包装在一个组中,希望svgcleaner或svgo可以删除trasform属性,重新正确计算路径坐标…如果您有路径,您可以首先将d属性转换为,而不是转换,您可以将第一个移动更改为(M)值,从而重新计算路径有趣,谢谢@enxaneta!我看到了codepen示例,但我不清楚它是如何工作的。你能给我解释一下吗?再次感谢viewBox属性的值是由四个数字组成的列表:min-x、min-y、width和height。如果min-x=min-y=0,则可以使用其他两个数字作为svg元素的宽度和高度。但是,在裁剪svg元素时,min-x和min-y不会为0。这意味着您需要将所有内容包装在一个组中,并以相反的方向转换组:-min-x&-min-yth这似乎是我唯一的选择!将所有内容包装在一个组中,希望svgcleaner或svgo可以删除trasform属性,重新正确计算路径坐标…如果您有路径,您可以首先将d属性转换为,而不是转换,您可以将第一个移动更改为(M)值,从而重新计算路径有趣,谢谢@enxaneta!我看到了codepen示例,但我不清楚它是如何工作的。你能给我解释一下吗?再次感谢