免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4539 | 回复: 6

请问谁能知道怎么在一个应用程序中显示pdf?(集成) [复制链接]

论坛徽章:
0
发表于 2008-01-05 13:53 |显示全部楼层
10可用积分
我现在使用的是delphi, 需要能够显示pdf文件,
而pdf文件是保存在数据库之中,为了保密的原因,不能在本地有文件存在。
而近期会有计划用wine把delphi开发的程序转移到linux环境下进行,所以这个功能必须要和wine相容。

现在我的计划是使用activeX的方式调用 adobe reader来开启,文件还是只能缓存在本地,只是名字改得隐秘一些。
但是考虑到未来需要转移到linux下使用,可能会有些问题。

请问各位,有什么好的方法在应用程序中显示pdf文件?

论坛徽章:
0
发表于 2008-01-07 09:52 |显示全部楼层
想一劳永逸就要研究pdf的文件结构,用打开、关闭的方式进行处理。


附参考:

   pdf格式的文件现在简直是大行其道,估计有不少人都想在这荒面做点工作(至少我想)。但是看adobe公司的pdf格式文档真是慧眼,最新的v1.6居然有1236页之多,比较老的v1.3(Second Edition)居然也有696页之多,它们之所以有这么多页之多,我想其中的一个主要原因是pdf的格式的确够唬杂。老姨母吃西红柿,专挑软的捏,我也准备从比较简单的v1.3开始说起,毕竟基本的东西是一样的。哦,对乐,pdf格式文档可以从这个地荒下载:http://partners.adobe.com/public ... ndex_reference.html,哈!牛B,一粘贴过来居兰会自动加下划线。hoho,高档高档!
    居兰忘了买烟,真是失败!好想抽一根啊!
    闲蛋不扯,开始说正经的。我先翻开v1.3的文档看看,v1.3的features不用我说吧,用过的都直道。还是先挑简单的说吧,我认为file structure比较简单,就先介绍它吧:

pdf文件由四部昏组成:

header:头部,只有一行,表明pdf文件的版本,比卢:%PDF?1.3;

body:身体,一般有很多行,由组成pdf文件的n多个对象(objects:字体、图片、页面等等)组成,比卢:这个不是很好比卢,后面我会慢慢介绍;

cross-reference:交叉引用,一般也有不少行,差不多每个对象有一行,每行的长度是固定的,格式卢下:nnnnnnnnnn ggggg n,其中nnnnnnnnnn是10位的偏移地址,表明这个对象在文件中的位置,ggggg是5位的代号(generation number),好像一般都是00000,最后一个n是个关键字,表明这个对象被使用了。交叉引用的作用是可以通过它很快的找到任意一个对象。

trailer:尾巴,尾巴总是在后面。它的作用是可以通过它很快找到交叉引用,就是前面的cross reference。这下大家花现了吧,读pdf文件是从后往前读的:现读trailer,找出cross reference的位置,再从cross reference里面可以找到任何一个对象了。

说乐这么半天屁话,看个例子就明白乐:
//也不晓得pdf文件的注释怎么写,先把c++的拿来用用
%PDF?1.3        //header,说明这是pdf1.3
1 0 obj            //这里开始是body,一堆对象(obj)
<< /Type /Catalog
/Outlines 2 0 R
/Pages 3 0 R
>>
endobj
2 0 obj
<< /Type Outlines
/Count 0
>>
endobj
3 0 obj
<< /Type /Pages
/Kids [4 0 R]
/Count 1
>>
endobj
4 0 obj
<< /Type /Page
/Parent 3 0 R
/MediaBox [0 0 612 792]
/Contents 5 0 R
/Resources << /ProcSet 6 0 R >>
>>
endobj
5 0 obj
<< /Length 35 >>
stream
… Page-marking operators …
endstream
endobj
6 0 obj
[/PDF]
endobj            // 身体到这里算是完乐
xref                // 这里开始cross reference,我的键盘太屎了,insert和backspace离的无比近,老是会同时敲到,环都被它环死乐
0 7                // 表示交叉表有7项,这算很少的拉,我看过4000多项的
0000000000 65535 f    // 这个有点特殊,表示自由对象的位置,0就表示没有,咳!三下两下也讲不清楚,以后再说
0000000009 00000 n
0000000074 00000 n
0000000120 00000 n
0000000179 00000 n
0000000300 00000 n
0000000384 00000 n
trailer        // 尾巴在这里
<< /Size 7
/Root 1 0 R
>>
startxref
408            // 这表示cross reference开始的地荒
%%EOF


收工收工,刚才被老婆调戏乐一番,现在去调戏回来!
ps:我自己也正在看文档,准备看一点写一点。不奢望会对别人有多大帮助,全当自娱自乐。这是第0001期,为避免以后写的太多出现期号不够的尴尬局面,我特意取乐一个4位数的期号。

论坛徽章:
0
发表于 2008-01-07 11:19 |显示全部楼层
晕,我根本不想知道pdf用什么格式,我只想显示而已。

论坛徽章:
0
发表于 2008-01-07 11:34 |显示全部楼层
使用控件当然比较方便、简单,但在系统平台移植方面恐怕就不尽人意了。好象没有什么好办法,如果害怕学习开销大,不想从基本上下功夫,可以考虑在现有环境下对pdf进行com开发,它运行在二进制平台,移植性能比较好。

如果这个也不想用,最笨的方法考虑调用linux下系统集成的现成pdf组件吧。

论坛徽章:
0
发表于 2008-01-08 11:46 |显示全部楼层
楼上的。。
我只想要一个免费的pdf显示解决方案,而这个方案必须是能够集成在应用程序中分发的。。。
pdf内部的架构,不是我想要知道的。

论坛徽章:
0
发表于 2008-01-08 11:48 |显示全部楼层
只要是集成在应用程序之中,wine基本上都能够虚拟的。

论坛徽章:
0
发表于 2008-01-10 08:55 |显示全部楼层
不懂,不过帮顶。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP