使用iTextSharp修改PDF文件 发布日期:2006-7-13 9:01:45 作者:pansky 出处:http://kb.csdn.net |
最近因为工作需要,公司让我写个小程序,对大量的PDF文件(超过2500份)的页眉页脚等区域进行修改。简单地说,就是将一批PDF文档的页眉页脚进行修改,然后生成新的PDF文件。 作为一个程序员,首先当然是试用SDK,从网上DOWN了来,好大呀, 第二条路,试用收费的Aspose,这个东东确实不错,可惜过于复杂,对我现的任务也大材小用了。最最重要的是,估计公司不会掏钱买的(只是一次性的任务,这个程序估计以后就没多少机会可以用了),但是公司又不允许使用D版的。 算了,看开源的吧。 重量级人物出场了:iTextSharp,鼓掌。。。。。 这个iTextSharp确实是个好东西,可以创建、读取PDF格式的文档,虽然我的需求比较简单,但我首先还是基本上、完整地看完了它的相关文档,不喜欢英文的同志,可以搜索一篇《用C#制作PDF文件全攻略》(苟安廷),这篇 具体使用iTextSharp的方法,我这里就不细说了,因为非常简单,仔细看看它的文档,应该都可以很轻松地创建、读取PDF文件。我这里就只说说我在使用过程中碰到的一些问题,让后来的人少走一些弯路: 1、 PDF文件从理论上来说,只要创建成功之后,就不能再修改。 因为我需要修改原来的PDF文件,将它的页眉页脚去掉,然后换上新的页眉页脚。所以,我最开始对怎么只取得原始文件中的内容区域(是去掉了页眉、页脚、左边固定区域、右边固定区域的一个矩形区域),研究了很久。调用了其中的GetImportedPage方法,得到字符串,然后通过分析该字符串(是极其粗略的分析,因为PDF文件格式的标志太多,后面会有相关说明),去掉其中不需要的部分,再将剩下的其它部分进行保存,生成新的PDF文件。 理论上这种方法是正确的,也比较符合我们的一般逻辑思维(因为我们对已生成的文档、程序进行修改,大多数情况下都是用类似方法,比如:对某个程序进行解密等等)。我也确实按这种方法得到了符合要求的、新的PDF文件,但随即就发现了该方法其实不具备通用性,即对某篇文件是有效的,但对另一篇文件却有可能会造成格式错位。 因为分析PDF文件的格式是一件非常麻烦的事情,很多明明应该是在内容区域的字节,却显示在页眉处,如果我再分析到里面最细小的、每一个标志位,还不如直接看它的SDK,而且这样的话,在规定的时间里,这个程序也将完不成了。 解决办法: 我先研究了Acrobat里的crop,它为什么可以这么精确的剪裁呢? 结果让我哑然失笑,原来它的crop也不是真正的剪裁,而只是把需要的剪裁掉的区域屏蔽掉了而已,如果再回到crop里,进行上、下、左、右的设置,原来看起来好像被剪裁掉的区域仍然会显示出来,呵呵,有意思。 好的,现在心里有底了,大概知道怎么做了,这时再仔细看看iTextSharp的文档,发现有一段话以前没有注意到: If you have an existing PDF file that represents a form, you could copy the pages of this form and paint text at precise locations on this form. You can\'t edit an existing PDF document, by saying: for instance replace the word Louagie by Lowagie. To achieve this, you would have to know the exact location of the word Louagie, paint a white rectangle over it and paint the word Lowagie on this white rectangle. Please avoid this kind of \'patch\' work. Do your PDF editing with an Adobe product. 呵呵,跟我想的一样,就是用新的区域,把需要剪裁的区域给覆盖掉。 这就容易多了,先用iTextSharp的Template功能,把自己需要的文字、图片、表格放到Template里,然后把整个的Template加到合适的位置,即可。 哦,别忘了,得先在Template里加个白色的矩形框,放在最底层。 注:上面提到了PDF文件的格式,其实PDF文件的格式非常有趣,是的,非常有趣。相关的信息,可参考网上的《一个简单的PDF文件结构的分析》等文章。否则当你看到<BT>、<ET>、/F1、TF时,你会感觉莫明其妙的。 2、 PDF文件中的属性,不是我们一般意义上的文件的属性。 这一点开始让我走了一段弯路,我用iTextSharp中的相关函数,在Document.Opent()之前,设置了相关的属性,如:subject/author/title等等,但奇怪的是,生成新的PDF文件中,我用一般的看某一个文件属性的方法,却没有看到预料中的属性,都是空的。 后来,经过有经验的同事提醒,才知道:原来所谓的PDF文件的属性,是要在Acrobat Reader的某个菜单中才能看到的。 呵呵,以前对Acrobat的应用就基本上只有对文件进行互相转换,没用过其它太多的功能,没有经验呀。 |
相关文章
- 使用iTextSharp修改PDF文件
- 使用Adobe Acrobat Pro DC 删除pdf文件中的空白页
- C# 打印PDF文件之使用不同打印机打印所有页面或部分页面
- 使用iTextSharp的在C#中旋转PDF
- 使用John the ripper 破解RAR、ZIP、Word、Excel、PDF文件密码
- 使用iText对pdf做权限的操作(不允许修改,不允许复制,不允许另存为),并且加水印等
- 使用 Chainlit, Langchain 及 Elasticsearch 轻松实现对 PDF 文件的查询
- 使用Electron打包vue文件变成exe应用程序-三、修改vue项目
- 使用 pdf.js 在网页中加载 pdf 文件
- 如何使用ILAsm与ILDasm修改.Net exe(dll)文件