浅谈Web打印服务
服务器侦听http端口,接收客户端传来的的url下载,本地打印,要求客户端和服务器在同一个网内,打印机共享。
主要代码如下,需要引用System.Net , System.IO
class iLisen
{
/// <summary>
/// 打印文件按默认方式
/// </summary>
/// <param name="filePath">文件路径</param>
/// <param name="printer">打印机名称</param>
private bool printfile(string filePath, string printer)
{
try
{
if (printer == "")
{
PrintDocument fPrintDocument = new PrintDocument();
printer = fPrintDocument.PrinterSettings.PrinterName;
}
ProcessStartInfo info = new ProcessStartInfo();
info.Arguments = "\"" + printer + "\"";
info.UseShellExecute = true;
info.CreateNoWindow = true;
info.Verb = "PrintTo";
info.FileName = filePath;
info.CreateNoWindow = true;
info.WindowStyle = ProcessWindowStyle.Hidden;
Process p = new Process();
p.StartInfo = info;
p.Start();
p.WaitForInputIdle();
p.Close();
return true;
}
catch (Exception e)
{
return false;
}
}
/// <summary>
/// 读取指定key的值
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
public string GetConfigValue(string key)
{
System.Configuration.Configuration config = System.Configuration.ConfigurationManager.OpenExeConfiguration(System.Configuration.ConfigurationUserLevel.None);
if (config.AppSettings.Settings[key] == null)
return "";
else
return config.AppSettings.Settings[key].Value;
}
/// <summary>
/// Http方式下载文件
/// </summary>
/// <param name="url">http地址</param>
/// <param name="localfile">本地文件</param>
/// <returns></returns>
public bool DownloadFile(string url, string localfile, string cookie = "")
{
bool flag = false;
long startPosition = 0; // 上次下载的文件起始位置
FileStream writeStream; // 写入本地文件流对象
if (File.Exists(localfile))
{
//文件存在直接删掉重建
File.Delete(localfile);
}
writeStream = new FileStream(localfile, FileMode.Create);// 文件不保存创建一个文件
startPosition = 0;
try
{
HttpWebRequest myRequest = (HttpWebRequest)HttpWebRequest.Create(url);// 打开网络连接
myRequest.Headers.Add("Cookie", cookie);
if (startPosition > 0)
{
myRequest.AddRange((int)startPosition);// 设置Range值,与上面的writeStream.Seek用意相同,是为了定义远程文件读取位置
}
using (Stream readStream = myRequest.GetResponse().GetResponseStream())// 向服务器请求,获得服务器的回应数据流
{
byte[] btArray = new byte[512];// 定义一个字节数据,用来向readStream读取内容和向writeStream写入内容
int contentSize = readStream.Read(btArray, 0, btArray.Length);// 向远程文件读第一次
while (contentSize > 0)// 如果读取长度大于零则继续读
{
writeStream.Write(btArray, 0, contentSize);// 写入本地文件
contentSize = readStream.Read(btArray, 0, btArray.Length);// 继续向远程文件读取
}
//writeStream.Close();
}
FileInfo fi = new FileInfo(localfile);
long ilen = fi.Length;
if (ilen < 2000)
{
flag = false; // 文件空白
}
else
{
flag = true; //返回true下载成功
}
}
catch (Exception ex)
{
flag = false; //返回false下载失败
}
finally
{
writeStream.Close();
}
return flag;
}
public void StartLisen()
{
try
{
HttpListener listerner = new HttpListener();
{
for (; true; )
{
try
{
string urlserver = GetConfigValue("server"); //格式 http://127.0.0.1:1357/ 客户端浏览器通过这个IP用户get方式访问
listerner.AuthenticationSchemes = AuthenticationSchemes.Anonymous;//指定身份验证 Anonymous匿名访问
listerner.Prefixes.Add(urlserver);
listerner.Start();
}
catch (Exception e)
{
Console.WriteLine("Cannot connect to printer server ...");
listerner = new HttpListener();
continue;
}
break;
}
Console.WriteLine("Printer server started ...");
int maxThreadNum, portThreadNum;
//线程池
int minThreadNum;
ThreadPool.GetMaxThreads(out maxThreadNum, out portThreadNum);
ThreadPool.GetMinThreads(out minThreadNum, out portThreadNum);
Console.WriteLine("Max. threads:{0}", maxThreadNum);
Console.WriteLine("Min. idle threads:{0}", minThreadNum);
//ThreadPool.QueueUserWorkItem(new WaitCallback(TaskProc1), x);
string printerset = GetConfigValue("printer");
if (printerset == "")
{
//没有设置就使用默认打印机
PrintDocument fPrintDocument = new PrintDocument();
printerset = fPrintDocument.PrinterSettings.PrinterName;
}
Console.WriteLine("Printer name = " + printerset);
Console.WriteLine("\n\nWaiting for connection ...\n\n");
while (true)
{
//等待请求连接
//没有请求则GetContext处于阻塞状态
string istatus = "";
try
{
HttpListenerContext ctx = listerner.GetContext();
if (ctx.Request.RawUrl.IndexOf("printurl=") >= 0)
{
string rescon = ctx.Request.RawUrl.ToString();
string urltest = rescon.Split('=')[1];
string filename = rescon.Split('/')[rescon.Split('/').Length - 1];
Console.WriteLine(System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
Console.WriteLine(urltest);
bool downloadstatus = DownloadFile(urltest, "temp\\" + filename);
Console.WriteLine("Download file " + filename + " ... " + downloadstatus.ToString());
bool printstatus = doprint("temp\\" + filename, printerset);
Console.WriteLine("Print file " + filename + " ... " + printstatus.ToString());
HttpListenerResponse response = ctx.Response;
response.StatusCode = 200;
response.ContentType = "application/json;charset=UTF-8";
response.ContentEncoding = Encoding.UTF8;
response.AppendHeader("Content-Type", "application/json;charset=UTF-8");
using (StreamWriter writer = new StreamWriter(response.OutputStream, Encoding.UTF8))
{
if (downloadstatus && printstatus)
{
writer.Write("ok");
}
else
{
writer.Write("failed!" + " Download " + downloadstatus.ToString() + ". Print " + printstatus.ToString());
}
writer.Close();
response.Close();
}
}
else
{
HttpListenerResponse response = ctx.Response;
response.StatusCode = 201;
response.ContentType = "application/json;charset=UTF-8";
response.ContentEncoding = Encoding.UTF8;
response.AppendHeader("Content-Type", "application/json;charset=UTF-8");
using (StreamWriter writer = new StreamWriter(response.OutputStream, Encoding.UTF8))
{
writer.Write("failed");
writer.Close();
response.Close();
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
listerner.Stop();
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
HttpListener listerner = new HttpListener();
HttpListenerContext ctx = listerner.GetContext();
HttpListenerResponse response = ctx.Response;
}
}
}
//调用方式
static void Main(string[] args)
{
try
{
if (Directory.Exists("temp"))
{
Directory.Delete("temp", true);
}
Directory.CreateDirectory("temp");
}
catch (Exception ex)
{
Console.WriteLine("Create Directory temp failed!");
Console.WriteLine("");
Console.WriteLine(ex.Message);
return;
}
iLisen newlisten = new iLisen();
newlisten.StartLisen();
}
//客户端通过get方式访问,可以在浏览器测试打印效果,网址在上方设置
//打印动作通过文件默认打开方式打印,因此打印pdf文件需要安装个pdf打开工具,如foxit pdf reader
http://127.0.0.1:1357/?printurl=http://xxx.xxx/xxx.pdf
浙公网安备 33010602011771号