PowerShellでHTML内に画像を埋め込む

powershell コンピュータ
powershell

画像を含むWebページを単一のHTMLファイルとして保存することが出来そうなので試してみます。

<#
.SYNOPSIS
 要約
.DESCRIPTION
 説明
#>

param (
    $uriStr = "https://maywork.net/computer/ps-img-download/"
)

function GetBase64Image($uriStr)
{
    Write-Host $uriStr
    $respose = Invoke-WebRequest $uriStr

    $byte = $respose.Content
    [Convert]::ToBase64String($byte)
}

$respose = Invoke-WebRequest $uriStr

$html = $respose.ParsedHtml


$title = $html.title
$title = [RegEx]::Replace($title, "[\|\\\/\:\*\?\""\<\>]" , '')

$html.getElementsByTagName("img") | % {
    
    if ($_.src -and ([System.URI]::new($_.src).Scheme) -match "http(s)?") {
        $_.src = "data:image/png;base64," + (GetBase64Image $_.src)
    }
}



$htmlStr = "<!DOCTYPE html>" + $html.body.parentElement.outerHTML

# JavaScriptを削除
$htmlStr = $htmlStr -replace "<SCRIPT[.\s\S]*?/SCRIPT>", ""

# CSSを削除
$htmlStr = $htmlStr -replace "<STYLE[.\s\S]*?/STYLE>", ""


$enc = [System.Text.UTF8Encoding]::new($false)
Write-Host ".\${title}.html"
[System.IO.File]::WriteAllLines(".\${title}.html", $htmlStr, $enc)

imgエレメントのsrcプロパティにセットされている画像のアドレスから、画像をダウンロードしbase64でエンコードした文字列に置き換えています。

HTMLやMIME、文字コードの処理が雑なスクリプトであれですが、機能的にはスタイルシートの埋め込みがあればEvernoteのウェブクリップをローカルで保存するような代物が作れそうです。

雑な部分を真面目に作るのが大変なので作る予定は無いですが…と思ったら、PC版のGoogle ChromeでCtrl+Sを押し「ウェブページ、完全(.htm;.html)」で実現出来ますので作る必要はなさそうです。

追記20230403
・ファイル名をページのタイトルに変更。
・JavaScriptとCSSを削除

コメント