LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

[点晴永久免费OA]C#中调用PDFCreator生成PDF文件

admin
2020年4月3日 22:12 本文热度 3012
前一阵子做了一个生成报表的小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引用

第三步:参见如下代码:

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生成的调用是单线程的。还有打印机的名字用的是默认值,没有修改,不过这些问题是难不倒各位看官的。

该文章在 2020/4/3 22:12:39 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2024 ClickSun All Rights Reserved