Как распечатать изображения с более высоким разрешением, используя System.Drawing.Printing.PrintDocument? - PullRequest
0 голосов
/ 11 октября 2019

У меня есть функция powershell, собранная из онлайн-источников с несколькими собственными модификациями. Он берет изображение для печати, изменяет размер до размера страницы принтера и печатает его.

Эта функция работает нормально, но я пытаюсь печатать штрих-коды на этикетках, которые требуют печати с высоким разрешением. Я могу изменить разрешение задания по умолчанию, изменив $doc.DefaultPageSettings.PrinterResolution, и могу сказать, что это применимо к каждой странице через мои различные выходные данные.

Однако разрешение страницы фактически не меняется. Размер страницы по умолчанию при низком DPI составляет 109x350 (от $pageBounds = $_.MarginBounds). Я изменяю выходной DPI, и это значение остается неизменным;Я ожидаю, что это повысится до 300x1000 для 300 точек на дюйм.

function print-image {
 param([string]$imageName = $(throw "Enter image name to print"),
    [string]$printer = "",
    [bool]$fitImageToPaper = $true)

 trap { break; }

 [void][System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")

 # Bitmap image to use to print image
 $bitmap = $null

 $doc = new-object System.Drawing.Printing.PrintDocument

 # if printer name not given, use default printer
 if ($printer -ne "") {
  $doc.PrinterSettings.PrinterName = $printer
 }

$doc.DefaultPageSettings.PrinterResolution = $doc.PrinterSettings.PrinterResolutions[5]
$doc.DefaultPageSettings.Margins = new-object System.Drawing.Printing.Margins(0,0,0,0);

 #$doc.OriginAtMargins = $true

 $doc.DocumentName = [System.IO.Path]::GetFileName($imageName)

 $doc.add_BeginPrint({
  Write-Host "==================== $($doc.DocumentName) ===================="
 })

 # clean up after printing...
 $doc.add_EndPrint({
  if ($bitmap -ne $null) {
   $bitmap.Dispose()
   $bitmap = $null
  }
  Write-Host "xxxxxxxxxxxxxxxxxxxx $($doc.DocumentName) xxxxxxxxxxxxxxxxxxxx"
 })

 # Adjust image size to fit into paper and print image
 $doc.add_PrintPage({
  Write-Host "Printing $imageName..."
  $g = $_.Graphics
  $pageBounds = $_.MarginBounds
  $img = new-object Drawing.Bitmap($imageName)

  Write-Host $_
  Write-Host $_.PageSettings
  Write-Host $_.MarginBounds
  Write-Host $_.PageBounds

  $adjustedImageSize = $img.Size
  $ratio = [double] 1;

  # Adjust image size to fit on the paper
  if ($fitImageToPaper) {
   $fitWidth = [bool] (($img.Size.Width/[math]::abs($_.MarginBounds.Width)) > ($img.Size.Height/[math]::abs($_.MarginBounds.Height)))
   if (($img.Size.Width -le $_.MarginBounds.Width) -and
    ($img.Size.Height -le $_.MarginBounds.Height)) {
    $adjustedImageSize = new-object System.Drawing.SizeF($img.Size.Width, $img.Size.Height)
   } else {
    if ($fitWidth) {
     Write-Host "Fit Width"
     $ratio = [double] [math]::abs($_.MarginBounds.Width / $img.Size.Width);
     $adjustedImageSize = new-object System.Drawing.SizeF($_.MarginBounds.Width, [float]($img.Size.Height * $ratio))
    } else {
     Write-Host "Fit Height"
     $ratio = [double] [math]::abs($_.MarginBounds.Height / $img.Size.Height)
     $adjustedImageSize = new-object System.Drawing.SizeF([float]($img.Size.Width * $ratio), $_.MarginBounds.Height)
    }
   }
  }

    Write-Host $adjustedImageSize
    Write-Host $img

  # calculate destination and source sizes
  $recDest = new-object Drawing.RectangleF(0, 0, $adjustedImageSize.Width, $adjustedImageSize.Height )
  $recSrc = new-object Drawing.RectangleF(0, 0, $img.Width, $img.Height)

  # Print to the paper
  $_.Graphics.DrawImage($img, $recDest, $recSrc, [Drawing.GraphicsUnit]"Pixel")

  $_.HasMorePages = $false; # nothing else to print
 })

  Write-Host "xxxxxxxxxxxxxxxxxxxx $($doc.DocumentName) xxxxxxxxxxxxxxxxxxxx"
 $doc.Print()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...