日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Winform 打印PDF顺序混乱,获取打印队列

發(fā)布時(shí)間:2024/1/17 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Winform 打印PDF顺序混乱,获取打印队列 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Winform 打印PDF順序混亂,獲取打印隊(duì)列 原文:Winform 打印PDF順序混亂,獲取打印隊(duì)列

工作中PDF打印順序混亂著實(shí)讓我疼痛了好久,其實(shí)決絕方法非常簡單,但沒有想到這個(gè)點(diǎn)子的時(shí)候確實(shí)讓我走了很多彎路

這里文章寫出來并不是為了炫耀什么,只是覺得發(fā)現(xiàn)些好東西就分享出來而已,同時(shí)也做個(gè)記錄,方便以后查找

開始正文

既然要解決打印順序混亂,那么必須先要實(shí)現(xiàn)打印PDF功能,實(shí)現(xiàn)PDF打印的方法很多,網(wǎng)上隨便一搜就可以找到,這里我貼上自己的打印方法,其實(shí)也是網(wǎng)上找到的,稍稍做了修改

Process proc = new Process(); proc.StartInfo.CreateNoWindow = false; proc.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; proc.StartInfo.UseShellExecute = true; proc.StartInfo.FileName = itemPath;//打印文件路徑(本地完整路徑包括文件名和后綴名) proc.StartInfo.Verb = "print"; proc.Start(); proc.Close();

這個(gè)打印方法非常方便,只要你的電腦安裝了可以閱讀PDF文檔的軟件,都可以打印,不用特定的軟件Adobe Reader、Adobe Acrobat XI等。

但是 當(dāng)你連續(xù)打印多個(gè)PDF文檔的時(shí)候就出現(xiàn)打印順序混亂的問題,

經(jīng)調(diào)試發(fā)現(xiàn),我發(fā)送打印請(qǐng)求的順和打印機(jī)接收到的請(qǐng)求的順序是不一致的

我的解決方法是當(dāng)前一個(gè)文檔打印完成后,再發(fā)送下一個(gè)打印請(qǐng)求,為此我想到如下方法:

就是在上面的進(jìn)程打印中添加阻塞;proc.WaitForExit();注釋說名的很清楚,等待關(guān)聯(lián)進(jìn)程退出

代碼如下:

foreach (var itemPath in filePathList){if (File.Exists(itemPath)){Process proc = new Process();proc.StartInfo.CreateNoWindow = false;proc.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;proc.StartInfo.UseShellExecute = true;proc.StartInfo.FileName = itemPath;//打印文件路徑(本地完整路徑包括文件名和后綴名)proc.StartInfo.Verb = "print";proc.Start();proc.WaitForExit();proc.Close();}}

因?yàn)镻DF打印會(huì)關(guān)聯(lián)你的閱讀PDF文檔軟件,因此沒打印一個(gè)PDF文檔就會(huì)打開關(guān)聯(lián)軟件,這樣你必須關(guān)掉關(guān)聯(lián)軟件才會(huì)進(jìn)入下個(gè)打印,這樣就很蛋疼了,為此我又做了個(gè)線程,這個(gè)線程就是實(shí)現(xiàn)自動(dòng)關(guān)閉關(guān)聯(lián)軟件的功能,但是在使用過程中會(huì)發(fā)現(xiàn)卡主的現(xiàn)象,這樣用戶體驗(yàn)不好

因此我想到第二種實(shí)現(xiàn)方式:在一個(gè)打印請(qǐng)求發(fā)送給打印機(jī)后,就判斷打印機(jī)的打印隊(duì)列中是存在我發(fā)送的打印文檔,如果沒有,則一直等到隊(duì)列中已存在打印文檔后,再發(fā)送下一個(gè)打印請(qǐng)求,要實(shí)現(xiàn)這個(gè)功能,你必須要先獲取到打印機(jī)的打印隊(duì)列,

首先要獲得打印機(jī)的名稱,我這里使用的是默認(rèn)打印,為此要獲得默認(rèn)打印機(jī)的名稱(注:必須是本機(jī)的,局域網(wǎng)的沒時(shí)間研究,等有空了再看看)

//引入命名空間:using System.Runtime.InteropServices;[DllImport("Winspool.drv", CharSet = CharSet.Auto, SetLastError = true)]private static extern bool SetDefaultPrinter(string printerName);[DllImport("winspool.drv", CharSet = CharSet.Auto, SetLastError = true)]private static extern bool GetDefaultPrinter(StringBuilder pszBuffer, ref int pcchBuffer);/// <summary>/// 獲取默認(rèn)打印機(jī) /// </summary>/// <returns></returns>public static string GetDefaultPrinter(){const int ERROR_FILE_NOT_FOUND = 2;const int ERROR_INSUFFICIENT_BUFFER = 122;int pcchBuffer = 0;if (GetDefaultPrinter(null, ref pcchBuffer)){return "";}int lastWin32Error = Marshal.GetLastWin32Error();if (lastWin32Error == ERROR_INSUFFICIENT_BUFFER){StringBuilder pszBuffer = new StringBuilder(pcchBuffer);if (GetDefaultPrinter(pszBuffer, ref pcchBuffer)){return pszBuffer.ToString();}lastWin32Error = Marshal.GetLastWin32Error();}if (lastWin32Error == ERROR_FILE_NOT_FOUND){return "";}return "";} View Code

然后根據(jù)打印機(jī)的名稱獲取本地打印機(jī)的打印隊(duì)列

/// <summary>/// 獲取打印機(jī)的打印列表/// </summary>/// <param name="printName">打印機(jī)名稱,本地</param>/// <returns>返回打印隊(duì)列中文檔名稱字符串,多個(gè)之間用逗號(hào)連接</returns>public static string GetPrintJobs(string printName){StringBuilder result = new StringBuilder();IntPtr handle;int FirstJob = 0;int NumJobs = 127;int pcbNeeded;int pcReturned;// open printer OpenPrinter(printName, out handle, IntPtr.Zero);// get num bytes required, here we assume the maxt job for the printer quest is 128 (0..127) EnumJobs(handle, FirstJob, NumJobs, 1, IntPtr.Zero, 0, out pcbNeeded, out pcReturned);// allocate unmanaged memory IntPtr pData = Marshal.AllocHGlobal(pcbNeeded);// get structs EnumJobs(handle, FirstJob, NumJobs, 1, pData, pcbNeeded, out pcbNeeded, out pcReturned);// create array of managed job structs JOB_INFO_1[] jobs = new JOB_INFO_1[pcReturned];// marshal struct to managed int pTemp = pData.ToInt32(); //start pointer for (int i = 0; i < pcReturned; ++i){jobs[i] = (JOB_INFO_1)Marshal.PtrToStructure(new IntPtr(pTemp), typeof(JOB_INFO_1));result.Append(jobs[i].pDocument);result.Append(",");pTemp += Marshal.SizeOf(typeof(JOB_INFO_1));}// cleanup unmanaged memory Marshal.FreeHGlobal(pData);// close printer ClosePrinter(handle);return result.ToString();} View Code

最后在上面的循環(huán)打印的方法里加上判斷,同時(shí)去掉proc.WaitForExit();

foreach (string pdfPath in paths){Process proc = new Process();proc.StartInfo.CreateNoWindow = false;proc.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;proc.StartInfo.UseShellExecute = true;proc.StartInfo.FileName = pdfPath;proc.StartInfo.Verb = "print";proc.Start();//proc.WaitForExit(); proc.Close();string pdfFileName = Path.GetFileName(pdfPath);strPrintName.Append(pdfFileName);strPrintName.Append("\r\n");bool isOk = true;while (isOk){string strJob =GetPrintJobs(defaultPrintName);if (strJob.Contains(pdfFileName)){isOk = false;}}}

?

另外一種解決方法請(qǐng)看?這里

?

?

?

posted on 2014-05-05 14:13 NET未來之路 閱讀(...) 評(píng)論(...) 編輯 收藏

轉(zhuǎn)載于:https://www.cnblogs.com/lonelyxmas/p/3709137.html

總結(jié)

以上是生活随笔為你收集整理的Winform 打印PDF顺序混乱,获取打印队列的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。