【问题标题】:Copy SVG Images from Browser to Clipboard将 SVG 图像从浏览器复制到剪贴板
【发布时间】:2012-08-28 15:19:32
【问题描述】:

我正在开发一个 Web 应用程序,它接受用户输入、进行工程计算,然后显示格式化的报告或图形。这些图形是工程图,并不总是像饼图这样的标准图形。该应用程序的主要功能是使用户能够将这些图表从浏览器复制到 Word 或 Excel 文档中。

我必须选择使用客户端生成的 SVG 或服务器端生成的位图。我更喜欢 SVG 方法,并且原型设计看起来不错,但是,跨浏览器似乎对复制 SVG 图形的支持不一致,尤其是当图形显示在 div 中时(即整个页面不是 .svg)。例如,IE 在下拉列表中显示“复制”,但仅将 SVG 图形的一部分复制到剪贴板。如果我右键单击 SVG 图形,Chrome 不会提供任何复制选项。

如果我用 Google 搜索一下,我会惊讶地发现关于从 Web 应用程序获取 SVG 图像到剪贴板的问题的信息如此之少。

我对已解决此问题的读者的问题:

  1. 是否有一致的方法来获取作为 更大的 DOM 到剪贴板,最好使用 JavaScript;

  2. 鉴于我需要获取图形的任何其他建议 从浏览器到剪贴板?

【问题讨论】:

    标签: google-chrome svg clipboard


    【解决方案1】:

    不是将svg 显示为svg 元素,而是使用img 标签显示它。这有一些限制(您不能显示自定义字体或嵌入脚本,但似乎这不是您的用例)。好处是它的行为与您对图像的期望完全一样(您可以拖放、右键单击和复制等)。

    为此,您需要使用 base64 对其进行编码。你可以用js做服务器端或客户端。你的图片标签最终看起来像......

    <img src="data:image/svg;base64,R0lGODlhEAAQAMQAAORHHOVSKudfOulrSOp3WOyDZu6QdvCchPGolf" width="..." height="..." alt="diagram" />
    

    R0lGODlhEAAQAMQ... 是您的 base64 编码的 svg。

    【讨论】:

    • 感谢 Duopixel 的建议。这看起来可以解决我的问题。请给我一两天的时间来探索,如果它有效,我希望我会将您的建议标记为答案。感谢您抽出宝贵时间提供帮助!
    【解决方案2】:

    Javascript 和剪贴板是一个痛苦的 a**。

    据我所知,有一种针对您的情况的解决方法:

    如果是真正的 SVG 文件,在 Chrome 中,右键单击图像,然后选择“检查元素”。 浏览器控制台将打开,并且应该打开一个 SVG 元素,您可以在检查器中选择该元素。 右键单击检查器中的 svg 标签,然后选择“复制”或“复制为 HTML”(我不记得确切的选择)

    将该文本粘贴到文本文件中,然后使用 SVG 扩展名保存该文件。然后可以在任何浏览器或 SVG 编辑程序中打开它。 Inkscape 是编辑和调试的好选择,因为您可以在 XML 样式编辑器中查看和编辑整个 SVG 文件。

    **抱歉 - 我错过了您请求的第一部分。那会很棘手。恐怕我对那部分无能为力。不过,复制和粘贴可能不是您的最佳选择。有一些 PHP 类可以处理 SVG 和 Excel 文件,这很可能是要走的路。

    【讨论】:

    • 另外,您可以调查 raphael.js - raphaeljs.com。我以前没有使用过它,但它看起来可能可以解决您的问题,如果没有 - 肯定会为您提供使用 js 的其他选项。
    • 恐怕 Raphael 会将 OP 留在他现在所在的位置:一个他无法复制到剪贴板的 SVG 元素。
    • 感谢 user1167442 的建议。我认为它们都是有效的探索途径。但是,必须由用户进行复制和粘贴,并且由于他们只是工程师(开个玩笑),所以我真的不能要求他们更多,只能右键单击并选择复制。我将在下面查看 Duopixel 提供的答案。感谢您抽出宝贵时间提供帮助!
    【解决方案3】:

    我设法将 SVG 内容作为纯 XML 文本复制到剪贴板,但它对我来说似乎没用,因为 Inkscape(我用来处理 SVG)doesn't recognize the text in clipboard as SVG。看来复制 SVG 的文本是不够的,浏览器还应该将 mime-type 设置为 image/svg+xml。

    我用 HTML5 Clipboard API 尝试了几个技巧,但以 Chrome 无法将 mime-type 导出到系统剪贴板的问题结束。相关的错误报告和 jsfiddle 链接在这里https://code.google.com/p/chromium/issues/detail?id=504700

    【讨论】:

      【解决方案4】:

      我在一个项目中遇到了同样的问题。客户想要一个相当复杂的图表。我们决定使用 svg 来开发它。工作完美,但客户希望能够将图形下载为图片。在互联网上搜索后,我们找到了 saveSvgAsPng (https://www.npmjs.com/package/save-svg-as-png)。这对我们有用。

      图表在页面中是这样的:

      <svg id="graph1" style="width: 700px; height: 700px">
      ....
      .....
      ...
      </svg>
      

      图表已显示,但无法下载或复制。所以,这是我采取的步骤:

      1. 我安装了上面提到的包。
      <script src="/path/to/lib/save-svg-as-png/lib/saveSvgAsPng.js"></script>
      
      1. 在 svg 代码中添加了“display: none:”,否则我们将有两个相同图像的实例:
      <svg id="graph1" style="width: 700px; height: 700px; display: none">
      
       <!-- // code goes here  -->
      
      
      </svg>
      
      1. 在声明 svg 图之后,我直接添加了一个新图像。此图像是 svg 图像的新 png 图像表示的占位符。我先隐藏它,以防止图像在加载时闪烁。最初未指定来源:
      <img id="graph1_as_png" src="" width="700" height="700" style="display: none">
      
      1. 在新添加的图像之后,我添加了几行代码,用于转换技巧:
      <script>
      
          svgAsPngUri(document.getElementById("graph1")).then(uri => {
            $("#graph1_as_png").attr('src', uri).show();
          });
      
      </script>
      

      第二张图片的来源是 svg 的 BASE64 编码版本。转换后,显示图像。现在我们有了与 svg 图像完全相同的图像,但可以下载或复制图像。

      我希望这对你也有帮助..

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-20
        • 1970-01-01
        • 2021-01-14
        • 2023-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多