Public/System/ConvertTo-Image.ps1

function ConvertTo-Image {
    [CmdletBinding()]
    [CmdLetTag()]
    param (
        [parameter(Mandatory,ValueFromPipeline)]
        [string]$Text,
        [parameter(Mandatory)]
        [string]$OutputFile,
        [int]$Density=1200,
        [int]$Quality=100,
        [int]$MaximumSizeBytes,
        [int]$Width
    )
    
    begin {
        $PSCmdlet|Write-PSCmdLetBegin
        Install-Chocolatey
        if (!(Get-ChocoPackage imagemagick.app)){
            choco install imagemagick.app
        }
        $ImageMagick=Get-ChildItem ([System.Environment]::GetFolderPath([System.Environment+SpecialFolder]::ProgramFiles)) "ImageMagick*"|ForEach-Object{
            Get-ChildItem $_.FullName magick.exe
        }|Select-Object -First 1
        if (!(Get-ChocoPackage Ghostscript)){
            choco install Ghostscript
        }
        npm install -g pretty-markdown-pdf|Out-Null
        
    }
    
    process {
        $baseName=[System.IO.Path]::GetFileNameWithoutExtension($OutputFile)
        Push-Location $env:TEMP
        Remove-Item $baseName -Force -Recurse -ErrorAction SilentlyContinue
        New-Item $baseName -ItemType Directory
        Push-Location $baseName
        $mdFile=".\$baseName.md"
        Set-Content $mdFile $Text
        [PSCustomObject]@{
            width = $Width
            margin = "1cm"
            quality = $Quality
            omitBackground =$true
            highlight =$true
            includeDefaultStyles=$true
        }|ConvertTo-Json|Set-Content ".\$basename.json"
        Invoke-Script{pretty-md-pdf -i $mdFile -c ".\$basename.json"}
        $pdfName=".\$baseName.pdf"
        
        do {
            $jpgName=[guid]::NewGuid()
            Invoke-Script{& $ImageMagick -density $Density -quality $Quality $pdfName .\$jpgName.jpg }
            if ($Width){
                $bmp=[System.Drawing.Bitmap]::new((Get-Item .\$jpgName.jpg).FullName)
                if ($bmp.Width -gt $Width){
                    Invoke-Script{& $ImageMagick .\$jpgName.jpg -resize $Width ".\$jpgName.resized.jpg"}
                    $jpgName="$jpgName.resized"
                }
            }
            Invoke-Script{& $ImageMagick .\$jpgName.jpg -flatten -fuzz 1% -trim +repage ".\$jpgName.trim.jpg" }
            $jpgName="$jpgName.trim"
            Invoke-Script{
                & $ImageMagick ".\$jpgName.jpg" -border 2%x2% $OutputFile
            }
            $Density=0.9*$Density    
            $Quality=0.9*$Quality    
            
        } until (!$MaximumSizeBytes -or (([System.IO.File]::ReadAllBytes($OutputFile)).Length -lt $MaximumSizeBytes))
        Pop-Location
        Pop-Location
    }
    
    end {
        
    }
}