using System; using System.Collections.Generic; using System.Diagnostics; using System.Drawing.Printing; using System.Threading; namespace Common.system { using XHWK.WKTool.system; /// /// 点阵文件制作打印 /// 创建时间:2020年9月1日 /// public class LatticeFileHelper { /// /// 打印进程 /// public static Process PrintProcess; /// /// 输出日志文件地址 每个文件2MB左右 /// private static string _logPath = ""; /// /// 运行配置 首次打开必须运行 /// public static void RunPrintConfig() { string path = FileToolsCommon.GetFileAbsolutePath("/PrintTool/PrintConfig.exe"); Process myProcess = new Process(); _logPath = CreateLog(); myProcess.StartInfo.FileName = path; //绝对路径 //myProcess.StartInfo.Arguments = ""; myProcess.StartInfo.UseShellExecute = false; //不使用操作系统外壳程序启动 myProcess.StartInfo.RedirectStandardError = true; //重定向标准错误输出 myProcess.StartInfo.CreateNoWindow = true; //不显示程序窗口 myProcess.StartInfo.RedirectStandardInput = true; //用于模拟该进程控制台的输入 //外部程序(这里是FFMPEG)输出流时候产生的事件,这里是把流的处理过程转移到下面的方法中,详细请查阅MSDN myProcess.ErrorDataReceived += Output; myProcess.Start(); //启动线程 myProcess.BeginErrorReadLine(); //开始异步读取 myProcess.WaitForExit(); //阻塞等待进程结束 myProcess.Close(); //关闭进程 myProcess.Dispose(); //释放资源 } /// /// 生成点阵打印文件 /// /// PDF文件位置 /// 保存文件位置 TPF /// 输出结果,非0为失败 /// 错误信息 /// 输出信息["1536.688.35.70","1536.688.35.71","1536.688.35.72"] /// 0 为方点,1 为圆点 默认方点 public static void GeneratingPdf ( string pdfPath, string savePath, out int printResult, out string standardError, out string standardOutput, int pointType = 0 ) { //XML点阵文件位置 string xmlFile = FileToolsCommon.GetFileAbsolutePath("/LatticeXML/print_license.xml"); string contentParameter; contentParameter = "-sMode=Generate \"-sPDF=" + pdfPath + "\" \"-sLIC=" + xmlFile + "\" \"-oTPF=" + savePath + "\" \"-dType=" + pointType + "\" "; //[-dType=0] [-dPrint=0] [-pStart=0] #region 制作点阵文件参数说明 //-sMode = Generate - sPDF = d:\l\e.pdf - sLIC = d:\l\a.xml - oPDF = d:\l\11210.pdf" //当 - sMode = Generate,参数如下: //PrintTool.exe - sMode = Generate - sPDF = -sLIC = < -oPDF =| -oTPF=> [dType=] [-dPrint] [-pStart =] //- sPDF 原始 PDF 文件路径 //- sLIC 点阵资源文件路径 //- oPDF 生成的点阵 PDF 文件路径,-oPDF 与 - oTPF 至少设置一个。PDF 与 TPF 说明参见 2 生成文件类型说明 //- oTPF 生成的 TPF 文件,-oPDF 与 - oTPF 至少设置一个。PDF 与 TPF 说明参见 2 生成文件类型说明 //- dType 0 为方点,1 为圆点;可选参数,默认 0。详细参数区别,参见 3.1 点阵形状 //- dPrint 0 为激光打印机,1 为印刷机;可选参数,默认 0。详细参数区别,参见 3.2 点阵 PDF 适用打印场景 //- pStart 整数,选择从哪页点阵资源开始制作点阵文件, 即起始点阵资源页序号;可选参数,默认0。关于 - pStart 的功能说明,参见 1.3.1.高级设置 #endregion while (PrintProcess != null) { Thread.Sleep(100); } Process[] killProcessArray = Process.GetProcessesByName("PrintTool"); foreach (Process killProcess in killProcessArray) { killProcess.Kill(); } PrintProcess = new Process(); _logPath = CreateLog(); PrintProcess.StartInfo.FileName = FileToolsCommon.GetFileAbsolutePath("/PrintTool/PrintTool.exe"); //绝对路径 PrintProcess.StartInfo.Arguments = contentParameter; PrintProcess.StartInfo.UseShellExecute = false; //不使用操作系统外壳程序启动 PrintProcess.StartInfo.RedirectStandardError = true; //重定向标准错误输出 PrintProcess.StartInfo.RedirectStandardOutput = true; PrintProcess.StartInfo.CreateNoWindow = true; //不显示程序窗口 PrintProcess.StartInfo.RedirectStandardInput = true; //用于模拟该进程控制台的输入 //外部程序(这里是FFMPEG)输出流时候产生的事件,这里是把流的处理过程转移到下面的方法中,详细请查阅MSDN PrintProcess.ErrorDataReceived += Output; PrintProcess.Start(); //启动线程 PrintProcess.WaitForExit(); //阻塞等待进程结束 standardError = PrintProcess.StandardError.ReadToEnd(); standardOutput = PrintProcess.StandardOutput.ReadToEnd(); //PrintProcess.BeginErrorReadLine(); //开始异步读取 Output("【制作点阵文件】错误:" + standardError); Output("【制作点阵文件】返回信息:" + standardOutput); printResult = PrintProcess.ExitCode; //打印结果 非0则为打印失败 Output("【制作点阵文件】" + contentParameter); //记录打印日志 PrintProcess.Close(); //关闭进程 PrintProcess.Dispose(); //释放资源 #region 进程是否已经释放 bool isRunning = true; while (isRunning) { isRunning = false; Process[] processArray = Process.GetProcessesByName("PrintTool"); if (processArray.Length > 0) { isRunning = true; Thread.Sleep(100); } } #endregion PrintProcess = null; } /// /// 获取打印机列表 /// /// 默认打印机 /// 打印机列表 public static List GetPrinterList(out string defaultPrinter) { List printersList = new List(); defaultPrinter = null; try { PrintDocument print = new PrintDocument(); defaultPrinter = print.PrinterSettings.PrinterName; //默认打印机名 foreach (string sPrint in PrinterSettings.InstalledPrinters) //获取所有打印机名称 { printersList.Add(sPrint); } } catch (Exception) { // ignored } return printersList; } /// /// 打印TPF点阵文件 /// /// TPF路径 /// 打印份数 /// 打印机名称 /// 输出结果,非0为失败 /// 错误信息 /// 输出信息 public static void PrinterTpfFile ( string tpfPath, int printerNum, string printerName, out int printResult, out string standardError, out string standardOutput ) { tpfPath = tpfPath.Replace("/", "\\"); //XML点阵文件位置 //string XmlFile = FileToolsCommon.GetFileAbsolutePath("/LatticeXML/print_license.xml"); string contentParameter = " -sMode=Print \"-sTPF=" + tpfPath + "\" \"-sPrinter=" + printerName + "\" \"-dCopy=" + printerNum + "\""; //\"-dPaperSize=9\" #region 打印参数说明 //-sMode = Print,参数如下: //PrintTool.exe - sMode = Print - sTPF = [-dCopy =][-dPaperSize =] - sPrinter = //-sTPF 需要打印的 TPF 文件路径 //- dCopy 整数,可选参数,打印份数,默认 1 //- dPaperSize 整数,可选参数,设置打印纸张尺寸。不设置此值,系统自动选择匹配纸张打印;A4:"-dPaperSize=9" DMPAPER_A4 9 A4 210 x 297 mm 如 // 需要手动设置纸张尺寸,不同尺寸纸张对应值,参见 https://docs.microsoft.com/en-us/windows/win32/intl/paper-sizes //- sPrinter 打印机名称 // 打印完成后,如果打印成功,PrintTool.exe 退出值为 0。 //如果打印失败,程序退出值为非 0。 #endregion while (PrintProcess != null) { Thread.Sleep(100); } Process[] killProcessArray = Process.GetProcessesByName("PrintTool"); foreach (Process killProcess in killProcessArray) { killProcess.Kill(); } PrintProcess = new Process(); _logPath = CreateLog(); PrintProcess.StartInfo.FileName = FileToolsCommon.GetFileAbsolutePath("/PrintTool/PrintTool.exe").Replace("/", "\\"); PrintProcess.StartInfo.Arguments = contentParameter; PrintProcess.StartInfo.UseShellExecute = false; //不使用操作系统外壳程序启动 PrintProcess.StartInfo.RedirectStandardError = true; //重定向标准错误输出 PrintProcess.StartInfo.RedirectStandardOutput = true; PrintProcess.StartInfo.CreateNoWindow = true; //不显示程序窗口 PrintProcess.StartInfo.RedirectStandardInput = true; //用于模拟该进程控制台的输入 //外部程序(这里是FFMPEG)输出流时候产生的事件,这里是把流的处理过程转移到下面的方法中,详细请查阅MSDN PrintProcess.ErrorDataReceived += Output; PrintProcess.Start(); //启动线程 //PrintProcess.BeginErrorReadLine(); //开始异步读取 PrintProcess.WaitForExit(); //阻塞等待进程结束 standardError = PrintProcess.StandardError.ReadToEnd(); standardOutput = PrintProcess.StandardOutput.ReadToEnd(); Output("【制作点阵文件】错误:" + standardError); Output("【制作点阵文件】返回信息:" + standardOutput); printResult = PrintProcess.ExitCode; //打印结果 非0则为打印失败 Output("【打印TPF文件】" + contentParameter); //记录打印日志 PrintProcess.Close(); //关闭进程 PrintProcess.Dispose(); //释放资源 #region 进程是否已经释放 bool isRunning = true; while (isRunning) { isRunning = false; Process[] processArray = Process.GetProcessesByName("PrintTool"); if (processArray.Length > 0) { isRunning = true; Thread.Sleep(100); } } #endregion PrintProcess = null; } /// /// 创建日志文件 /// /// private static string CreateLog() { string logFileName = DateTime.Now.ToString("yyyyMMdd"); string logFilePath = FileToolsCommon.GetFileAbsolutePath("/Log/PrintLog/"); FileToolsCommon.CreateDirectory(logFilePath); string logName = logFilePath + logFileName + ".log"; try { if (!FileToolsCommon.IsExistFile(logName)) { FileToolsCommon.CreateFile(logName); //FileToolsCommon.AppendText(LogName, "\r\n****************************************************************************************************" + // "****************************************************************************************************\r\n"); return logName; } else { int num = 0; while (FileToolsCommon.GetFileSizeByMb(logName) > 2) { num++; logName = logFilePath + logFileName + "_" + num + ".log"; FileToolsCommon.CreateFile(logName); } //FileToolsCommon.AppendText(LogName, "\r\n****************************************************************************************************" + // "****************************************************************************************************\r\n"); return logName; } } catch (Exception) { return logName; } } /// /// 输出日志 /// /// private static void Output(string message) { if (!string.IsNullOrEmpty(message)) { FileToolsCommon.AppendText(_logPath, message + "\r\n"); FileToolsCommon.AppendText(_logPath, "\r\n****************************************************************************************************" + "****************************************************************************************************\r\n"); } } /// /// 输出结果 /// /// /// private static void Output(object sendProcess, DataReceivedEventArgs output) { Output(output.Data); } } }