使用Acrobat SDK开发Adobe AcrobatReader插件
一、前言
由于本人工作需求,需要对Adobe Acrobat与Adobe Reader的进行研究,并开发与其相关的插件。但是问题来了,我搜索了一遍网上的资料,无论是百度还是谷歌都找不到一篇比较正式的开发教程。无奈之下我也只能到官网下载最新版的Acrobat SDK,然后自己阅读文档并一步步地做出来。相信也有很多像我这样的新手对于第一次开发Adobe的插件一头雾水,同时又为网上搜不到相关资料而烦恼。所以,现在我根据自己的学习路径来写下关于Adobe插件开发的要点,一来帮助自己重温技术与知识,二来又能为那些需要帮助的人解惑,简直是一举两得。
二、Adobe Acrobat & Reader插件简介
利用Acrobat SDK可以进行三种方式的开发:JavaScript,Plug-ins和Interapplication communication,本文着重讨论的是第二种也就是插件的方式开发。插件方式开发就是利用提供的API去进行C++编程,编译获得一个平台相关的文件,而这个文件就是我们要的插件,在Windows平台下其实就是一个dll文件,不过这个dll文件得改一下后缀名(Windows平台下是.api)。这三种方式具体有什么区别可以查看:点击打开链接
三、准备工作
首先登陆Adobe开发者中心下载最新版的Acrobat SDK:点击打开链接
解压SDK后可以发现里面包含了多个文件夹(下图),但由于本文主要介绍的是开发通用的插件,所以只要关心两个文件夹——Documentation和PluginSupport。Documentation里包含的是开发参考文档,主要是pdf_reference.pdf和Acrobat_HTMLHELP,前者是详细的pdf技术指引,而后者可以用网页的方式来打开,其实就是网页版(最好用IE打开浏览)的开发参考文档和API库。另外一个文件夹PluginSupport这里包含了至关重要的内容,里面主要是开发过程中所需的头文件、示例与工具。
四、开发步骤
准备工作已经做好,现在可以开始创建工程了,但是官方SDK已经提供了一套完整的开发示例给开发者,我们可以利用其中的Starter示例来作为你工程的起点,这样你就不用自己去创建一个新的工程,也不用去包含头文件等,直接开始创建自己的插件功能。它的目录路径为“~\sdk110_v1_win\Adobe\Acrobat XI SDK\Version 1\PluginSupport\Samples\Starter”。另外,如果你使用的IDE是Visual Studio,那就可以使用工具——“Visual Studio App Wizard”,通过安装该工具,你可以使用直接在Visual Studio中创建一个Adobe Plug-in项目了,该工具的目录路径为“~\sdk110_v1_win\Adobe\Acrobat XI SDK\Version 1\PluginSupport\Tools\Visual Studio App Wizard”。
为了更好的理解创建一个插件的过程,下面重新创建一个空白的工程(以Visual Studio2008为例)。
新建一个插件的步骤:
1. 创建一个新的VC++ 空项目。
2. 包含Acrobat SDK头文件,目录路径为(~\PluginSupport\Headers\API及~\PluginSupport\Headers\SDK)。
3. 添加PIMain.c源文件,文件所在的目录路径(~\PluginSupport\Headers\API),需要把该文件添加到项目源文件夹中参与编译,因为里面包含了项目的入口DLLMain。
4. 添加必须预处理器定义:WIN_ENV、WIN_PLATFORM、WIN32和WINDOWS
5. 根据自身的业务需求添加逻辑代码。
首先必须添加一个源文件用来初始化插件,在其中必须实现的方法:
PluginExportHFTs
PluginImportReplaceAndRegister
PluginInit
PluginUnload
GetExtensionName
PIHandshake
这些方法可以复制粘贴Starter示例中StartInit.cpp文件的代码,然后在方法里实现自己想要的功能。
要实现这些方法,需要知道他们的作用,这里涉及插件的的生命周期。当Acrobat或Reader启动的时候会自动去查找并定位Plug-ins目录,然后加载里面的每一个插件。只要加载成功,就会调用握手方法进行连接,即PIHandshake方法:
ACCB1 ASBool ACCB2 PIHandshake(ASUns32 handshakeVersion, void, *hsData);
在握手阶段,插件会接收到一个hsData的结构体,里面包含了一组函数指针,然后通过ASCallbackCreateProto方法创建以下四个函数的回调,并把它赋值给hsData的函数指针变量:
ACCB1 ASBool ACCB2 PluginExportHFTs(void);
ACCB1 ASBool ACCB2 PluginImportReplaceAndRegister(void);
ACCB1 ASBool ACCB2 PluginInit(void);
ACCB1 ASBool ACCB2 PluginUnload(void);
握手函数的实现如下:
ACCB1 ASBool ACCB2 PIHandshake(Uns32 handshakeVersion, void *handshakeData)
{if(handshakeVersion == HANDSHAKE_V0200) {PIHandshakeData_V0200 *hsData = (PIHandshakeData_V0200 *)handshakeData;hsData->extensionName = GetExtensionName();hsData->exportHFTsCallback =(void*)ASCallbackCreateProto(PIExportHFTsProcType,&PluginExportHFTs);hsData->importReplaceAndRegisterCallback =(void*)ASCallbackCreateProto(PIImportReplaceAndRegisterProcType, &PluginImportReplaceAndRegister);hsData->initCallback = (void*)ASCallbackCreateProto(PIInitProcType, &PluginLoad);hsData->unloadCallback = (void*)ASCallbackCreateProto(PIUnloadProcType, &PluginUnload);return true;} return false;
}
握手结束后,Acrobat或Reader就会按顺序调用前三个回调函数:PluginExportHFTs、PluginImportReplaceAndRegister和PluginInit,完成初始化工作。当最后程序结束时,会自动调用PluginUnload。
HFT(Host Function Table)机制是Adobe一种暴露插件方法接口的机制,可以在PluginExportHFTs中导出任何本插件希望提供给其它插件使用的方法,可以直接返回true。相反地,PluginImportReplaceAndRegister是导入其他HFT,可能是Acrobat标准提供的HFT,也可能是其他的地方提供的HFT。显然易见的是,PluginInit进行初始化工作,可以对自己的业务对象进行初始化,相对地在PluginUnload中对这些对象及内存进行释放。
6. 编译代码,生成插件(.api)。
五、部署及应用
这一步非常简单,把编译生成的插件(.api)放到Adobe Acrobat或Reader安装目录下的Plug-ins文件夹中(复制前请先关闭Acrobat或Reader),该目录一般为“~\Adobe\Reader 11.0\Reader\plug_ins”,然后打开Acrobat或Reader即可,程序会自动加载插件。
使用Acrobat SDK开发Adobe AcrobatReader插件相关推荐
- 安卓 SDK 开发使用 VirtualAPK 实现插件化
1. 背景 因为公司现在要在广告 SDK 开发中实现一部分代码的更新,或者是新增部分功能,因此需要从后台通过网络下载然后通过插件化的方式进行加载展示.本来想的是自己实现,但是遇到了一些问题,所以直接采 ...
- Polyworks脚本开发学习笔记(十八)-用SDK开发Polyworks插件
Polyworks脚本开发学习笔记(十八)-用SDK开发Polyworks插件 插件是由PolyWorks加载的动态链接库(DLL文件),然后查询Polyworks模块,以确定它们具有哪些功能,提供给 ...
- Unity Android平台下插件/SDK开发通用流程
本文主要面向对Android开发不甚了解的Unity开发者,介绍了基于最新的Android Studio的标准Android开发环境与项目结构的配置流程,在此基础上,开发者可以快速的进行SDK的接入与 ...
- Android原生整合虹软SDK开发uniapp插件
1.项目背景 应公司要求,需要开发一套类似人脸打卡功能的app,但是因为我们公司没有很强的原生android开发者,所以根据现状选择了第三方跨平台的uniapp,想必目前大多人都了解这个平台了,我也就 ...
- 网易技术干货 | 云信跨平台C++ SDK开发实战
1. 序 言 2018年,Flutter Release正式发布,将移动端跨平台开发技术再一次推上风口浪尖.2019年5月,Flutter 1.5正式支持Web开发,而预告中正在开发的Flutter ...
- flutter 获取定位_从头开发一个Flutter插件(二)高德地图定位插件
在上一篇文章从头开发一个Flutter插件(一)开发流程里具体介绍了flutter插件的具体开发流程,从创建项目到发布.接下来将会为Flutter天气项目开发一个基于高德定位sdk的flutter定位 ...
- uasset python_Unreal Python 结合 C++ 开发蓝图库插件
本文章转载自 智伤帝的个人博客 - 原文链接 前言 上个月的这个时候我写了一篇文章关于如何嵌入 PySide 调用 Qt 的 GUI 开发. 链接 Python 虽然很好,但是有些功能,并没有从 C+ ...
- 开发Adobe AIR的原生扩展
要求 必备知识 对AIR和ActionScript 3具有中等或深入的理解,熟悉Flash Builder和Java. 用户级别 中级 必需产品 Adobe AIR 3 范例文件 ane-hello- ...
- android aar项目_一文了解Android游戏SDK开发
去年从平安离职之后,加入了一家游戏公司,负责游戏SDK相关的业务开发和维护工作,经过半年来的摸索,对于游戏SDK的开发有了一定的理解,下面就对游戏SDK开发涉及到的知识点进行简单的梳理. SDK SD ...
最新文章
- linux 共享内存 查看和删除
- java源码阅读LinkedList
- 最优资产组合步骤_重新设计投资组合网站之前,请按照以下5个步骤进行操作
- MyEclipse 6.5安装maven插件
- WPF中得到一个控件相对其他控件的坐标
- 阿尔伯塔大学的计算机科学专业好吗,去阿尔伯塔大学留学这些专业千万不能错过!...
- python如何学的扎实_如何系统的学习python?
- Delphi - 注入的方式来禁止任务管理器
- 多分类决策树 r语言_R语言——决策树模型的相关可视化
- 找网络高手联系方式_怎么才能联系到网络高手(找网络大牛联系方式)
- 本地化差分隐私保护的实现机制(一)
- 怎么使用关键词获取视频列表 API
- react实现路由跳转拦截功能(导航守卫)
- python开三次方_python 3次方
- Multisim14.0仿真:三相半波可控整流电路
- OpenCV开发笔记(四十七):红胖子8分钟带你深入了解直方图(图文并茂+浅显易懂+程序源码)
- 10年测试,告诉你常见的软件测试类型有哪些?
- 【Python黑科技】获取每日一句美句,并定时发送邮件到指定邮箱(保姆级图文+实现代码)
- AMD双核补丁吐血之作6个补丁
- 4G智能音箱技术方案开发