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引用
第三步:参见如下代码:
- 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生成的调用是单线程的。还有打印机的名字用的是默认值,没有修改,不过这些问题是难不倒各位看官的。
C#中调用PDFCreator生成PDF文件相关推荐
- java调用wkhtmltopdf生成pdf文件,美观,省事
最近项目需要导出企业风险报告,文件格式为pdf,于是搜了一大批文章都是什么Jasper Report,iText ,flying sauser ,都尝试了一遍,感觉不是我想要的效果, 需要自己调整好多 ...
- java 字符串转pdf文件_java中根据模板生成pdf文件
原标题:java中根据模板生成pdf文件 阅读目录 简介 业务需求 引入jar包 pdf模板文件与方法参数 代码部分 总结归纳 回到顶部 简介 本文使用java引入apach提供的pdf操作工具生成p ...
- java按模板生成pdf_java中根据模板生成pdf文件
简介 本文使用java引入apache提供的pdf操作工具生成pdf文件,主要是根据需求开发了一个util类,记录一下学习和开发过程. 业务需求 因为业务需要,对于不同的用户要生成一个不同的pdf文件 ...
- Android生成pdf文件之PdfDocument及踩过的坑
有时候项目中可能会遇到这样的需求,如何将android中界面显示的内容生成pdf,这里讲述的是使用android原生的PdfDocument,并没有使用框架,其一是使用起来非常的简单,但是也会也到一些 ...
- 生成PDF文件方案--学习中
PDF文件是目前比较流行的电子文档格式,在办公自动化(OA)等软件的开发中,经常要用到该格式,但介绍如何制作PDF格式文件的资料非常少,在网上搜来搜去,都转贴的是同一段"暴力"破解 ...
- java中freemarker使用ftl模版生成PDF文件
说明 调用方法生成PDF时,使用的ftl模版,以及字体都是从jar中读取的,无需担心多节点部署 引用jar <dependency><groupId>org.freemarke ...
- php输出PDF的文件流_怎么用PHP在HTML中生成PDF文件
译文:使用PHP在html中生成PDF 译者:dwqs 利用PHP编码生成PDF文件是一个非常耗时的工作.在早期,开发者使用PHP并借助FPDF来生成PDF文件.但是如今,已经有很多函数库可以使用了, ...
- PHP中使用mpdf导出PDF文件以及生成PDF的方法
电子书内容介绍了关于PHP.核心技术.实践方面的内容,目前豆瓣.亚马逊.当当.京东等电子书综合评分为:7.1 PHP中使用mpdf 导出PDF文件的实现方法 mPDF是一个很强大的PDF生成库,能基本 ...
- java生成pdf盖章合同_Java中使用 FreeMarker 生成pdf盖章合同文件
[实例简介] 1.html模板+model数据,通过freemarker进行渲染,便于维护和修改 2.渲染后的html流,可通过Flying Saucer组件生成pdf文件流,或者生成pdf后再转成j ...
- 使用iText生成PDF文件中创建表格
前言 使用iText的JAR包如下 <dependency><groupId>com.itextpdf</groupId><artifactId>ite ...
最新文章
- Open3d学习计划—高级篇 7(颜色映射)
- canvas绘制弯月
- 中国官方唯一无人车路测报告一出炉,百度股价又涨了
- HijackThis日志细解【简明教程增强版】(五)
- linux编译c++11的代码
- WPF中的动画——(二)From/To/By 动画(二)
- 单应性矩阵和仿射变换_单应矩阵 基本矩阵 本质矩阵的区别与联系
- pat 乙级 1031 查验身份证(C++)
- 【HDU - 5489】Removed Interval(离散化,权值线段树,思维,最长上升子序列)
- 多核电脑的配件(CPU)
- 实时监控 轻松玩转IT运维
- 如何优雅的调用第三方接口
- access日期如何增加年数_ACCESS 时间日期操作大全
- mysql两张大表关联查询_关于mysql当中给数据量特别大的两个表做关联查询的时候解决查询速度很慢的解决方法...
- 【渝粤题库】陕西师范大学163107饭店管理 作业【高起专】
- FFmpeg入门详解之114:DirectShow读取摄像头数据
- 学习java随堂练习-20220617
- AcWing 2048. 干草
- 75%医用输液泵受漏洞威胁 360专家呼吁构建数字安全防御体系
- web渗透—暴力破解
热门文章
- oracle客户端sqlplus镜像(可通过ssh客户端远程连接操作sqlplus命令)
- Json Editor命令行版
- 代码检测利器“利特莫斯”之优化血泪史
- Go语言后端开发技术栈
- 关于MDK调试stm32f072vbt6(HAL库)内部flash在擦除仿真时,卡死在擦除函数,同时弹出“Cannot access target.shutting down debug sessi
- mysql的R树_R*树
- 在jQuery中提交表单的方式有哪些
- 【报告分享】2021年中国网络文学出海报告-艾瑞咨询(附下载)
- Dos Cmd命令整理
- 软件工程的知识思维导图