Advertisement
sanych_dv

printer

Apr 22nd, 2015
382
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 7.17 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using System.Drawing;
  7. using System.Drawing.Imaging;
  8. using System.Drawing.Printing;
  9. using System.IO;
  10.  
  11. namespace printer
  12. {
  13.     class Program
  14.     {
  15.         static private PrintDocument _doc;
  16.         static private string _printer;
  17.         static private int _fitImageToPaper = 0;
  18.             static private string _imagePath;
  19.             static private int[] _margins;
  20.            
  21.  
  22.         static void Main(string[] args)
  23.         {
  24.  
  25. // парсим аргументы
  26.  
  27.             for (int i = 0; i < args.Length; i++)
  28.             {
  29.  
  30.                 string argument = args[i];
  31.                 if (argument == "-printer")
  32.                 {
  33.                     _printer = args[i + 1];
  34.                 }
  35.  
  36.                 if (argument == "-margins")
  37.                 {
  38.          
  39.                     string val = Convert.ToString(args[i + 1]);
  40.                     _margins = val.Split(',').Select(n => Convert.ToInt32(n)).ToArray();
  41.                 }
  42.  
  43.                 if (argument == "-fitImageToPaper")
  44.                 {
  45.                     _fitImageToPaper = Convert.ToInt32(args[i + 1]);
  46.                 }
  47.  
  48.                 if (argument == "-imagePath")
  49.                 {
  50.                     _imagePath = Convert.ToString(args[i + 1]);
  51.                 }
  52.             }
  53.  
  54.             _doc = new System.Drawing.Printing.PrintDocument();
  55.  
  56.             if (!String.IsNullOrEmpty(_printer))
  57.             {
  58.                 _doc.PrinterSettings.PrinterName = _printer;
  59.             }
  60.  
  61.             _doc.DefaultPageSettings.Landscape = false;
  62.  
  63. // не уверен, что это объявление вообще нужно
  64.             _doc.DefaultPageSettings.PaperSize = new System.Drawing.Printing.PaperSize("Instagreen size", 615, 413);
  65.  
  66.             _doc.DefaultPageSettings.Margins = new System.Drawing.Printing.Margins(_margins[0], _margins[1], _margins[2], _margins[3]);
  67.  
  68. // убиваем диалоговое окно печати
  69.             _doc.PrintController = new System.Drawing.Printing.StandardPrintController();
  70.             _doc.DocumentName = Path.GetFileName(_imagePath);
  71.  
  72. // проверяем поля печати
  73.             Console.WriteLine("MARGINS: " + _doc.DefaultPageSettings.Margins);
  74.  
  75. // ставим слушатели
  76.             _doc.BeginPrint += new PrintEventHandler(doc_BeginPrint);
  77.             _doc.EndPrint += new PrintEventHandler(doc_EndPrint);
  78.             _doc.PrintPage += new PrintPageEventHandler(doc_PrintPage);
  79.  
  80. // отправляем документ на печать
  81.             _doc.Print();
  82.         }
  83.  
  84. // это не используется
  85.         static private MemoryStream imageStream( Image image )
  86.         {
  87.             MemoryStream ms = new MemoryStream();
  88.              image.Save(ms, ImageFormat.Jpeg);
  89.              return ms;
  90.         }
  91.  
  92.         static private void doc_BeginPrint(object sender, PrintEventArgs ev)
  93.         {
  94.             // Console.WriteLine("BEGIN PRINT: " + _doc.DocumentName);
  95.          
  96.  
  97.         }
  98.  
  99.         static private void doc_EndPrint(object sender, PrintEventArgs ev)
  100.         {
  101.             Console.WriteLine("SEND TO PRINTER: " + _doc.DocumentName);
  102.          //  Console.ReadLine();
  103.         }
  104.  
  105.         static private void doc_PrintPage(object sender, PrintPageEventArgs ev)
  106.         {
  107.  
  108.            // получаем картинку для печати
  109.            Bitmap image = (Bitmap)Image.FromFile(_imagePath);
  110.  
  111. // картинка из MemoryStream, в PowerShell работало только из потока, сейчас не используем
  112.  
  113.             /* Bitmap imageSrc = (Bitmap)Image.FromFile(_imagePath);
  114.              Bitmap image = new Bitmap(imageStream(imageSrc)); */
  115.  
  116.  
  117.            float ww = image.Width;
  118.            float hh = image.Height;
  119.  
  120. // получаем размер картинки
  121.             SizeF adjustedImageSize = image.Size;
  122.             float ratio = 1;
  123.  
  124. // получаем границы печати с нашими полями
  125.             Rectangle pageBounds = ev.MarginBounds;
  126.             Graphics pageGraphics = ev.Graphics;
  127.  
  128.             float boundsWidth = pageBounds.Width;
  129.             float boundsHeight = pageBounds.Height;
  130.  
  131.  
  132. // если соотношение сторон у области печати больше, чем соотношение сторон у картинки:
  133.             bool feetFactor = boundsWidth / boundsHeight > ww / hh;
  134.  
  135.  
  136.             if (_fitImageToPaper == 1)
  137.             {
  138.  
  139. // если картинка меньше области печати, ничего не меняем
  140.                 if (ww <= boundsWidth && hh <= boundsHeight)
  141.                 {
  142.                    adjustedImageSize = new SizeF(ww, hh);
  143.                 }
  144.                 else
  145.                 {
  146. // если картинка выходит за границы печати:
  147.                     if (feetFactor)
  148.                     {
  149. // если соотношение сторон у области печати больше, чем соотношение сторон у картинки, считаем рацио по высоте и подгоняем размер под область печати:
  150.  
  151.                         ratio = boundsHeight / hh;
  152.                         adjustedImageSize = new SizeF(ww * ratio, boundsHeight);
  153.                     }
  154.                     else
  155.                     {
  156. // если соотношение сторон у области печати меньше, чем соотношение сторон у картинки, считаем рацио по ширине и подгоняем размер под область печати:
  157.                         ratio = boundsWidth / ww;
  158.                         adjustedImageSize = new SizeF(boundsWidth, hh * ratio);
  159.                     }
  160.  
  161.                 }
  162.             }
  163.  
  164.  
  165. // если высота или ширина изображения меньше высоты или ширины области печати, то считаем сдвиг и центруем изображение:
  166.  
  167.             float offsetX = (boundsWidth - adjustedImageSize.Width) / 2;
  168.             float offsetY = (boundsHeight - adjustedImageSize.Height) / 2;
  169.  
  170.             Point newLocation = pageBounds.Location;
  171.  
  172.             newLocation.X += Convert.ToInt32(offsetX);
  173.             newLocation.Y += Convert.ToInt32(offsetY);
  174.  
  175.             RectangleF rectDest = new RectangleF(newLocation, adjustedImageSize);
  176.             RectangleF rectSrc = new RectangleF(0, 0, ww, hh);
  177.  
  178. // отладочная информация
  179.  
  180.             Console.WriteLine("rectSrc: " + rectSrc);
  181.             Console.WriteLine("pageBounds: " + pageBounds);
  182.             Console.WriteLine("rectDest: " + rectDest);
  183.             Console.WriteLine("newLocation: " + newLocation);
  184.  
  185. // рисуем итоговое изображение
  186.             pageGraphics.DrawImage(image, rectDest, rectSrc, GraphicsUnit.Pixel);
  187.  
  188.  
  189. // говорим принтеру, что страниц больше нет
  190.             ev.HasMorePages = false;
  191.  
  192.         }
  193.     }
  194. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement