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 可能會以與原始格式略有不同的格式儲存檔案(即使使用「plain」.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您可以編寫一個腳本來對給定目錄中的一個或多個檔案執行上述操作。例如,一個簡短的例子蟒蛇3:

前任。減少_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文件內容看起來像您想要的內容,而不是您原來的問題中不需要的“元素列表”)。

相關內容