Inkscape: きれいな印刷なしで SVG ファイルを保存しますか?

Inkscape: きれいな印刷なしで SVG ファイルを保存しますか?

Powerpoint から作成した SVG ファイルがあり、これを Inkscape で編集したいと考えています。そのファイルを Inkscape で開いて変更せずに保存すると、ファイル サイズが 120kB から 170kB に増加します (Inkscape SVG ではなく、プレーン 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 は元のファイルとは少し異なる形式 (「プレーン」の場合でも.svg) でファイルを保存することがあるため、Inkscape で編集したファイルには若干のオーバーヘッドが適用される場合があります。

  • 先頭の空白などに関しては、.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選択する編集 → 空白操作 → 先頭スペースの削除先頭のスペースを削除するには、編集 → 行操作 → 空行を削除空白行を削除します。

  • 特定のディレクトリ内の1つ以上の.svgファイルに対して上記の操作を実行するスクリプトを書くこともできます。たとえば、次の短い例をご覧ください。Python3 について:

例: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++で上記の2つの手順を1つの操作で実行できます。編集 → 空白操作 → 不要な空白とEOLを削除(.svgファイルの内容をスペースを含む単一のテキスト文字列に変換します)。

タグ間のスペースも削除したい場合は、上記の Python スクリプトを使用して次のように変更します。

svg_contents.append(svg_line.lstrip())

ただ:

svg_contents.append(svg_line.strip())

ただし、この 2 番目のオプションでは、.svg各行が「完全な」要素で構成されていない場合、出力ファイルが正しくレンダリングされない (したがって読み取り不能になる) 可能性があることに注意してください (つまり、元のファイルの内容が、元の質問の望ましくない「要素リスト」ではなく、目的の内容のように見えることを<tag>確認してください)。.svg

関連情報