一、前言

由于本人工作需求,需要对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插件相关推荐

  1. 安卓 SDK 开发使用 VirtualAPK 实现插件化

    1. 背景 因为公司现在要在广告 SDK 开发中实现一部分代码的更新,或者是新增部分功能,因此需要从后台通过网络下载然后通过插件化的方式进行加载展示.本来想的是自己实现,但是遇到了一些问题,所以直接采 ...

  2. Polyworks脚本开发学习笔记(十八)-用SDK开发Polyworks插件

    Polyworks脚本开发学习笔记(十八)-用SDK开发Polyworks插件 插件是由PolyWorks加载的动态链接库(DLL文件),然后查询Polyworks模块,以确定它们具有哪些功能,提供给 ...

  3. Unity Android平台下插件/SDK开发通用流程

    本文主要面向对Android开发不甚了解的Unity开发者,介绍了基于最新的Android Studio的标准Android开发环境与项目结构的配置流程,在此基础上,开发者可以快速的进行SDK的接入与 ...

  4. Android原生整合虹软SDK开发uniapp插件

    1.项目背景 应公司要求,需要开发一套类似人脸打卡功能的app,但是因为我们公司没有很强的原生android开发者,所以根据现状选择了第三方跨平台的uniapp,想必目前大多人都了解这个平台了,我也就 ...

  5. 网易技术干货 | 云信跨平台C++ SDK开发实战

    1. 序 言 2018年,Flutter Release正式发布,将移动端跨平台开发技术再一次推上风口浪尖.2019年5月,Flutter 1.5正式支持Web开发,而预告中正在开发的Flutter ...

  6. flutter 获取定位_从头开发一个Flutter插件(二)高德地图定位插件

    在上一篇文章从头开发一个Flutter插件(一)开发流程里具体介绍了flutter插件的具体开发流程,从创建项目到发布.接下来将会为Flutter天气项目开发一个基于高德定位sdk的flutter定位 ...

  7. uasset python_Unreal Python 结合 C++ 开发蓝图库插件

    本文章转载自 智伤帝的个人博客 - 原文链接 前言 上个月的这个时候我写了一篇文章关于如何嵌入 PySide 调用 Qt 的 GUI 开发. 链接 Python 虽然很好,但是有些功能,并没有从 C+ ...

  8. 开发Adobe AIR的原生扩展

    要求 必备知识 对AIR和ActionScript 3具有中等或深入的理解,熟悉Flash Builder和Java. 用户级别 中级 必需产品 Adobe AIR 3 范例文件 ane-hello- ...

  9. android aar项目_一文了解Android游戏SDK开发

    去年从平安离职之后,加入了一家游戏公司,负责游戏SDK相关的业务开发和维护工作,经过半年来的摸索,对于游戏SDK的开发有了一定的理解,下面就对游戏SDK开发涉及到的知识点进行简单的梳理. SDK SD ...

最新文章

  1. linux 共享内存 查看和删除
  2. java源码阅读LinkedList
  3. 最优资产组合步骤_重新设计投资组合网站之前,请按照以下5个步骤进行操作
  4. MyEclipse 6.5安装maven插件
  5. WPF中得到一个控件相对其他控件的坐标
  6. 阿尔伯塔大学的计算机科学专业好吗,去阿尔伯塔大学留学这些专业千万不能错过!...
  7. python如何学的扎实_如何系统的学习python?
  8. Delphi - 注入的方式来禁止任务管理器
  9. 多分类决策树 r语言_R语言——决策树模型的相关可视化
  10. 找网络高手联系方式_怎么才能联系到网络高手(找网络大牛联系方式)
  11. 本地化差分隐私保护的实现机制(一)
  12. 怎么使用关键词获取视频列表 API
  13. react实现路由跳转拦截功能(导航守卫)
  14. python开三次方_python 3次方
  15. Multisim14.0仿真:三相半波可控整流电路
  16. OpenCV开发笔记(四十七):红胖子8分钟带你深入了解直方图(图文并茂+浅显易懂+程序源码)
  17. 10年测试,告诉你常见的软件测试类型有哪些?
  18. 【Python黑科技】获取每日一句美句,并定时发送邮件到指定邮箱(保姆级图文+实现代码)
  19. AMD双核补丁吐血之作6个补丁
  20. 4G智能音箱技术方案开发

热门文章

  1. 天津CAD培训到底学什么?
  2. 移动终端应用开发(南京师范大学)例子
  3. rt_thread hc32f460开发五:wdt驱动移植
  4. GitHub 上的这几个项目或许能帮你学好英语
  5. 苹果系统方舟怎么开服务器,方舟生存进化手游苹果版上帝模式怎么打开 | 手游网游页游攻略大全...
  6. 纯CSS3实现咖啡制作全过程动画特效
  7. adb连接失败 模拟器无法连接
  8. 4G已成网络电话通信在国内普及的加速度
  9. PPT转换成PDF文件的方法
  10. 计算机数控技术实验报告,数控机床故障诊断与维修实训报告