新闻资讯 | 控件产品 | 技术文章 | 购物车 | 合作伙伴 | 问题解答 | 电子简报 | PDF论坛 | 资源下载
您现在的位置:技术文章>PDF开发篇 首页|PDF应用篇|PDF开发篇|解决方案

PDF文件的读写(使用SDK)

发布日期:2012-1-10 作者:未知 出处:CSDN

 

 原文地址:http://blog.csdn.net/kraussyin/article/details/7053880

(一)闲谈PDF SDK

最近需要对PDF文件进行一些简单操作,因此花费了点时间,研究了一把。

PDF文件格式很早就由Adobe公司推出来了,到今天已日趋完善,广泛应用于各行各业。但通常情况下,对于PDF文件的读操作,都是免费的,而编辑、创建等功能,则是收费的。比如Adobe自己开发的Reader,以及现在广为流行的轻量级PDF工具Foxit Reader等等。其实,这些Reader对应地还发布有PDF SDK,只是一般只有编程人员才会关心这个。上面说的这两个:Adobe Reader和FoxitReader,其对应的PDF SDK,也只提供免费的view模块,而edit等其它模块都是收费的。这个就比较让人头大了。

哪里有需求,哪里就有市场。由于PDF文件格式应用实在是太广泛了,因此很多人都盯住了这块蛋糕。对于开发人员来说,专门的PDF SDK中,PDFLib应该是一个相当成功的作品,只是它的售价有点偏高了,大约要2000美元……因此,更多像我这样的人,就喜欢去找点免费的,最好是开源的东西来用用。这方面,则PoDoFo是一个很不错的选择。

事实上,总的来说,PDF SDK还算是比较多的--当然,我们这里不关心手动去解析PDF文档,因为那实在是太费劲了。如果你想要手动解析PDF文档,也不是没有办法,Adobe的官方网站上就有PDF文件格式的详细说明。不过,有三类人不可以去研究它:一是英文不太好的人--貌似我还没看到这个文档的中文翻译;二是缺乏耐心的人--这个文档实在是有那么一点点长,内容有那么一点点多;三是缺乏时间的人--相对于使用PDF SDK来操纵PDF文件来说,手动解析需要消耗的时间和精力实在是太大了。

很不幸的事情是,上面说的三条,我全占了。因此我只好研究下PDF SDK。

经过我手的PDF SDK,倒是不算多,一双手完全可以数得过来。

首先,我跑网上找到的是Adobe PDF SDK和Foxit PDF SDK。老大就是老大!资料很齐全,函数功能也很齐全,命名也很优雅,这些都没的说,但就是缺乏我所需要的编辑和创建模块。付钱购买?这个我暂时就不考虑了。

其次,我找的就是PDFLib。它有多个版本:PDFLib lite, PDFLbi,PDFLib + PDI, PPS。对于lite版本,据说PDFLib还提供有源代码,只是这个版本的功能实在是少得可怜,不提它也罢。而从PDFLib(貌似这个叫标准版?)开始,就要收费了。你在写程序之前,必须要找PDFLib官方购买一个license,并且在使用PDFLib时,设置这个license,否则PDFLib在使用过程中,一来会在生成的PDF文档中自动打印一个水印,二来在使用某些功能的时候,会提示没有授权(此功能会被屏蔽)。唉,又要钱啊……打打酱油算了。

最后,是关于免费的PDF SDK。事实上,网上免费的PDF SDK也不少,主要是提供给C/C++和JAVA用的,也有提供给PHP等程序用的。只是这些免费的PDF SDK------说实话,都不太好用。比如,上面说的PoDoFo,英文太差的人就不要用了,因为它是全英文文档说明,C/C++基础太差的人,也不要用了,因为它的前期准备工作实在是有点麻烦。当然,我这里说它很麻烦,主要是针对于我的需求来说的。PoDoFo是开源的,要考虑到在各个平台上的应用,因此它本身,以及它所依赖的一些库,都只提供源代码,需要自己去编译。

其它的PDF SDK我就没怎么研究,总的感觉是:JAVA的免费PDF SDK要比C/C++的貌似要多,要好用(这个可能有点主观了)。

(二)编译生成免费的PoDoFo

PoDoFo是一个免费的开源的PDF开发库。PoDoFo这个名字很有趣,根据它附带的README.HTM文件说明,它源于:Portable Document Format。三个大写字母就是“PDF”,而用“o”来隔开。

PoDoFo下载地址:http://podofo.sourceforge.net/index.html

我写本文时,它刚发布0.9.1版没多久。

PoDoFo开发库需要依赖的GUN公共库比较多 ,但在WIN32下最少的依赖库需求只有三个,而其中需要编译的只有两个。

这三个至少需要的库,分别是:zlib, libjpeg和freetype。其中需要编译的则是:libjpeg和freetype。

编译libjpeg和freetype并不麻烦,它们的编译过程在PoDoFo自带的README.HTM中均有说明。只是我感觉README.HTM这个文件貌似比较老,不是针对最新的0.9.x版本编写的,因此实际的编译过程和上面所写的东西略有出入。

从网上下载的libjpeg压缩包中,自带有nmake的makefile文件,你仔细找找就可以发现,某些文件有vc之类的字样。不过这里需要注意的是,jconfig.h这个文件,是需要你自己指定的。一般来说,如果使用VC编译,可以直接copy jconfig.vc jconfig.h。这样就直接使用了它自带的jconfig.vc这个文件来编译。

至于freetype的编译就更简单了。因为它本身就带有vc 2005和vc2008的工程文件。你用vc2005或者vc2008打开它们,直接生成就是。

另外的zlib是不需要编译的,直接从网上下载下来就可以使用了。但需要注意的是,你下载下来的东西,必须要包含zlib1.dll,zlib1.lib和相关的.h文件。zlib1.dll是PoDoFo程序运行时需要的,而zlib1.lib和相关的.h文件,是编译PoDoFo需要的。

除了上面说的三个依赖模块外,在WIN32下,还可能会使用到libtiff这个库,这是关于tiff图像处理的,不是特别常用。另外,还可能会有libpng库,用来处理png图片。

由上,你若是使用PoDoFo来操纵PDF文件,则除了你自己本身写的程序外,则至少还包含zlib1.dll和PoDoFo.dll这两个动态链接库,你的程序才可以运行。不过还好,这些动态库都是绿色的。

根据PoDoFo中README.HTM的建议,在WIN32下编译PoDoFo模块,除了上面的准备外,最好先使用CMake这个工具生成VC的sln文件,然后再VC中打开sln文件,再进行编译。README.HTM中要求的CMake版本是2.6.x,而测试成功的是VC2008的sln文件生成。事实上CMake只要2.6.x以上版本都可以。我用的就是2.8.4版本,而VC我用的版本则是VC2005,同样也成功生成了sln文件,只不过,其中有个别测试工程的细微之处需要略为修正。README.HTM中提供的生成脚本如下(DOS控制台下的批处理文件):

del cmakecache.txt set FTDIR=C:/developer/freetype-2.3.5 set FTLIBDIR=C:/developer/freetype-2.3.5/objs/win32/vc2008 set JPEGDIR=C:/Developer/jpeg set ZLIBDIR=C:/developer/zlib123-dll cmake -G "Visual Studio 9 2008" ../podofo-src -DCMAKE_INCLUDE_PATH="%FTDIR%/include;%JPEGDIR%/include;%JPEGDIR%;%ZLIBDIR%/include" -DCMAKE_LIBRARY_PATH="%FTLIBDIR%;%FTDIR%/lib;%JPEGDIR%/lib;%JPEGDIR%;%ZLIBDIR%/lib" -DPODOFO_BUILD_SHARED:BOOL=FALSE -DFREETYPE_LIBRARY_NAMES_DEBUG=freetype239MT_D -DFREETYPE_LIBRARY_NAMES_RELEASE=freetype239MT

(三)PoDoFo的简单应用

在免费的PDF SDK中,我选择了PoDoFo,这也是无奈之举。因为我在网上搜索到的众多免费PDF SDK,绝大多数都是功能比较单一的。要么只能显示PDF,要么只能创建PDF。而对PoDoFo的描述是:操纵PDF……OK,那就是它了。

按前面所说的操作,编译好PoDoFo,这时候,你会得到好几个文件。不过,你需要注意的,只有两个:PoDoFo.dll和PoDoFo.lib。前者是在运行程序时需要的,而后者是在编译时需要的。当然,如果你按README.HTM所说,先生成sln文件,然后再用VC打开sln文件,则会发现你打开的解决方案中,会包含一大溜的工程。这些工程,除了PoDoFo本身外,还有一些小工具和测试工程。这些东西都是很有用的,是我们在实际开发中很重要的参考。

我们在实际开发中的另一个重要的参考,就是PoDoFo自带的说明文档。按照通常的编程惯例,这些文档中,最重要的又属《编程指南》和《类/函数参考手册》。我暂时尚未找到中文版的这些文档。

创建一个VC工程,然后参考PoDoFo.sln中的测试工程,设置好工程的各项属性。当然,这里最重要的,仍然是两个设置:1.INCLUDE包含路径,它必须指向PoDoFo.h所在目录以及相关目录;2.LIB目录指向编译好的PoDoFo.lib所在路径,同时在工程的附加依赖库属性必须填上PoDoFo.lib及其相关依赖。

在CPP文件中填入代码:include <podofo.h>,然后指示使用名空间PoDoFo:using namespace PoDoFo;

点击编译,测试一下设置是否正确。

如果需要在PDF文件中填入点什么东西,那么我们就特别要注意这句话:在哪个PDF文件上的哪一页上的哪个位置写入什么样子的什么内容。

1.“哪个PDF文件”。这个问题对于PoDoFo来说,就是PdfDocument类。不过这个类貌似是个抽象类(我不记得自己是否确认过这点,因为我一般都不直接使用它),我们一般使用的是它的两个子类:PdfStreamedDocument类和PdfMemDocument类。前者主要用于创建一个新的PDF文档,而后者主要用于处理现有的PDF文档。这两个类我都研究不深,但我感觉PdfMemDocument类似乎有一个缺陷:它必须要有一个input file和output file,且二者不能同名。这也就意味着,一般来说,你不可以直接对现有的PDF文件进行修改,而需要先读入现有PDF文件,修改完成后再写入另一个PDF文件。这个问题的来源,应该是PDF文件的一般打开方式:它是使用流的方式打开的。使用这种方式打开,最大的优点就是打开的初始速度很快,你需要什么东西,则再临时读入,总体上占用内存比较少。当你写入PDF文档时,你的PDF程序,就相当于一个抽水机,把数据流从一个文件抽(复制)到另一个文件。如果两个文件同名了,则读和写就会发生冲突。

解决这个问题的其中一个办法,就是把要读入的文件,一次性全部读入内存中,然后回写的时候,就不用考虑同名的问题了。

2.“哪一页”。这个问题对于PoDoFo来说,就是PdfPage类。这个类对于具体的修改操作来说,只能算是一个过渡。它可以用来指向PdfDocument 的一个页面位置。

3.“哪个位置写入什么样子的什么内容”。这个问题,对于PoDoFo来说,都和PdfPainter类有关。但又不是全靠PdfPainter类来操纵。比如,字体设置,一般会去实例化一个PdfFont类。使用PoDoFo来操纵PDF,PdfPainter是一个非常重要的类,其重要程度,我个人感觉甚至要超过PdfDocument类。

操作完成后,不要忘记:painter.FinishPage();

看到这句,可能大家都有些恍然:PDF,还是以页为处理单位。

PoDoFo的具体使用,我建议大家还是去参考它的例程和文档资料,这里不多描述。

在我的实际使用过程中,碰到了一个很有意思的问题:中文显示。

据我了解,最初的PDF SDK,或多或少都有多国语言显示的问题。从DOS时代过来的人,当然不会觉得惊讶,因为在N年前DOS下显示中文就是一个很大的问题。现在使用UNICODE编码,似乎一切问题都解决了,可历史的惯性,从来不是那么容易就消除的。

我用的算是WIN32版本的PoDoFo吧,Font的编码默认是WINDOWS ANSI,显示英文是没什么问题的,但写入中文,则会显示乱码。

其实我知道,这个问题和使用的字体名称,字体编码都有关系,但我没在PoDoFo的手册上找到问题的解决方法(这个可能和我看手册不认真有关系),只是在例程上找到一个CreationTest工程。这个工程是写入日文之类的东西的(由于我系统上没有安装其它国家的文字,看到的都是乱码)。CreationTest这个工程中的东西似乎稍稍有些复杂,幸好PoDoFo的开发工程师一周后答复了我的疑问,给出了下面代码:

PdfIdentityEncoding encoding(0, 0xffff, false);PdfFont* pUnicFont = pdfStream.CreateFont( "SimHei", &encoding, false);

总体来说,PoDoFo还是很优秀的,但是目前问题也比较多。使用起来比较复杂,就是一个很严重的问题。部分演示代码也貌似也得有问题,比如我拿到的0.9.0版中关于PDF 水印的代码,对我来说,就没有任何价值。

衷心希望PoDoFo能做得更好!只是目前,我还是考虑换个PDF SDK吧……

发布人:管理员 【报告错误】·【推荐好友】·【打印文章】
相关评论 本文现有 0 条评论 评分人数: 0 平均分: 0
相关评论
用户名: 密  码:
说明:输入正确的用户名和密码才能参与评论。如果您不是本站会员,你可以注册为本站会员。
注意:文章中的链接、内容等需要修改的错误,请用报告错误,以利文档及时修改。
注意:请不要在评论中含与内容无关的广告链接,违者封ID
文章搜索
推荐文章
循序渐进学习iTextShar
循序渐进学习iTextShar
循序渐进学习iTextShar
循序渐进学习iTextShar
循序渐进学习iTextShar
循序渐进学习iTextShar
循序渐进学习iTextShar
循序渐进学习iTextShar
循序渐进学习iTextShar
循序渐进学习iTextShar
热门点击
一个简单的PDF文件结构的分析(22340)
PHP的FDF文档支持(16147)
用C#制作PDF文件全攻略(13578)
Word转换PDF格式的C#或(12118)
pdfMaker文章:PDF加(11626)
ITextRenderer学习(11083)
PDF文件加密仿真(11035)
怎样用iReport制作Web(10383)
iText PDF概述(1)(9887)
循序渐进学习iTextShar(9833)
热门评论
从pdf文档中提取出文本(8)
PDFlib开发:创建超文本元(2)
客户端自动打印PDF(Prin(2)
浅谈PDFlib中文输出(一)(2)
xml的转换之pdf 2 ((1)
xml的转换之pdf 1 (x(1)
PDF知识讲座(1)(1)
PDFBox使用简介(1)
使用正则表达式计算PDF文档的(1)
word转pdf(1)