paper.js和Adobe Illustrator SVG:图层兼容性

时间:2019-06-25 15:36:12

标签: node.js svg layer adobe-illustrator paperjs

我正在使用paper.js(使用 paper-jsdom 包从node.js创建)创建SVG文件,并且我希望使其与Adobe Illustrator尽可能兼容。为了做到这一点,我尝试重新描述[here]中描述的步骤。但是然后,使用exportSVG函数导出到SVG中,我得到了完全不同的东西:

Both shapes are in the same layer, but in different groups

paper.js和AI之间的层兼容性似乎不再起作用。那么,我在这里错过了什么吗?是因为我的AI版本(CC 2018)吗?有办法绕过这个问题吗?

1 个答案:

答案 0 :(得分:2)

我认为Paper.js SVG导出与Illustrator图层模型不兼容。
您说这“似乎不再起作用”,但是您是否将其与Paper.js / AI的早期版本一起使用?
如果不是这样,我想您可能会对Paper.js文档中关于其共享层概念的类比感到困惑。
但这只是因为用户习惯了AI层,这使他们能够更好地了解Paper.js的工作原理。

从那时起,我很想知道AI如何在SVG导出后能够恢复其层,以查看您的情况是否有可能的解决方法。
AI项目导出为SVG时,可以选择是否“保留Illustrator编辑功能”。
如果您不这样做,则导出的SVG将如下所示:

<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 17.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN"
    "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" id="Calque_1" xmlns="http://www.w3.org/2000/svg"
     xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
     width="1137px" height="937px" viewBox="0 0 1137 937"
     enable-background="new 0 0 1137 937" xml:space="preserve">
<g id="Calque_1_1_">
    <circle fill="#FF0000" cx="380" cy="238" r="60"/>
</g>
<g id="Calque_2">
    <circle fill="#0000FF" cx="569" cy="468" r="60"/>
</g>
</svg>

但是,如果您尝试将此SVG加载回AI,则不会得到2层,而只会得到包含2组的一层(就像对Paper.js导出的SVG所做的那样)。

如果选中“保留Illustrator编辑功能”,则会得到非常不同的结果:

<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 17.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN"
    "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd" [
    <!ENTITY ns_extend "http://ns.adobe.com/Extensibility/1.0/">
    <!ENTITY ns_ai "http://ns.adobe.com/AdobeIllustrator/10.0/">
    <!ENTITY ns_graphs "http://ns.adobe.com/Graphs/1.0/">
    <!ENTITY ns_vars "http://ns.adobe.com/Variables/1.0/">
    <!ENTITY ns_imrep "http://ns.adobe.com/ImageReplacement/1.0/">
    <!ENTITY ns_sfw "http://ns.adobe.com/SaveForWeb/1.0/">
    <!ENTITY ns_custom "http://ns.adobe.com/GenericCustomNamespace/1.0/">
    <!ENTITY ns_adobe_xpath "http://ns.adobe.com/XPath/1.0/">
    ]>
<svg version="1.0" xmlns:x="&ns_extend;" xmlns:i="&ns_ai;"
     xmlns:graph="&ns_graphs;"
     xmlns="http://www.w3.org/2000/svg"
     xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="1137px"
     height="937px"
     viewBox="0 0 1137 937" enable-background="new 0 0 1137 937"
     xml:space="preserve">
<switch>
    <foreignObject requiredExtensions="&ns_ai;" x="0" y="0" width="1"
                   height="1">
        <i:pgfRef xlink:href="#adobe_illustrator_pgf">
        </i:pgfRef>
    </foreignObject>
    <g i:extraneous="self">
        <g id="Calque_1">
            <circle fill="#FF0000" cx="380" cy="238" r="60"/>
        </g>
        <g id="Calque_2">
            <circle fill="#0000FF" cx="569" cy="468" r="60"/>
        </g>
    </g>
</switch>
    <i:pgf id="adobe_illustrator_pgf">
    <![CDATA[
    ...(huge data skipped)
    ]]>
</i:pgf>
</svg>

这一次,如果将其重新加载到AI中,将按预期方式获得图层。
区别在于AI添加到SVG以便将其重新加载的所有元数据,最重要的是<i:pgf id="adobe_illustrator_pgf">元素。
thread讨论了Inskape上下文中的相同类型的问题,看来关键数据是一种只有AI才能读写的二进制数据。

不幸的是,最后我不认为您或Paper.js可以制作映射到AI内部图层模型的SVG文件。