PDF文件的读写(使用SDK).(三).PoDoFo的简单应用
2011年05月02日
在免费的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: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吧……
发表评论
-
Win7环境下安装Mac OS双系统及Iphone开发SDK
2012-01-20 00:22 756Win7环境下安装Mac OS双系统及Iphone开发SDK ... -
WIN32 SDK中树形视图与图像列表的配合使用实例(一)
2012-01-20 00:21 809WIN32 SDK中树形视图与图像列表的配合使用实例(一) ... -
使用Azure SDK 1.4.1中的Web Deploy
2012-01-20 00:21 521使用Azure SDK 1.4.1中的Web Deploy ... -
宇龙酷派WINCE6.0 SDK配置方法
2012-01-20 00:21 1091宇龙酷派WINCE6.0 SDK配置 ... -
传说中的演讲稿
2012-01-19 01:17 542传说中的演讲稿 2011年04月07日 ... -
感恩演讲稿
2012-01-19 01:16 606感恩演讲稿 2010年10月21 ... -
升学宴演讲稿
2012-01-19 01:16 651升学宴演讲稿 2010年08 ... -
宿命论,三年前的演讲稿!,怀念那些力不从心的光景。。
2012-01-19 01:16 609宿命论,三年前的演讲稿 ... -
电脑硬件参数知识cpu篇
2012-01-17 00:35 743电脑硬件参数知识cpu篇 2011年05月12日 看参数 ... -
[论文]企业网中代理服务器的检测程序开发
2012-01-17 00:34 785[论文]企业网中代理服 ... -
转:Property in C++
2012-01-17 00:34 500转:Property in C++ 2011年03月14日 ... -
4-25Linux下的一些简单网络配置命令介绍
2012-01-17 00:34 6944-25Linux下的一些简单网络配置命令介绍 2011年0 ... -
Leica TPS基础知识
2012-01-17 00:34 876Leica TPS基础知识 2011年0 ... -
如何培养一年级学生良好的学习习惯
2012-01-15 14:55 568如何培养一年级学生良 ... -
培养一年级学生良好学习习惯
2012-01-15 14:55 598培养一年级学生良好学 ... -
《烟灰缸里的回忆》第一章节
2012-01-15 14:55 656《烟灰缸里的回忆》第 ... -
如何培养一年级学生良好的学习习惯
2012-01-15 14:55 467如何培养一年级学生良好的学习习惯 2011年06月28日 ...
相关推荐
您可以上传小于50MB的文件Beginning.iOS.5.Development.Exploring.the.iOS.SDK.pdf.zip ) 您可以上传小于50MB的文件Beginning.iOS.5.Development.Exploring.the.iOS.SDK.pdf.zip ) 您可以上传小于50MB的文件...
S3 PHP SDK.pdf 文档说明
最新版本的ios5全方位讲解 xcode4 的新特性 和用法
C++文件读写函数介绍.pdf
Windows文件读写监控系统.pdf
java文件读写宣贯.pdf
Java文件读写操作大全.pdf
PDF Viewer SDK 是面向为了开发PDF显示方法的开发者的配套元件。使用此产品的话,可以开发加有与PDF的显示相关的独自功能的系统和应用程序。
C#读写XML文件 .pdfC#读写XML文件 .pdfC#读写XML文件 .pdf
光盘的读写工作原理.pdf光盘的读写工作原理.pdf光盘的读写工作原理.pdf光盘的读写工作原理.pdf光盘的读写工作原理.pdf
本文档是一个完整的关于ABB机器人示教器二次开发的PCSDK文档,详细介绍了如何对ABB机器人示教器进行二次开发,是进行ABB机器人二次开发不可缺少的指南。
一种基于Java注解和反射机制的Excel文件读写操作方法.pdf
C语言读写文件操作.pdf
c++文件读写.pdf
FAT文件系统的SD卡单片机读写方法详解.pdf
实验五存储器读写实验报告.pdf实验五存储器读写实验报告.pdf实验五存储器读写实验报告.pdf实验五存储器读写实验报告.pdf实验五存储器读写实验报告.pdf实验五存储器读写实验报告.pdf实验五存储器读写实验报告.pdf实验...
Android开发进阶:如何读写Android文件.pdf
WindowsSDK.pdf
virtualbox5.0.10sdk.pdf
Packt.Corona.SDK.Mobile.Game.Development.Beginners.Guide.pdf