PoDoFo的简单应用

来源:互联网 发布:java math保留两位小数 编辑:程序博客网 时间:2024/06/06 03:49

 一、 PDF开发库

             PDF文件格式很早就由Adobe公司推出来了,到今天已日趋完善,广泛应用于各行各业。但通常情况下,对于PDF文件的读操作,都是免费的,而编辑、创建等功能,

则是收费的。比如Adobe自己开发的Reader,以及现在广为流行的轻量级PDF工具Foxit Reader等等。这些Reader对应地还发布有PDF SDK,只是一般只有编程人员才会

关心这个。上面说的这两个:Adobe ReaderFoxitReader,其对应的PDF SDK,也只提供免费的view模块,而edit等其它模块都是收费的。Adobe PDF SDK和Foxit PDF

 SDK 资料很齐全,函数功能也很齐全,命名也很优雅。

           专门的PDF SDK中,PDFLib应该是一个相当成功的作品,只是它的售价有点偏高了,大约要2000美元,我找的就是PDFLib有多个版本:PDFLib lite, PDFLbi,PDFLib +

 PDI, PPS。对于lite版本,据说PDFLib还提供有源代码。

开源的库中PoDoFo是一个很不错的选择。

         PDF SDK还算是比较多的--当然,解析PDF文档那实在是太费劲了。如果你想要手动解析PDF文档,Adobe的官方网站上就有PDF文件格式的详细说明。

         关于免费的PDF SDK,网上免费的PDF SDK也不少,主要是提供给C/C++和JAVA用的,也有提供给PHP等程序用的。只是这些免费的PDF SDK------说实话,都不太好,

用。比如,上面说的PoDoFo,英文太差的人就不要用了,因为它是全英文文档说明,C/C++基础太差的人,也不要用了,因为它的前期准备工作实在是有点麻烦。当然,我这

里说它很麻烦,主要是针对于我的需求来说的。PoDoFo是开源的,要考虑到在各个平台上的应用,因此它本身,以及它所依赖的一些库,都只提供源代码,需要自己去编译。

         其它的PDF SDK我就没怎么研究,总的感觉是:JAVA的免费PDF SDK要比C/C++的貌似要多,要好用。

        copyright也是一个,凡是OFFICE文档,都是基本上想通的,建议你参考下WORD2PDF

二、编译生成免费的PoDoFo

    

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

用“o”来隔开。

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

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

编译过程见我另一编文章:http://blog.csdn.net/zxxssdsd/article/details/9454629

 

三、PODOFO简单应用

           在免费的PDF SDK中,我选择了PoDoFo,这也是无奈之举。因为我在网上搜索到的众多免费PDF SDK,绝大多数都是功能比较单一的。要么只能显示PDF,要么只能

创建PDF。而对PoDoFo的描述是:操纵PDFOK。

 按README.HTM所说,先生成sln文件,然后再用VC打开sln文件,则会发现你打开的解决方案中,会包含一大溜的工程。这些工程,除了PoDoFo本身外,还有一些小工具和

测试工程。这些东西都是很有用的,是我们在实际开发中很重要的参考。 

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

到中文版的这些文档。

3.1 HelloWorld

       

 

         编译HelloWord 在vs工程目录中的\examples\helloworld\Debug目录生成HelloWorld.exe 这个要在cmd中运行  cd 到该目录 

helloWord.exe a.pdf便在 \examples\helloworld\Debug中生成一个a.pdf 内容为Helloworld

3.2 建立开发环境

创建一个VC工程,然后参考PoDoFo.sln中的测试工程,设置好工程的各项属性。

这里最重要的,仍然是两个设置:1.INCLUDE包含路径,它必须指向PoDoFo.h所在目录以及相关目录;2.LIB目录指向编译好的PoDoFo.lib所在路径,同时在工程的附加依赖库

属性必须填上PoDoFo.lib及其相关依赖。

必须项

  zlibd.lib

  freetype240.lib

  podofo.lib

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

#include <podofo.h>#pragma comment(lib,"WS2_32.lib")#ifdef DEBUG#pragma comment(lib,"podofod.lib") #pragma comment(lib,"zlibd.lib")        #pragma comment(lib,"freetype240_D.lib")      #else        #pragma comment(lib,"freetype240.lib") #pragma comment(lib,"zlib.lib")#pragma comment(lib,"podofo.lib")#endif/* * All podofo classes are member of the PoDoFo namespace. */using namespace PoDoFo;

 

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

 3.3   PODoFo 库类说明 及应用举例

 

1、“整个文件虚构”   

                对于PoDoFo来说,就是PdfDocument类。不过这个类貌似是个抽象类(我不记得自己是否确认过这点,因为我一般都不直接使用它);

                我们一般使用的是它的两个子类:PdfStreamedDocument类  :主要用于创建一个新的PDF文档,

                                                             和   PdfMemDocument类而后者主要用于处理现有的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,还是以页为处理单位。

 生成PDF代码

 PdfStreamedDocument document( pszFilename ); PdfPage* pPage; PdfPainter painter; PdfFont* pFont; pPage = document.CreatePage( PdfPage::CreateStandardPageSize( ePdfPageSize_A4 ) ); if( !pPage ) {  PODOFO_RAISE_ERROR( ePdfError_InvalidHandle ); } painter.SetPage( pPage ); pFont = document.CreateFont( "Arial" ); if( !pFont ){ PODOFO_RAISE_ERROR( ePdfError_InvalidHandle ); }pFont->SetFontSize( 18.0 );painter.SetFont( pFont );painter.DrawText( 56.69, pPage->GetPageSize().GetHeight() - 56.69, "Hello World!" );painter.FinishPage();


中文问题

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

据我了解,最初的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还是很优秀的,但是目前问题也比较多。使用起来比较复杂,就是一个很严重的问题。

原创粉丝点击