Winform 列印PDF順序混亂,獲取列印佇列

2021-06-17 17:33:17 字數 2671 閱讀 3414

工作中pdf列印順序混亂著實讓我疼痛了好久,其實決絕方法非常簡單,但沒有想到這個點子的時候確實讓我走了很多彎路

這裡文章寫出來並不是為了炫耀什麼,只是覺得發現些好東西就分享出來而已,同時也做個記錄,方便以後查詢

開始正文

既然要解決列印順序混亂,那麼必須先要實現列印pdf功能,實現pdf列印的方法很多,網上隨便一搜就可以找到,這裡我貼上自己的列印方法,其實也是網上找到的,稍稍做了修改

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

這個列印方法非常方便,只要你的電腦安裝了可以閱讀pdf文件的軟體,都可以列印,不用特定的軟體adobe reader、adobe acrobat xi等。

但是 當你連續列印多個pdf文件的時候就出現列印順序混亂的問題,

經除錯發現,我傳送列印請求的順和印表機接收到的請求的順序是不一致的

就是在上面的程序列印中新增阻塞;proc.waitforexit();注釋說名的很清楚,等待關聯程序退出

**如下:

foreach (var itempath in

filepathlist)

}

因為pdf列印會關聯你的閱讀pdf文件軟體,因此沒列印乙個pdf文件就會開啟關聯軟體,這樣你必須關掉關聯軟體才會進入下個列印,這樣就很蛋疼了,為此我又做了個執行緒,這個執行緒就是實現自動關閉關聯軟體的功能,但是在使用過程中會發現卡主的現象,這樣使用者體驗不好

因此我想到第二種實現方式:在乙個列印請求傳送給印表機後,就判斷印表機的列印佇列中是存在我傳送的列印文件,如果沒有,則一直等到佇列中已存在列印文件後,再傳送下乙個列印請求,要實現這個功能,你必須要先獲取到印表機的列印佇列,

首先要獲得印表機的名稱,我這裡使用的是預設列印,為此要獲得預設印表機的名稱(注:必須是本機的,區域網的沒時間研究,等有空了再看看)

//

引入命名空間: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

intpcchbuffer);

//////

獲取預設印表機

/// ///

public

static

string

getdefaultprinter()

int lastwin32error =marshal.getlastwin32error();

if (lastwin32error ==error_insufficient_buffer)

lastwin32error =marshal.getlastwin32error();

}if (lastwin32error ==error_file_not_found)

return"";

}

view code

然後根據印表機的名稱獲取本地印表機的列印佇列

///

///獲取印表機的列印列表

/// ///

印表機名稱,本地

///返回列印佇列中文件名稱字串,多個之間用逗號連線

public

static

string getprintjobs(string

printname)

//cleanup unmanaged memory

marshal.freehglobal(pdata);

//close printer

closeprinter(handle);

return

result.tostring();

}

view code

最後在上面的迴圈列印的方法裡加上判斷,同時去掉proc.waitforexit();

foreach (string pdfpath in

paths)}}

到此 大功告成!

PHP列印預覽PDF

functioncreatepdffile frontdata 列印預覽 public function printexternal request request contract list function q first arr foreach data contract list as k ...

pdf的列印控制

首先,要明確一件事,印表機 或者說列印驅動 列印文件內容的方式有兩種 1.讓文件 豎著 輸出到列印紙 portrait 2.讓文件 橫著 輸出到列印紙 landscape 如何控制呢?如何控制縱打和橫打呢?新建乙個類似a4的空文件,將內容豎著渲染進去就是縱打 將內容橫著渲染進去就是橫打 adobe開...

ireport列印pdf字型問題

使用ireport列印pdf時需要匯入字型 1 ireport預設pdf字型為stsong light,編碼預設為unigb ucs2 h 2 需要匯入 ireport 5.6.0 ireport modules ext itextasian.jar 3 如果不使用預設字型時,需要匯入字型,並設定編...