eight判を使わないでデータ印をクリップボードに出力する

2024年9月13日

SVG を使うとテキストをセットしたり画像をセットしたり図形をセットしたりすることが可能なので処理を作ればバッチファイルで出力が可能です

SVG ファイルは テキストエディターで編集が可能ですがinkscapeこれを使うと視覚的に作成が可能です。日付を変更できるようプログラムを作りましたのでよろしければお使いください

また作成した SVG ファイルを読み込んで 文字列を置換した後 emf ファイルに変換する方法もあります。

タムラカイ氏が作った感情表現記法の「エモグラフィ®️」、報告資料などに張り付けてみるの面白そうですね。

バッチファイル

echo e %*
@powershell -Command  "& (Invoke-Expression -Command ('{' + (Get-Content %~f0 | Where-Object {$_.readcount -gt 3}| Out-String )+ '}'))" %*
timeout /t 5&goto:eof


# C# コード部分を定義
$cSource = @'
using System;
using System.Drawing.Imaging;
using System.Runtime.InteropServices;

public class ClipboardHelper
{
    private const int CF_ENHMETAFILE = 14;

    [DllImport("user32.dll")]
    private static extern bool OpenClipboard(IntPtr hWndNewOwner);

    [DllImport("user32.dll")]
    private static extern bool EmptyClipboard();

    [DllImport("user32.dll")]
    private static extern IntPtr SetClipboardData(int uFormat, IntPtr hWnd);

    [DllImport("user32.dll")]
    private static extern int CloseClipboard();

    public static void SetEmfToClipboard(string path)
    {
        using (Metafile metaFile = new Metafile(path))
        {
            // メタファイルのハンドルを取得
            IntPtr hMetaFile = metaFile.GetHenhmetafile();

            // クリップボードを開く
            OpenClipboard(IntPtr.Zero);

            // クリップボードを空にする
            EmptyClipboard();

            // EMF ファイルをクリップボードに設定
            SetClipboardData(CF_ENHMETAFILE, hMetaFile);

            // クリップボードを閉じる
            CloseClipboard();
        }
    }
}
'@
# 
$Date = Get-Date -Format "yyyy/MM/dd"



$svg = 
@"
<svg xmlns="http://www.w3.org/2000/svg"
     xmlns:xlink="http://www.w3.org/1999/xlink"
     viewBox="0 0 120 120" width="100" height="100">

<circle cx="54" cy="54" r="50" fill="none" stroke="black" id="textpath"/>
<line x1="6" y1="41" x2="102" y2="41" stroke="red" />
<line x1="6" y1="67" x2="102" y2="67" stroke="red" />

<text x="30" y="34"
      font-family="MS Mincho" font-weight="normal"
      font-size="20" font-style="normal"
      text-decoration="none" fill="#c44">
  所 属
</text>
<text x="30" y="90"
      font-family="MS Mincho" font-weight="normal"
      font-size="20" font-style="normal"
      text-decoration="none" fill="#c44">
  名 前
</text>
<text x="8" y="60"
      font-family="MS Mincho" font-weight="normal"
      font-size="18" font-style="normal"
      text-decoration="none" fill="#c84">
  $Date
</text>
<text font-size="10" dy="-5">
  <textPath xlink:href="#textpath">
    パス上にテキストを描画
  </textPath>
</text>

</svg>
"@

$path = "y:\temp\a.svg"
$path2 = "y:\temp\a2.svg"
$path3 = "y:\temp\a2.emf"
Set-Content $path $svg
Write-Host $svg
Write-Host $path2

Get-Content  -Encoding Default  $path | Out-File $path2 -Encoding utf8
D:\app2\inkscape\bin\inkscape.com $path2 --export-type=emf $path2.emf

# EMFファイルのパス


$emfPath = $path3
# C# クラスをPowerShellに組み込む
Add-Type -TypeDefinition $cSource -ReferencedAssemblies System.Drawing,System.Windows

# EMFファイルをクリップボードに設定
[ClipboardHelper]::SetEmfToClipboard($emfPath)

# メッセージを表示

Write-Host "EMFファイルがクリップボードにコピーされました。"

# スクリプトが終了する前に待機
Start-Sleep -s 5

ファイルを読むバッチファイル

echo e %*
@powershell -Command  "& (Invoke-Expression -Command ('{' + (Get-Content %~f0 | Where-Object {$_.readcount -gt 3}| Out-String )+ '}'))" %*
timeout /t 5&goto:eof


# C# コード部分を定義
$cSource = @'
using System;
using System.Drawing.Imaging;
using System.Runtime.InteropServices;

public class ClipboardHelper
{
    private const int CF_ENHMETAFILE = 14;

    [DllImport("user32.dll")]
    private static extern bool OpenClipboard(IntPtr hWndNewOwner);

    [DllImport("user32.dll")]
    private static extern bool EmptyClipboard();

    [DllImport("user32.dll")]
    private static extern IntPtr SetClipboardData(int uFormat, IntPtr hWnd);

    [DllImport("user32.dll")]
    private static extern int CloseClipboard();

    public static void SetEmfToClipboard(string path)
    {
        using (Metafile metaFile = new Metafile(path))
        {
            // メタファイルのハンドルを取得
            IntPtr hMetaFile = metaFile.GetHenhmetafile();

            // クリップボードを開く
            OpenClipboard(IntPtr.Zero);

            // クリップボードを空にする
            EmptyClipboard();

            // EMF ファイルをクリップボードに設定
            SetClipboardData(CF_ENHMETAFILE, hMetaFile);

            // クリップボードを閉じる
            CloseClipboard();
        }
    }
}
'@
# 
$Date = Get-Date -Format "yyyy/MM/dd"




$path = "y:\temp\a.svg"
$path2 = "y:\temp\a2.svg"
$path3 = "y:\temp\a2.emf"
$path4 = "D:\app2\VSCode\svg\#b.svg"

Write-Host $path2
(Get-Content $path4) | %{ $_ -replace '2024/09/01',$Date} | set-content $path
Get-Content  -Encoding Default  $path | Out-File $path2 -Encoding utf8
D:\app2\inkscape\bin\inkscape.com $path2 --export-type=emf $path2.emf

# EMFファイルのパス


$emfPath = $path3
# C# クラスをPowerShellに組み込む
Add-Type -TypeDefinition $cSource -ReferencedAssemblies System.Drawing,System.Windows

# EMFファイルをクリップボードに設定
[ClipboardHelper]::SetEmfToClipboard($emfPath)

# メッセージを表示

Write-Host "EMFファイルがクリップボードにコピーされました。"

# スクリプトが終了する前に待機
Start-Sleep -s 5

SVG ファイル

本来は UTF 8で保存するのですが 今回は 変換の処理を入れているのでシフト JIS で大丈夫です

UTF 8で保存する場合は 文字コード変換処理を取ってください

<svg xmlns="http://www.w3.org/2000/svg"
     xmlns:xlink="http://www.w3.org/1999/xlink"
     viewBox="0 0 120 120" width="100" height="100">

<circle cx="54" cy="54" r="50" fill="none" stroke="black" id="textpath"/>
<line x1="6" y1="41" x2="102" y2="41" stroke="red" />
<line x1="6" y1="67" x2="102" y2="67" stroke="red" />

<text x="30" y="34"
      font-family="MS Mincho" font-weight="normal"
      font-size="20" font-style="normal"
      text-decoration="none" fill="#c44">
  所 属
</text>
<text x="30" y="90"
      font-family="MS Mincho" font-weight="normal"
      font-size="20" font-style="normal"
      text-decoration="none" fill="#c44">
  名 前
</text>
<text x="8" y="60"
      font-family="MS Mincho" font-weight="normal"
      font-size="18" font-style="normal"
      text-decoration="none" fill="#c84">
  2024/09/01
</text>
<text font-size="10" dy="-5">
  <textPath xlink:href="#textpath">
    パス上にテキストを描画
  </textPath>
</text>

</svg>

参考

PowerPointに張り付けられるエモグラフィの作り方 #PowerShell – Qiita

PowerShellのバージョンによるEncodingの違い #encoding – Qiita

bat,PowerShell ,windows

Posted by eightban