Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Drawing;
- using System.Drawing.Imaging;
- using System.Drawing.Printing;
- using System.IO;
- namespace printer
- {
- class Program
- {
- static private PrintDocument _doc;
- static private string _printer;
- static private int _fitImageToPaper = 0;
- static private string _imagePath;
- static private int[] _margins;
- static void Main(string[] args)
- {
- // парсим аргументы
- for (int i = 0; i < args.Length; i++)
- {
- string argument = args[i];
- if (argument == "-printer")
- {
- _printer = args[i + 1];
- }
- if (argument == "-margins")
- {
- string val = Convert.ToString(args[i + 1]);
- _margins = val.Split(',').Select(n => Convert.ToInt32(n)).ToArray();
- }
- if (argument == "-fitImageToPaper")
- {
- _fitImageToPaper = Convert.ToInt32(args[i + 1]);
- }
- if (argument == "-imagePath")
- {
- _imagePath = Convert.ToString(args[i + 1]);
- }
- }
- _doc = new System.Drawing.Printing.PrintDocument();
- if (!String.IsNullOrEmpty(_printer))
- {
- _doc.PrinterSettings.PrinterName = _printer;
- }
- _doc.DefaultPageSettings.Landscape = false;
- // не уверен, что это объявление вообще нужно
- _doc.DefaultPageSettings.PaperSize = new System.Drawing.Printing.PaperSize("Instagreen size", 615, 413);
- _doc.DefaultPageSettings.Margins = new System.Drawing.Printing.Margins(_margins[0], _margins[1], _margins[2], _margins[3]);
- // убиваем диалоговое окно печати
- _doc.PrintController = new System.Drawing.Printing.StandardPrintController();
- _doc.DocumentName = Path.GetFileName(_imagePath);
- // проверяем поля печати
- Console.WriteLine("MARGINS: " + _doc.DefaultPageSettings.Margins);
- // ставим слушатели
- _doc.BeginPrint += new PrintEventHandler(doc_BeginPrint);
- _doc.EndPrint += new PrintEventHandler(doc_EndPrint);
- _doc.PrintPage += new PrintPageEventHandler(doc_PrintPage);
- // отправляем документ на печать
- _doc.Print();
- }
- // это не используется
- static private MemoryStream imageStream( Image image )
- {
- MemoryStream ms = new MemoryStream();
- image.Save(ms, ImageFormat.Jpeg);
- return ms;
- }
- static private void doc_BeginPrint(object sender, PrintEventArgs ev)
- {
- // Console.WriteLine("BEGIN PRINT: " + _doc.DocumentName);
- }
- static private void doc_EndPrint(object sender, PrintEventArgs ev)
- {
- Console.WriteLine("SEND TO PRINTER: " + _doc.DocumentName);
- // Console.ReadLine();
- }
- static private void doc_PrintPage(object sender, PrintPageEventArgs ev)
- {
- // получаем картинку для печати
- Bitmap image = (Bitmap)Image.FromFile(_imagePath);
- // картинка из MemoryStream, в PowerShell работало только из потока, сейчас не используем
- /* Bitmap imageSrc = (Bitmap)Image.FromFile(_imagePath);
- Bitmap image = new Bitmap(imageStream(imageSrc)); */
- float ww = image.Width;
- float hh = image.Height;
- // получаем размер картинки
- SizeF adjustedImageSize = image.Size;
- float ratio = 1;
- // получаем границы печати с нашими полями
- Rectangle pageBounds = ev.MarginBounds;
- Graphics pageGraphics = ev.Graphics;
- float boundsWidth = pageBounds.Width;
- float boundsHeight = pageBounds.Height;
- // если соотношение сторон у области печати больше, чем соотношение сторон у картинки:
- bool feetFactor = boundsWidth / boundsHeight > ww / hh;
- if (_fitImageToPaper == 1)
- {
- // если картинка меньше области печати, ничего не меняем
- if (ww <= boundsWidth && hh <= boundsHeight)
- {
- adjustedImageSize = new SizeF(ww, hh);
- }
- else
- {
- // если картинка выходит за границы печати:
- if (feetFactor)
- {
- // если соотношение сторон у области печати больше, чем соотношение сторон у картинки, считаем рацио по высоте и подгоняем размер под область печати:
- ratio = boundsHeight / hh;
- adjustedImageSize = new SizeF(ww * ratio, boundsHeight);
- }
- else
- {
- // если соотношение сторон у области печати меньше, чем соотношение сторон у картинки, считаем рацио по ширине и подгоняем размер под область печати:
- ratio = boundsWidth / ww;
- adjustedImageSize = new SizeF(boundsWidth, hh * ratio);
- }
- }
- }
- // если высота или ширина изображения меньше высоты или ширины области печати, то считаем сдвиг и центруем изображение:
- float offsetX = (boundsWidth - adjustedImageSize.Width) / 2;
- float offsetY = (boundsHeight - adjustedImageSize.Height) / 2;
- Point newLocation = pageBounds.Location;
- newLocation.X += Convert.ToInt32(offsetX);
- newLocation.Y += Convert.ToInt32(offsetY);
- RectangleF rectDest = new RectangleF(newLocation, adjustedImageSize);
- RectangleF rectSrc = new RectangleF(0, 0, ww, hh);
- // отладочная информация
- Console.WriteLine("rectSrc: " + rectSrc);
- Console.WriteLine("pageBounds: " + pageBounds);
- Console.WriteLine("rectDest: " + rectDest);
- Console.WriteLine("newLocation: " + newLocation);
- // рисуем итоговое изображение
- pageGraphics.DrawImage(image, rectDest, rectSrc, GraphicsUnit.Pixel);
- // говорим принтеру, что страниц больше нет
- ev.HasMorePages = false;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement