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);
}
}
}