Inkscape:保存 svg 文件而不进行漂亮的打印?

Inkscape:保存 svg 文件而不进行漂亮的打印?

我有一个用 Powerpoint 创建的 SVG 文件,现在想在 Inkscape 中编辑。在 Inkscape 中打开并保存该文件时,未经修改,文件大小从 120kB 变为 170kB(我将其保存为普通 SVG,而不是 Inkscape SVG)。

据我所知,这是因为 Inkscape 生成的 SVG 打印得很漂亮,因此有很多无用的空白。有没有办法保存不带漂亮打印的 SVG 文件?

例如原始文件的这一部分:

<linearGradient x1="272" y1="618" x2="272" y2="643" gradientUnits="userSpaceOnUse" spreadMethod="reflect" id="fill25"><stop offset="0" stop-color="#D2D2D2"/><stop offset="0.5" stop-color="#C8C8C8"/><stop offset="1" stop-color="#C0C0C0"/></linearGradient>

另存为

<linearGradient
   id="fill1"
   spreadMethod="reflect"
   gradientUnits="userSpaceOnUse"
   y2="159"
   x2="272"
   y1="134"
   x1="272">
  <stop
     id="stop6277"
     stop-color="#D2D2D2"
     offset="0" />
  <stop
     id="stop6279"
     stop-color="#C8C8C8"
     offset="0.5" />
  <stop
     id="stop6281"
     stop-color="#C0C0C0"
     offset="1" />
</linearGradient>

答案1

有没有办法保存不带漂亮打印的 SVG 文件?

有需要注意的是,你可能需要看看XML 格式下的选项SVG 输出优先:

例如 XML 格式

Inkscape SVG 输出 XML 格式 - 屏幕截图

这些选项应该可以通过编辑 → 首选项 → 输入/输出 → SVG 输出 → XML 格式。 注意编辑 → 偏好设置也可通过Ctrl+ Shift+获得P(如所示)。

标记(以上)的选项Inline attributes应保留例如:

<linearGradient
   id="fill1"
   spreadMethod="reflect"
   gradientUnits="userSpaceOnUse"
   y2="159"
   x2="272"
   y1="134"
   x1="272">
  <stop
     id="stop6277"
     stop-color="#D2D2D2"
     offset="0" />
  <stop
     id="stop6279"
     stop-color="#C8C8C8"
     offset="0.5" />
  <stop
     id="stop6281"
     stop-color="#C0C0C0"
     offset="1" />
</linearGradient>

例如:

<linearGradient x1="272" y1="618" x2="272" y2="643" gradientUnits="userSpaceOnUse" spreadMethod="reflect" id="fill25"><stop offset="0" stop-color="#D2D2D2"/><stop offset="0.5" stop-color="#C8C8C8"/><stop offset="1" stop-color="#C0C0C0"/></linearGradient>

注意事项

  • 使用 Inkscape 编辑的文件可能仍会产生一些小的开销,这仅仅是因为 Inkscape 保存文件的格式可能与原始格式略有不同(即使是“普通”格式.svg)。

  • 关于前导空格等,“整个”.svg标签可以缩进以便于打印美观,例如:

    <g>
        <path fill="#FFFFFF" stroke="#F1F2F2" stroke-width="3" stroke-miterlimit="10" d="M314.267,104.257h-0.006H314.267z"/>
    

如果我没记错的话,调整Indent, spaces目前似乎对已经具有漂亮打印的文件(例如标签)没有任何影响.svg(即,似乎此选项仅适用于新文件)。

如果您想确保删除前导空格等,您可能应该使用文本编辑器或脚本手动删除它们。

  • 您可以使用文本编辑器,例如记事本++打开.svg文件并选择编辑 → 空白操作 → 修剪前导空格删除前导空格。您还可以使用编辑 → 行操作 → 删除空行删除所有空白行。

  • 您可以编写一个脚本来对给定目录中的一个或多个文件执行上述操作.svg。例如,Python 3

例如 reduce_svg_files.py

    # Remove leading spaces and blank lines from a set of text files (e.g. ".svg"
    # files) in a directory with Python.

    # Preserves '\n' (linefeed) line endings (for file size considerations) by
    # reading/writing files as "binary".

    # This script would be run in the same directory as the original files.


    # --- Imports ---

    import os
    import os.path
    import sys


    # --- Variables ---

    # Where are the original files located?
    root_dir = '.\\'

    # What is the directory/path to write any reduced files to?
    mini_directory_name = 'mini'
    mini_output_directory = os.path.join(root_dir, mini_directory_name)

    # What file extension should the script work with?
    ext = '.svg'

    # What suffix should be added to the end of any reduced files?
    mini_suffix = ' - mini'


    # --- Main ---

    try:

        # Create the directory specified by "mini_output_directory", as needed.
        os.makedirs(mini_output_directory, exist_ok=True)

        # Read the directory contents (files and folder names) of "root_dir".
        directory_items = os.listdir(root_dir)

        # For every directory item returned...
        for directory_item in directory_items:

            # If that item is a file that also ends with "ext"...
            if os.path.isfile(directory_item) and directory_item.endswith(ext):

                # Create a list to hold the reduced contents of the file.
                svg_contents = []

                # Read the contents of the original file.
                with open(directory_item, 'rb') as svg_file:

                    # For each line in the file...
                    for svg_line in svg_file:

                        # Remove any leading spaces, etc. with ".lstrip()" and
                        # store each "cleaned" line in svg_contents[] (from above).
                        svg_contents.append(svg_line.lstrip())

                    # Then...

                    # Remove the "ext" from the original file name by replacing it
                    # with "nothing".
                    mini_title = directory_item.replace(ext, '')

                    # Add "mini_suffix" and then the "ext" back to the stripped
                    # file name to create the name for the reduced file.
                    mini_file = mini_title + mini_suffix + ext

                    # Create the full path to where the reduced file should be
                    # stored.
                    mini_path = os.path.join(mini_output_directory, mini_file)

                # Write the reduced file to this path.
                with open(mini_path, 'wb') as mini_output_path:
                    mini_output_path.writelines(svg_contents)

    # If there is a problem working with the OS while running the script, catch any
    # error then quit.
    except OSError as err:

        print('')
        print(err)
        sys.exit()

请注意,上述两个选项都通过保留行尾来保留格式。正如您在评论中指出的那样,如果不关心行尾,您可以在 Notepad++ 中执行(大致)上述相同的两个步骤,只需执行一个操作即可编辑 → 空白操作 → 删除不必要的空白和 EOL(将任何.svg文件内容转换为带有空格的单个文本字符串)。

如果您还希望删除标签之间的空格,则可以使用上面的 Python 脚本并更改:

svg_contents.append(svg_line.lstrip())

只是:

svg_contents.append(svg_line.strip())

但是请注意,.svg如果每一行不包含“整个”<tag>元素(即,确保原始.svg文件内容看起来像您想要的内容,而不是原始问题中不需要的“元素列表”),则第二个选项可能会导致任何输出文件呈现不正确(从而无法读取)。

相关内容