# 1:1 打印一张 A4 图(PNG,整页 210x297 mm)—— 不经过 PDF 阅读器,比例由程序定死。 # powershell -ExecutionPolicy Bypass -File .claude\r2\print\print_1to1.ps1 -Image .claude\r2\print\blade_1to1.png [-Printer "EPSON3F4E59 (L4260 Series)"] # 做法:System.Drawing.Printing.PrintDocument,Graphics.PageUnit = 毫米,图画成 210x297 mm; # OriginAtMargins=false 时 Graphics 原点在「可打印区」左上角(硬边距处),所以再往回挪一个硬边距,让图的原点落在纸角上。 # ⚠ 打印机驱动里如果开了「缩放以适合页面 / 无边距放大」,还是会被缩 —— 打出来量标尺为准。 param([Parameter(Mandatory = $true)][string]$Image, [string]$Printer = '') Add-Type -AssemblyName System.Drawing $path = (Resolve-Path $Image).Path $img = [System.Drawing.Image]::FromFile($path) $pd = New-Object System.Drawing.Printing.PrintDocument if ($Printer) { $pd.PrinterSettings.PrinterName = $Printer } if (-not $pd.PrinterSettings.IsValid) { throw "打印机不可用: $($pd.PrinterSettings.PrinterName)" } $pd.DocumentName = 'PhoneRail blade 1to1' $a4 = $pd.PrinterSettings.PaperSizes | Where-Object { $_.Kind -eq [System.Drawing.Printing.PaperKind]::A4 } | Select-Object -First 1 if ($a4) { $pd.DefaultPageSettings.PaperSize = $a4 } $pd.DefaultPageSettings.Landscape = $false $pd.OriginAtMargins = $false $script:hm = $null $pd.add_PrintPage({ param($s, $e) $g = $e.Graphics $g.PageUnit = [System.Drawing.GraphicsUnit]::Millimeter $g.InterpolationMode = [System.Drawing.Drawing2D.InterpolationMode]::HighQualityBicubic $hx = $e.PageSettings.HardMarginX * 0.254 # 1/100 英寸 -> mm $hy = $e.PageSettings.HardMarginY * 0.254 $script:hm = "{0:N2} / {1:N2} mm" -f $hx, $hy $g.DrawImage($img, [single](-$hx), [single](-$hy), [single]210, [single]297) $e.HasMorePages = $false }) $pd.Print() $img.Dispose() "已提交打印:$($pd.PrinterSettings.PrinterName),纸 $($pd.DefaultPageSettings.PaperSize.PaperName),硬边距 $script:hm,图按 210x297 mm 画"