C#中调用PDFCreator生成PDF文件

http://blog.csdn.net/mcai4gl2/article/details/7294625

前一阵子做了一个生成报表的小project,生成的报表是关于股价的记录。没有什么现成的包和第三方程序给我们用,听说WPF渲染的页面可以之间存成PDF,不过只是道听途说,没敢真正实践,最后还是用了自己以前搞过的方法,Office Interop,在一个word文档中插入很多placeholder搞成template,然后用C#代码动态把PlaceHolder变成数据,然后保存。这个方法其实挺强大,不过有几个限制和不爽的地方。第一,程序运行的机器上要有Office安装,word是必须的,如果要生成图的话,还需要Excel. 第二,.NET Office Interop本质上还是COM的封装,性能和稳定性就不能太苛求了。第三,Office Interop搞起来还是挺烦的。抱怨了半天,不过这个方法还是可行的。不过最后要求生成PDF形式的报表,但是Office没有PDF生成的支持,这怎么办?想起自己每每需要生成PDF文件的时候直接用PDFCreator虚拟打印机就可以了,查了一下,果然,PDFCreator有COM API. 这下问题解决了。

在C#中如何调用PDFCreator生成PDF文件呢?

第一步:安装PDFCreator (这个好像是废话)

第二步:创建C#项目,加入PDFCreator.exe COM引用

第三步:参见如下代码:

  1. public override void Process(ITask task, int index)  
  2.         {  
  3.             if (!File.Exists(Path.Combine(FromLocation, FromFilename)))  
  4.             {  
  5.                 throw new FileNotFoundException("File: " + Path.Combine(FromLocation, FromFilename) + " does not exists");  
  6.             }  
  7.   
  8.             Monitor.Enter(lockObject);  
  9.   
  10.             clsPDFCreator creator = null;  
  11.   
  12.             try  
  13.             {  
  14.                 creator = new clsPDFCreator();  
  15.                 creator.eError += new __clsPDFCreator_eErrorEventHandler(creator_eError);  
  16.                 creator.eReady += new __clsPDFCreator_eReadyEventHandler(creator_eReady);  
  17.                 String paramters = "/NoProcessingAtStartup";  
  18.   
  19.                 if (!creator.cStart())  
  20.                 {  
  21.                     throw new Exception("Cannot launch PDFCreator. Error: " + Error);  
  22.                 }  
  23.   
  24.                 var opt = creator.cOptions;  
  25.                 opt.UseAutosave = 1;  
  26.                 opt.UseAutosaveDirectory = 1;  
  27.                 opt.AutosaveDirectory = this.ToLocation;  
  28.                 opt.AutosaveFormat = 0;  
  29.                 opt.AutosaveFilename = this.ToFilename;  
  30.                 creator.cOptions = opt;  
  31.   
  32.                 creator.cClearCache();  
  33.   
  34.                 creator.cDefaultPrinter = "PDFCreator";  
  35.   
  36.                 if (!creator.cIsPrintable(Path.Combine(FromLocation, FromFilename)))  
  37.                 {  
  38.                     throw new Exception("File: " + Path.Combine(FromLocation, FromFilename) + " is not printable.");  
  39.                 }  
  40.   
  41.                 creator.cPrintFile(Path.Combine(FromLocation, FromFilename));  
  42.                 creator.cPrinterStop = false;  
  43.   
  44.                 Ready = false;  
  45.                 var duration = new TimeSpan(0, 0, 0, TimeoutInSec);  
  46.   
  47.                 DateTime lastCheck = DateTime.Now;  
  48.                 DateTime startTime = lastCheck;  
  49.                 
  50.                 while (!Ready && ((lastCheck - startTime) < duration))  
  51.                 {  
  52.                     System.Threading.Thread.Sleep(500);  
  53.                     lastCheck = DateTime.Now;  
  54.                 }  
  55.   
  56.                 creator.cPrinterStop = true;  
  57.                 Thread.Sleep(1000);  
  58.                 creator.cClose();  
  59.   
  60.                 if (!Ready)  
  61.                 {  
  62.                     throw new Exception("PDF creation failed. This maybe due to timeout.");  
  63.                 }  
  64.             }  
  65.             finally  
  66.             {  
  67.                 Monitor.Exit(lockObject);  
  68.             }  
  69.         }  
  70.   
  71.         void creator_eReady()  
  72.         {  
  73.             this.Ready = true;  
  74.         }  
  75.   
  76.         void creator_eError()  
  77.         {  
  78.             Error = creator.cError.Description;  
  79.         }  

代码很好懂,自己很懒,没有把代码重新写成一个Project,直接把Project中的代码贴上了,大家要用的话,还要稍微修改一下。要说的一点是PDFCreator不支持多线程,所以如果程序本身是多线程的话,需要在代码中增加一个锁机制,保证PDF生成的调用是单线程的。还有打印机的名字用的是默认值,没有修改,不过这些问题是难不倒各位看官的。
阅读更多
换一批

没有更多推荐了,返回首页