using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing.Printing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace Common.system
{
///
/// 点阵文件制作打印
/// 创建时间:2020年9月1日
///
public class LatticeFileHelper
{
///
/// 打印进程
///
public static Process PrintProcess = null;
///
/// 输出日志文件地址 每个文件2MB左右
///
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 += new DataReceivedEventHandler(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 = null;
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 (var 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 += new DataReceivedEventHandler(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");
foreach (var KillProcess in ProcessArray)
{
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 ex)
{
}
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 = null;
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 (var 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.CreateNoWindow = true; //不显示程序窗口
PrintProcess.StartInfo.RedirectStandardInput = true; //用于模拟该进程控制台的输入
//外部程序(这里是FFMPEG)输出流时候产生的事件,这里是把流的处理过程转移到下面的方法中,详细请查阅MSDN
PrintProcess.ErrorDataReceived += new DataReceivedEventHandler(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");
foreach (var KillProcess in ProcessArray)
{
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");
}
}
///
/// 输出结果
///
///
///
private static void Output(object sendProcess, DataReceivedEventArgs output)
{
Output(output.Data);
}
}
}