[點(diǎn)晴永久免費(fèi)OA]C#中調(diào)用PDFCreator生成PDF文件
前一陣子做了一個(gè)生成報(bào)表的小project,生成的報(bào)表是關(guān)于股價(jià)的記錄。沒有什么現(xiàn)成的包和第三方程序給我們用,聽說WPF渲染的頁面可以之間存成PDF,不過只是道聽途說,沒敢真正實(shí)踐,最后還是用了自己以前搞過的方法,Office Interop,在一個(gè)word文檔中插入很多placeholder搞成template,然后用C#代碼動(dòng)態(tài)把PlaceHolder變成數(shù)據(jù),然后保存。這個(gè)方法其實(shí)挺強(qiáng)大,不過有幾個(gè)限制和不爽的地方。第一,程序運(yùn)行的機(jī)器上要有Office安裝,word是必須的,如果要生成圖的話,還需要Excel. 第二,.NET Office Interop本質(zhì)上還是COM的封裝,性能和穩(wěn)定性就不能太苛求了。第三,Office Interop搞起來還是挺煩的。抱怨了半天,不過這個(gè)方法還是可行的。不過最后要求生成PDF形式的報(bào)表,但是Office沒有PDF生成的支持,這怎么辦?想起自己每每需要生成PDF文件的時(shí)候直接用PDFCreator虛擬打印機(jī)就可以了,查了一下,果然,PDFCreator有COM API. 這下問題解決了。 在C#中如何調(diào)用PDFCreator生成PDF文件呢? 第一步:安裝PDFCreator (這個(gè)好像是廢話) 第二步:創(chuàng)建C#項(xiàng)目,加入PDFCreator.exe COM引用 第三步:參見如下代碼: public override void Process(ITask task, int index) { if (!File.Exists(Path.Combine(FromLocation, FromFilename))) { throw new FileNotFoundException("File: " + Path.Combine(FromLocation, FromFilename) + " does not exists"); } Monitor.Enter(lockObject); clsPDFCreator creator = null; try { creator = new clsPDFCreator(); creator.eError += new __clsPDFCreator_eErrorEventHandler(creator_eError); creator.eReady += new __clsPDFCreator_eReadyEventHandler(creator_eReady); String paramters = "/NoProcessingAtStartup"; if (!creator.cStart()) { throw new Exception("Cannot launch PDFCreator. Error: " + Error); } var opt = creator.cOptions; opt.UseAutosave = 1; opt.UseAutosaveDirectory = 1; opt.AutosaveDirectory = this.ToLocation; opt.AutosaveFormat = 0; opt.AutosaveFilename = this.ToFilename; creator.cOptions = opt; creator.cClearCache(); creator.cDefaultPrinter = "PDFCreator"; if (!creator.cIsPrintable(Path.Combine(FromLocation, FromFilename))) { throw new Exception("File: " + Path.Combine(FromLocation, FromFilename) + " is not printable."); } creator.cPrintFile(Path.Combine(FromLocation, FromFilename)); creator.cPrinterStop = false; Ready = false; var duration = new TimeSpan(0, 0, 0, TimeoutInSec); DateTime lastCheck = DateTime.Now; DateTime startTime = lastCheck; while (!Ready && ((lastCheck - startTime) < duration)) { System.Threading.Thread.Sleep(500); lastCheck = DateTime.Now; } creator.cPrinterStop = true; Thread.Sleep(1000); creator.cClose(); if (!Ready) { throw new Exception("PDF creation failed. This maybe due to timeout."); } } finally { Monitor.Exit(lockObject); } } void creator_eReady() { this.Ready = true; } void creator_eError() { Error = creator.cError.Description; } 代碼很好懂,自己很懶,沒有把代碼重新寫成一個(gè)Project,直接把Project中的代碼貼上了,大家要用的話,還要稍微修改一下。要說的一點(diǎn)是PDFCreator不支持多線程,所以如果程序本身是多線程的話,需要在代碼中增加一個(gè)鎖機(jī)制,保證PDF生成的調(diào)用是單線程的。還有打印機(jī)的名字用的是默認(rèn)值,沒有修改,不過這些問題是難不倒各位看官的。 該文章在 2020/4/3 22:12:39 編輯過 |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |