using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Printing;
using System.Linq;
using System.Text;
namespace BIPS.Print
{
public class PrintDocumentImage
{
public event Action<object> EndPrint;
List<string> listimage;
/// <summary>
///
/// </summary>
/// <param name="PrintName">打印机名称</param>
/// <param name="PageSize">打印纸张大小</param>
/// <param name="color">如果该页应以彩色打印,则为 true;反之,则为 false。默认值由打印机决定。</param>
/// <param name="img">图片</param>
/// <param name="Copies">份数</param>
/// <param name="documentNo">双面打印设置</param>
public void PrintStrat(string PrintName, string documentNo, string PageSize, bool color, List<string> img, int Copies)
{
PrintDocument printdoc = new PrintDocument();//Duplex
printdoc.DocumentName = documentNo;
printdoc.PrinterSettings.PrinterName = PrintName;
printdoc.PrinterSettings.Copies = (short)Copies;
printdoc.DefaultPageSettings.Color = color;//参数设置
printdoc.DefaultPageSettings.Margins = new Margins(0, 0, 0, 0);
if (img.Count >= 2)
{
//printdoc.PrinterSettings.Duplex = Duplex.Horizontal;
printdoc.PrinterSettings.Duplex = Duplex.Default;
}
foreach (PaperSize ps in printdoc.PrinterSettings.PaperSizes)
{
if (ps.Kind.ToString().Equals(PageSize))
{
printdoc.PrinterSettings.DefaultPageSettings.PaperSize = ps;
printdoc.DefaultPageSettings.PaperSize = ps;
}
}
this.listimage = img;
printdoc.PrintPage += new PrintPageEventHandler(printdoc_PrintPage);
printdoc.EndPrint += new PrintEventHandler(printdoc_EndPrint);
this.listimage = img;
printdoc.Print();
}
void printdoc_EndPrint(object sender, PrintEventArgs e)
{
if (EndPrint != null)
{
EndPrint("打印完成");
}
}
private void printdoc_PrintPage(object sender, PrintPageEventArgs e)
{
if (listimage.Count > 0)
{
//如果是base64字符串则将base64转成图片
Image inBitmap;
if (listimage[0].Length > 500)
{
//字符串过程认为是base64string
byte[] buffer = System.Convert.FromBase64String(listimage[0]);
using (System.IO.MemoryStream ms = new System.IO.MemoryStream(buffer))
{
inBitmap = Image.FromStream(ms);
}
}
else
{
inBitmap = Image.FromFile(listimage[0]);
}
using (inBitmap)
{
//打印机绘图宽高
int stdBitmapWidth = e.PageBounds.Width;
int stdBitmapHeight = e.PageBounds.Height;
//如果宽度比高度大,则进行旋转
if (inBitmap.Width > inBitmap.Height)
{
inBitmap.RotateFlip(RotateFlipType.Rotate90FlipNone);
}
//计算 打印机绘图区域宽高比
double width_Height = stdBitmapWidth * 1.0 / stdBitmapHeight;
//计算 原图宽高比
double sWidth_Height = inBitmap.Width * 1.0 / inBitmap.Height;
//打印机绘制区域的 区域
int heigth = stdBitmapHeight;
int width = stdBitmapWidth;
int x = 0;
int y = 0;
//如果图片区域比 打印机绘图区域大则需要缩放
if (stdBitmapHeight < inBitmap.Height || stdBitmapWidth < inBitmap.Width)
{
//如果是高度很高的图片,则按图片比例调整绘制宽度
if (width_Height > sWidth_Height)
{
width = (int)(sWidth_Height * heigth);
//调整到左右的中间。
x = (stdBitmapWidth - width) / 2;
}
//如果是宽度比较宽的图片,则按图片比例调整绘制高度
else if (width_Height < sWidth_Height)
{
heigth = (int)(width / sWidth_Height);
//t调整到上下的中间。
y = (stdBitmapHeight - heigth) / 2;
}
}
//如果图片宽高都比绘图区域小,则不需要进行缩放。直接绘制在打印机绘图区域中央。
else
{
width = inBitmap.Width;
heigth = inBitmap.Height;
x = (stdBitmapWidth - inBitmap.Width) / 2;
y = (stdBitmapHeight - inBitmap.Height) / 2;
}
//绘制区域
Rectangle stdRec = new Rectangle(x, y, width, heigth);
//将图片绘制到打印机,绘图区域。
e.Graphics.DrawImage(inBitmap, stdRec, new Rectangle(0, 0, inBitmap.Width, inBitmap.Height), GraphicsUnit.Pixel);
listimage.RemoveAt(0);
if (listimage.Count > 0)
{
e.HasMorePages = true;
}
else
{
e.HasMorePages = false;
}
}
}
}
}
}