AIMS/DocumentManagement/GoldPrinter/MisGoldPrinter.cs
2023-03-01 00:21:03 +08:00

847 lines
20 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Data;
using System.Drawing;
using System.Drawing.Printing;
using System.Windows.Forms;
namespace GoldPrinter
{
public class MisGoldPrinter : IDisposable
{
private const int CON_SPACE_TITLE_CAPTION = 5;
private const int CON_SPACE_CAPTION_TOP = 20;
private const int CON_SPACE_HEADER_BODY = 5;
private const int CON_SPACE_BODY_FOOTER = 5;
private int X;
private int Y;
private int Width;
private float Scale = 1f;
private int mCurrentPageIndex;
private int mCurrentRowIndex;
private Graphics mGraphics;
private Printer mPrinter;
private PrintDocument mPrintDocument;
private PrinterMargins mPrinterMargins;
private Sewing _sewing;
private bool _isOnlySingleColor = true;
public Color BackColor = Color.White;
private int _rowsPerPage = -1;
private bool _isSubTotalPerPage = false;
private string _subTotalColsList = "";
private bool _isSewingLine = false;
private bool _isPrinterMargins = false;
private GridBorderFlag _gridBorder = GridBorderFlag.Double;
private Title _title;
private Caption _caption;
private Top _top;
private Header _header;
private MultiHeader _multiHeader;
private Body _body;
protected Footer _footer;
private Bottom _bottom;
public Sewing Sewing
{
get
{
return this._sewing;
}
set
{
if (value != null)
{
this._sewing = value;
}
else
{
this._sewing.Margin = 0;
}
}
}
public string DocumentName
{
get
{
return this.mPrintDocument.DocumentName;
}
set
{
this.mPrintDocument.DocumentName = value;
}
}
public int RowsPerPage
{
get
{
return this._rowsPerPage;
}
set
{
this._rowsPerPage = value;
}
}
public bool IsSubTotalPerPage
{
get
{
return this._isSubTotalPerPage;
}
set
{
this._isSubTotalPerPage = value;
}
}
public string SubTotalColsList
{
get
{
return this._subTotalColsList;
}
set
{
this._subTotalColsList = value;
}
}
public bool IsSewingLine
{
get
{
return this._isSewingLine;
}
set
{
this._isSewingLine = value;
}
}
public bool IsPrinterMargins
{
get
{
return this._isPrinterMargins;
}
set
{
this._isPrinterMargins = value;
}
}
public GridBorderFlag GridBorder
{
get
{
return this._gridBorder;
}
set
{
this._gridBorder = value;
}
}
public object Title
{
get
{
return this._title;
}
set
{
if (value != null)
{
if (value.GetType().ToString() == "System.String")
{
if (this._title == null)
{
this._title = new Title();
}
this._title.Text = (string)value;
}
else if (value.GetType().ToString() == "GoldPrinter.Title")
{
this._title = (Title)value;
}
}
}
}
public object Caption
{
get
{
return this._caption;
}
set
{
if (value != null)
{
if (value.GetType().ToString() == "System.String")
{
if (this._caption == null)
{
this._caption = new Caption();
}
this._caption.Text = (string)value;
}
else if (value.GetType().ToString() == "GoldPrinter.Caption")
{
this._caption = (Caption)value;
}
}
}
}
public object Top
{
get
{
return this._top;
}
set
{
if (value != null)
{
if (value.GetType().ToString() == "System.String" || value.GetType().ToString() == "System.String[]")
{
if (this._top == null)
{
this._top = new Top();
}
this._top.DataSource = value;
}
else if (value.GetType().ToString() == "GoldPrinter.Top")
{
this._top = (Top)value;
}
}
}
}
public object Bottom
{
get
{
return this._bottom;
}
set
{
if (value != null)
{
if (value.GetType().ToString() == "System.String" || value.GetType().ToString() == "System.String[]")
{
if (this._bottom == null)
{
this._bottom = new Bottom();
}
this._bottom.DataSource = (string)value;
}
else if (value.GetType().ToString() == "GoldPrinter.Bottom")
{
this._bottom = (Bottom)value;
}
}
}
}
public object Header
{
get
{
return this._header;
}
set
{
if (value != null)
{
if (value.GetType().ToString() == "System.String[]" || value.GetType().ToString() == "System.String[,]" || value.GetType().ToString() == "System.Data.DataTable")
{
if (this._header == null)
{
this._header = new Header();
}
this._header.DataSource = value;
}
else if (value.GetType().ToString() == "GoldPrinter.Header")
{
this._header = (Header)value;
}
}
}
}
public object Footer
{
get
{
return this._footer;
}
set
{
if (value != null)
{
if (value.GetType().ToString() == "System.String[]" || value.GetType().ToString() == "System.String[,]" || value.GetType().ToString() == "System.Data.DataTable")
{
if (this._footer == null)
{
this._footer = new Footer();
}
this._footer.DataSource = value;
}
else if (value.GetType().ToString() == "GoldPrinter.Footer")
{
this._footer = (Footer)value;
}
}
}
}
public object MultiHeader
{
get
{
return this._multiHeader;
}
set
{
if (value != null)
{
if (value.GetType().ToString() == "System.String[]" || value.GetType().ToString() == "System.String[,]" || value.GetType().ToString() == "System.Data.DataTable")
{
if (this._multiHeader == null)
{
this._multiHeader = new MultiHeader();
}
this._multiHeader.DataSource = value;
}
else if (value.GetType().ToString() == "GoldPrinter.MultiHeader")
{
this._multiHeader = (MultiHeader)value;
}
}
}
}
public object Body
{
get
{
return this._body;
}
set
{
if (value != null)
{
if (value.GetType().ToString() == "System.String[]" || value.GetType().ToString() == "System.String[,]" || value.GetType().ToString() == "System.Data.DataTable")
{
if (this._body == null)
{
this._body = new Body();
}
this._body.DataSource = value;
}
else if (value.GetType().ToString() == "GoldPrinter.Body")
{
this._body = (Body)value;
}
}
}
}
public object DataSource
{
get
{
return this._body.DataSource;
}
set
{
this._body.DataSource = value;
}
}
public MisGoldPrinter() : this(false)
{
}
public MisGoldPrinter(bool p_IsLandscape)
{
PrinterSingleton.Reset();
this.mCurrentPageIndex = 1;
this.mCurrentRowIndex = 0;
this.mPrintDocument = PrinterSingleton.PrintDocument;
this.mPrintDocument.DefaultPageSettings.Landscape = p_IsLandscape;
this.mPrinterMargins = PrinterSingleton.PrinterMargins;
this.mPrintDocument.DocumentName = "MIS金质打印通欢迎使用";
this._sewing = new Sewing(30, SewingDirectionFlag.Left);
this.mPrinter = new Printer();
this._body = new Body();
}
public virtual void Dispose()
{
try
{
this.mGraphics.Dispose();
this.mPrintDocument.Dispose();
}
catch
{
}
}
public PageSettings PageSetup()
{
PrinterPageSetting printerPageSetting = new PrinterPageSetting(this.mPrintDocument);
printerPageSetting.PrintPage += new PrintPageDelegate(this.PrintPageEventHandler);
PageSettings defaultPageSettings = this.mPrintDocument.DefaultPageSettings;
PageSettings pageSettings = printerPageSetting.ShowPageSetupDialog();
if (defaultPageSettings != pageSettings)
{
PrinterSingleton.PrintDocument = this.mPrintDocument;
this.mPrinterMargins = new PrinterMargins(this.mPrintDocument);
PrinterSingleton.PrinterMargins = this.mPrinterMargins;
}
return pageSettings;
}
public PrinterSettings Print()
{
this.mCurrentPageIndex = 1;
this.mCurrentRowIndex = 0;
PrinterPageSetting printerPageSetting = new PrinterPageSetting(this.mPrintDocument);
printerPageSetting.PrintPage += new PrintPageDelegate(this.PrintPageEventHandler);
return printerPageSetting.ShowPrintSetupDialog();
}
public void Preview()
{
this.mCurrentPageIndex = 1;
this.mCurrentRowIndex = 0;
PrinterPageSetting printerPageSetting = new PrinterPageSetting(this.mPrintDocument);
printerPageSetting.PrintPage += new PrintPageDelegate(this.PrintPageEventHandler);
printerPageSetting.ImportExcelValue = new ImportExcelDelegate(this.ImportExcelMethodHandler);
printerPageSetting.ShowPrintPreviewDialog();
}
public void ImportExcelMethodHandler(object obj, ImportExcelArgs ev)
{
ExcelAccess excelAccess = new ExcelAccess();
excelAccess.Open();
excelAccess.MergeCells(1, 1, 1, this._body.Cols);
excelAccess.SetFont(1, 1, 1, this._body.Cols, this._title.Font);
excelAccess.SetCellText(1, 1, 1, this._body.Cols, this._title.Text);
excelAccess.SetCellText((DataTable)this.DataSource, 3, 1, true);
FileDialog fileDialog = new SaveFileDialog();
fileDialog.AddExtension = true;
fileDialog.DefaultExt = ".xls";
fileDialog.Title = "保存到Excel文件";
fileDialog.Filter = "Microsoft Office Excel 工作簿(*.xls)|*.xls|模板(*.xlt)|*.xlt";
if (fileDialog.ShowDialog() == DialogResult.OK)
{
if (excelAccess.SaveAs(fileDialog.FileName, true))
{
MessageBox.Show("数据成功保存到Excel文件", "GoldPrinter", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
}
}
fileDialog.Dispose();
excelAccess.Close();
}
private void PrintPageEventHandler(object obj, PrintPageEventArgs ev)
{
Graphics graphics = ev.Graphics;
this.mGraphics = graphics;
try
{
bool flag = this.Draw(graphics);
if (flag)
{
ev.HasMorePages = true;
this.mCurrentPageIndex++;
}
else
{
ev.HasMorePages = false;
this.mCurrentPageIndex = 1;
this.mCurrentRowIndex = 0;
}
}
catch (Exception )
{
}
}
private void OutObject(Printer outer)
{
if (outer != null)
{
outer.Graphics = this.mGraphics;
outer.Rectangle = new Rectangle(this.X, this.Y, this.Width, outer.Height);
if (this._isOnlySingleColor)
{
outer.Pen = Pens.Black;
outer.Brush = Brushes.Black;
}
outer.Draw();
this.Y += outer.Rectangle.Height;
}
}
private bool Draw(Graphics g)
{
bool flag = false;
if (this._body.Rows < 0)
{
throw new Exception("打印主要网格不能为空请用Body设置");
}
this.mPrinter.Graphics = g;
this.mPrinter.PrintDocument = this.mPrintDocument;
this.mPrinter.Sewing = this.Sewing;
this.mPrinter.PrinterMargins = this.mPrinterMargins;
this.Y = this.mPrinter.PrinterMargins.Top;
this.X = this.mPrinter.PrinterMargins.Left;
this.Width = this.mPrinter.PrinterMargins.Width;
this.DrawPrinterMargins(this.mPrinter);
this.DrawSewing(this.mPrinter);
if (this._title != null && (this.mCurrentPageIndex == 1 || this._title.IsDrawAllPage))
{
this._title.PrinterMargins = this.mPrinterMargins;
this.OutObject(this._title);
}
if (this._caption != null && (this.mCurrentPageIndex == 1 || this._caption.IsDrawAllPage))
{
this._caption.MoveY = 0;
if (this._title != null && (this.mCurrentPageIndex == 1 || this._title.IsDrawAllPage))
{
this._caption.MoveY = this._title.Height + 5;
}
this._caption.PrinterMargins = this.mPrinterMargins;
this.OutObject(this._caption);
}
if (this._title != null || this._caption != null)
{
this.Y += 20;
}
int num = 0;
int i;
if (!this._body.IsAverageColsWidth)
{
for (i = 0; i < this._body.ColsWidth.Length; i++)
{
num += this._body.ColsWidth[i];
}
if (num > this.mPrinterMargins.Width)
{
this.Scale = (float)(this.mPrinterMargins.Width / num);
}
else
{
this.Width = num;
this.X += (this.mPrinterMargins.Width - this.Width) / 2;
}
}
if (this._top != null && (this.mCurrentPageIndex == 1 || this._top.IsDrawAllPage))
{
this.OutObject(this._top);
}
if (this._header != null && (this.mCurrentPageIndex == 1 || this._header.IsDrawAllPage))
{
this.OutObject(this._header);
}
if ((this._top != null || this._header != null) && (this.mCurrentPageIndex == 1 || (this._top != null && this._top.IsDrawAllPage) || (this._header != null && this._header.IsDrawAllPage)))
{
this.Y += 5;
}
if (this._multiHeader != null && (this.mCurrentPageIndex == 1 || this._multiHeader.IsDrawAllPage))
{
this.OutObject(this._multiHeader);
}
float num2 = (float)(this.mPrinter.PrinterMargins.Height - (this.Y - this.mPrinter.PrinterMargins.Top));
if (this._footer != null && this._footer.IsDrawAllPage)
{
num2 -= (float)this._footer.Height;
}
if (this._bottom != null && this._bottom.IsDrawAllPage)
{
num2 -= (float)this._bottom.Height;
}
if (num2 < 0f)
{
throw new Exception("预留给打印主要网格的空间太小,请适当调整!");
}
int num3 = (int)(num2 / (float)this._body.RowHeight);
if (this.RowsPerPage > 0 && this.RowsPerPage < num3)
{
num3 = this.RowsPerPage;
}
if (this.IsSubTotalPerPage)
{
num3--;
}
Body body;
if (this.RowsPerPage > 0 && this.RowsPerPage < num3)
{
body = new Body(num3, this._body.Cols);
}
else
{
if (num3 > this._body.Rows - this.mCurrentRowIndex)
{
num3 = this._body.Rows - this.mCurrentRowIndex;
}
body = new Body(num3, this._body.Cols);
}
string[,] array = new string[num3, this._body.Cols];
i = 0;
while (i < num3 && this.mCurrentRowIndex < this._body.Rows)
{
for (int j = 0; j < this._body.Cols; j++)
{
array[i, j] = this._body.GetText(this.mCurrentRowIndex, j);
}
this.mCurrentRowIndex++;
i++;
}
body.GridText = array;
body.ColsAlignString = this._body.ColsAlignString;
body.ColsWidth = this._body.ColsWidth;
body.IsAverageColsWidth = this._body.IsAverageColsWidth;
body.Font = (Font)this._body.Font.Clone();
this.OutObject(body);
if (this.mCurrentRowIndex < this._body.Rows)
{
flag = true;
}
if (this._isSubTotalPerPage && this._subTotalColsList != "")
{
try
{
MultiHeader multiHeader = new MultiHeader(1, this._body.Cols);
multiHeader.ColsWidth = this._body.ColsWidth;
multiHeader.Graphics = g;
multiHeader.PrintDocument = this.mPrintDocument;
multiHeader.Sewing = this._sewing;
multiHeader.Rectangle = new Rectangle(this.X, this.Y, this.Width, multiHeader.Height);
multiHeader.SetText(0, 0, "本页小计");
multiHeader.SetText(0, 1, "本页小计");
string[] array2 = this._subTotalColsList.Split(new char[]
{
';'
});
double num4 = 0.0;
for (i = 0; i < array2.Length; i++)
{
int num5 = int.Parse(array2[i]);
for (int j = 0; j < array.GetLength(0); j++)
{
num4 += double.Parse(array[j, num5]);
}
multiHeader.SetText(0, num5, num4.ToString());
num4 = 0.0;
}
multiHeader.Draw();
this.Y += multiHeader.Height;
}
catch
{
}
}
if ((this._footer != null || this._bottom != null) && (this.mCurrentPageIndex == 1 || (this._top != null && this._top.IsDrawAllPage) || (this._header != null && this._header.IsDrawAllPage)))
{
this.Y += 5;
}
if (this._footer != null)
{
if (!flag || this._footer.IsDrawAllPage)
{
if (this._footer.IsDrawAllPage)
{
this.OutObject(this._footer);
}
}
}
if (this._bottom != null)
{
if (!flag || this._bottom.IsDrawAllPage)
{
if (this._bottom.IsDrawAllPage)
{
this.OutObject(this._bottom);
}
else
{
num2 = (float)(this.mPrinter.PrinterMargins.Height - (this.Y - this.mPrinter.PrinterMargins.Top));
if (num2 < (float)this._bottom.Height)
{
flag = true;
}
else
{
this.OutObject(this._bottom);
}
}
}
}
this.DrawBorder(g, this._multiHeader, body);
body.Dispose();
body = null;
return flag;
}
private void DrawPrinterMargins(Printer printer)
{
if (this.IsPrinterMargins)
{
printer.DrawPrinterMargins();
}
}
private void DrawSewing(Printer printer)
{
if (this.IsSewingLine && this.Sewing.Margin > 0)
{
if (this.Sewing.LineLen <= 0)
{
if (this.Sewing.SewingDirection == SewingDirectionFlag.Left)
{
this.Sewing.LineLen = printer.PageHeight;
}
else if (this.Sewing.SewingDirection == SewingDirectionFlag.Top)
{
this.Sewing.LineLen = printer.PageWidth;
}
}
printer.Sewing = this.Sewing;
printer.DrawSewing();
}
}
private void DrawBorder(Graphics g, MultiHeader multiHeader, Body body)
{
int width = body.Rectangle.Width;
int num = body.Rectangle.Height;
int x;
int y;
if (multiHeader != null)
{
x = multiHeader.Rectangle.X;
y = multiHeader.Rectangle.Y;
num += multiHeader.Rectangle.Height;
}
else
{
x = body.Rectangle.X;
y = body.Rectangle.Y;
}
if (this.IsSubTotalPerPage)
{
MultiHeader multiHeader2 = new MultiHeader(1, 1);
num += multiHeader2.RowHeight;
}
Rectangle rectangle = new Rectangle(x, y, width, num);
Pen pen = new Pen(Color.Black, 1f);
DrawRectangle drawRectangle = new DrawRectangle();
drawRectangle.Graphics = g;
drawRectangle.Rectangle = rectangle;
drawRectangle.Pen = pen;
switch (this.GridBorder)
{
case GridBorderFlag.Single:
drawRectangle.Draw();
break;
case GridBorderFlag.SingleBold:
drawRectangle.Pen.Width = 2f;
drawRectangle.Draw();
if (multiHeader != null)
{
drawRectangle.Rectangle = body.Rectangle;
drawRectangle.DrawTopLine();
}
break;
case GridBorderFlag.Double:
drawRectangle.Draw();
rectangle = new Rectangle(x - 2, y - 2, width + 4, num + 4);
drawRectangle.Rectangle = rectangle;
drawRectangle.Draw();
break;
case GridBorderFlag.DoubleBold:
drawRectangle.Draw();
rectangle = new Rectangle(x - 2, y - 2, width + 4, num + 4);
drawRectangle.Rectangle = rectangle;
drawRectangle.Pen.Width = 2f;
drawRectangle.Draw();
break;
}
}
private void AddSewingNonePrintArea()
{
if (this.Sewing.SewingDirection == SewingDirectionFlag.Left)
{
this.mPrinterMargins.Left += this.Sewing.Margin;
this.mPrinterMargins.Width -= this.Sewing.Margin;
}
else if (this.Sewing.SewingDirection == SewingDirectionFlag.Top)
{
this.mPrinterMargins.Top += this.Sewing.Margin;
this.mPrinterMargins.Height -= this.Sewing.Margin;
}
}
private void WriteMetricsToConsole(PrintPageEventArgs ev)
{
Graphics graphics = ev.Graphics;
Console.WriteLine("*****Information about the printer*****");
Console.WriteLine("纸张的大小 ev.PageSettings.PaperSize:" + ev.PageSettings.PaperSize);
Console.WriteLine("打印分辨率 ev.PageSettings.PrinterResolution:" + ev.PageSettings.PrinterResolution);
Console.WriteLine("旋转的角度 ev.PageSettings.PrinterSettings.LandscapeAngle" + ev.PageSettings.PrinterSettings.LandscapeAngle);
Console.WriteLine("");
Console.WriteLine("*****Information about the page*****");
Console.WriteLine("页面的大小 ev.PageSettings.Bounds:" + ev.PageSettings.Bounds);
Console.WriteLine("页面(同上) ev.PageBounds:" + ev.PageBounds);
Console.WriteLine("页面的边距 ev.PageSettings.Margins.:" + ev.PageSettings.Margins);
Console.WriteLine("页面的边距 ev.MarginBounds:" + ev.MarginBounds);
Console.WriteLine("水平分辨率 ev.Graphics.DpiX:" + ev.Graphics.DpiX);
Console.WriteLine("垂直分辨率 ev.Graphics.DpiY:" + ev.Graphics.DpiY);
ev.Graphics.SetClip(ev.PageBounds);
Console.WriteLine("ev.Graphics.VisibleClipBounds:" + ev.Graphics.VisibleClipBounds);
SizeF sizeF = new SizeF(ev.Graphics.VisibleClipBounds.Width * ev.Graphics.DpiX / 100f, ev.Graphics.VisibleClipBounds.Height * ev.Graphics.DpiY / 100f);
Console.WriteLine("drawing Surface Size in Pixels" + sizeF);
}
}
}