C#中呼叫PDFCreator生成PDF檔案
阿新 • • 發佈:2021-06-22
在C#中如何呼叫PDFCreator生成PDF檔案呢?
第一步:安裝PDFCreator (這個好像是廢話)
第二步:建立C#專案,加入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; }
程式碼很好懂,自己很懶,沒有把程式碼重新寫成一個Project,直接把Project中的程式碼貼上了,大家要用的話,還要稍微修改一下。要說的一點是PDFCreator不支援多執行緒,所以如果程式本身是多執行緒的話,需要在程式碼中增加一個鎖機制,保證PDF生成的呼叫是單執行緒的。還有印表機的名字用的是預設值,沒有修改,不過這些問題是難不倒各位看官的。
轉:https://blog.csdn.net/mcai4gl2/article/details/7294625
private bool PrintIt(int FileTyp, string wordfilepath, string pdfdir, out string pdfnameorerr) { try { string fname=""; string DefaultPrinter = _PDFCreator.cDefaultPrinter; FileInfo fi; PDFCreator.clsPDFCreatorOptions opt; //for (int i = 0; i < filepath.Length; i++) //{ fi = new FileInfo(wordfilepath.ToString()); if (fi.Name.Length > 0) { if (fi.Name.IndexOf(".") > 1) { fname = fi.Name.Substring(0, fi.Name.IndexOf(".")); } else { fname = fi.Name; } if (!_PDFCreator.cIsPrintable(fi.FullName)) { MessageBox.Show("File '" + fi.FullName + "' is not printable!", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } opt = _PDFCreator.cOptions; opt.UseAutosave = 1; opt.UseAutosaveDirectory = 1; opt.AutosaveDirectory = pdfdir; opt.AutosaveFormat = FileTyp; if (FileTyp == 5) { //opt.BitmapResolution = 72; } opt.AutosaveFilename = fname; _PDFCreator.cOptions = opt; _PDFCreator.cClearCache(); DefaultPrinter = _PDFCreator.cDefaultPrinter; _PDFCreator.cDefaultPrinter = "PDFCreator"; //_PDFCreator.cVisible = false; _PDFCreator.cPrintFile(fi.FullName); _PDFCreator.cPrinterStop = false; } ReadyState = false; timer2.Interval = maxTime * 1000; timer2.Enabled = true; while (!ReadyState && timer2.Enabled) { Application.DoEvents(); } timer2.Enabled = false; _PDFCreator.cPrinterStop = true; _PDFCreator.cDefaultPrinter = DefaultPrinter; //System.Threading.Thread.Sleep(5000); //} pdfnameorerr = fname; return true; } catch (Exception ex) { //IsWordToPdf = false; pdfnameorerr = ex.Message; return false; } } private bool PrintIt(int FileTyp, string wordfilepath, string pdfdir, out string pdfnameorerr) { try { string fname=""; string DefaultPrinter = _PDFCreator.cDefaultPrinter; FileInfo fi; PDFCreator.clsPDFCreatorOptions opt; //for (int i = 0; i < filepath.Length; i++) //{ fi = new FileInfo(wordfilepath.ToString()); if (fi.Name.Length > 0) { if (fi.Name.IndexOf(".") > 1) { fname = fi.Name.Substring(0, fi.Name.IndexOf(".")); } else { fname = fi.Name; } if (!_PDFCreator.cIsPrintable(fi.FullName)) { MessageBox.Show("File '" + fi.FullName + "' is not printable!", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } opt = _PDFCreator.cOptions; opt.UseAutosave = 1; opt.UseAutosaveDirectory = 1; opt.AutosaveDirectory = pdfdir; opt.AutosaveFormat = FileTyp; if (FileTyp == 5) { //opt.BitmapResolution = 72; } opt.AutosaveFilename = fname; _PDFCreator.cOptions = opt; _PDFCreator.cClearCache(); DefaultPrinter = _PDFCreator.cDefaultPrinter; _PDFCreator.cDefaultPrinter = "PDFCreator"; //_PDFCreator.cVisible = false; _PDFCreator.cPrintFile(fi.FullName); _PDFCreator.cPrinterStop = false; } ReadyState = false; timer2.Interval = maxTime * 1000; timer2.Enabled = true; while (!ReadyState && timer2.Enabled) { Application.DoEvents(); } timer2.Enabled = false; _PDFCreator.cPrinterStop = true; _PDFCreator.cDefaultPrinter = DefaultPrinter; //System.Threading.Thread.Sleep(5000); //} pdfnameorerr = fname; return true; } catch (Exception ex) { //IsWordToPdf = false; pdfnameorerr = ex.Message; return false; } }