# # 包目录结构说明

## # 包结构介绍

在 10.0 版本之前，Foxit PDF SDK for Web 提供了如下的三种包：

- 无字体标准包: FoxitPDFSDKForWeb_9_XXX_NoFonts.zip (不包含字体资源的标准包)
- 标准包: FoxitPDFSDKForWeb_9_XXX.zip (包含字体的标准包)
- 完整包: FoxitPDFSDKForWeb_9_XXX_Full.zip (包含字体, 相对标准包增加了一些高级功能，比如：文档比较、高级编辑功能和动态XFA)

如果您已有字体资源或者只需使用在线字体，那么您可以选择无字体标准包。如果您不需要对字体库进行任何修改以及不介意包的大小，那么可以选择标准包。 如果您需要一些高级功能，比如文档比、高级编辑功能或者动态XFA，那么完整包是最合适的选择。

从 10.0 版本开始，Foxit PDF SDK for Web 只提供完整包，根据License加载单独授权的功能，并添加了3D功能。

- 完整包: FoxitPDFSDKForWeb_10_XXX.zip

Package包含如下的文件夹和文件：

文件夹/文件 | 描述
--- | ---
docs | 包含API手册和Foxit PDF SDK for Web的开发手册。 注意：HTML版本的开发者指南是使用VuePress构建的，不支持双击直接打开。需要启动HTTP服务器并通过Web浏览器访问。此外，其包括一些可运行的示例，需要启用WebPDFJRWorker.js，以便在支持HTTP服务器的环境中正确运行。
examples | 一系列 demo 和示例，用来说明如何充分使用 Foxit PDF SDK for Web 功能。
external | 字体资源。
lib | Foxit PDF SDK for Web 核心库。
server | Web viewer 中使用的一系列基于服务器的应用程序所需的 http-server 和 Node.js 脚本。
legal.txt | 法律和版权信息。
package.json | 项目描述文件。

`lib` 文件夹包括如下的文件：

文件夹/文件 | 描述
--- | ---
jr-engine | 前端渲染引擎。
locales | 支持的国际化语言。不同语言的资源文件按标签放置在不同的目录下。
PDFViewCtrl | PDFViewCtrl 库附加的 plugin。
stamps | Stamp 资源文件，图片文件和模板。
assets | 包含文档比较功能需要用到的模板资源文件，当前仅在完整包中包含此目录。
uix-addons | UIExtension 库附加的 plugin。
PDFViewCtrl.css | PDFViewCtrl viewer UI 样式的 CSS 文件。
PDFViewCtrl.full.js | PDFViewCtrl viewer 库的完整脚本文件。
PDFViewCtrl.js | 无第三方库的 PDFViewCtrl viewer 库的脚本文件。
PDFViewCtrl.polyfills.js | PDFViewCtrl 所依赖的 polyfill 脚本文件，用于兼容不同的浏览器。
PDFViewCtrl.vendor.js | PDFViewCtrl 所使用的第三方库 (列表见后文)。
preload-jr-worker.js | 用于并行加载 JS 引擎资源以提升 viewer 加载速度的 worker 脚本文件。
UIExtension.css | UI 样式默认的 CSS 文件。
UIExtension.dark-variable.css | 用于暗黑主题的样式文件。
UIExtension.vw.css | 使用 `vmin` unit 的 CSS 文件。
UIExtension.full.js | UIExtension viewer 库的完整脚本文件。
UIExtension.js | 无第三方库的 UIExtension viewer 库的脚本文件。
UIExtension.polyfills.js | UIExtension 所依赖的 polyfill 脚本文件，用于兼容不同的浏览器。
UIExtension.vendor.js | UIExtension 所使用的第三方库 (列表见后文)。
WebPDFJRWorker.js | Web Worker 中运行的脚本，用来调用前端渲染引擎。
WebPDFSRWorker.js | Web Worker 中运行的脚本，用来调用服务器端渲染引擎。
*.d.ts | "d.ts"文件用于为TypeScript 提供有关用JavaScript 编写的API 的类型信息，目的在于让 IDE 能够识别它并提供代码提示，以及在编译时执行静态类型检查。在提供便利的同时也保证了接口调用的准确性。

## # 静态库与动态库

在 10.0 版本之前，Foxit PDF SDK for Web 使用的底层库是静态库。 从 10.0 版本开始，Foxit PDF SDK for Web 使用的底层库是动态库。

## # 动态库模块划分

从 10.0 版本开始，动态库模块被划分为主模块和侧模块。

主模块:

- gsdk.wasm

侧模块: (按需加载)

- compare.wasm
- pageeditor.wasm
- touchup.wasm
- xfa.wasm
- 3d.wasm
- lr.wasm
- Pageformat.wasm
- docprocess.wasm

模块名 | 功能 | 依赖
--- | --- | ---
gsdk.wasm | 提供基础功能和Redact功能。 | pageformat.wasm lr.wasm docprocess.wasm optimizer.wasm
compare.wasm | Overlay Compare功能依赖该模块。 | lr.wasm
pageeditor.wasm | Paragraph-based editor (高级编辑器) 依赖该模块。 | lr.wasm
touchup.wasm | 高级编辑器的 EditText 和 AddText 功能依赖该模块。 | lr.wasm
xfa.wasm | 动态XFA表单功能依赖该模块。 | lr.wasm
3d.wasm | PDF 3D功能依赖该模块。 | 无
optimizer.wasm | 数字图章功能依赖该模块。 | 无
lr.wasm | Layout Recognition engine (布局识别引擎) 模块为高级功能提供基础支持。当触发依赖的相关模块时，它将被加载。 | 无
Pageformat.wasm | Header&Footer 和 Watermark 功能依赖该模块。 | 无
docprocess.wasm | 表单识别功能依赖该模块。 | 无

## # Package.json

Foxit PDF SDK for Web 提供了一个 package.json 文件，用来帮助开发人员快速部署和使用 Web PDF，以及更轻松地将 Web PDF 集成到他们的项目中。package.json 文件内容如下：

    {
        "name": "@foxitsoftware/foxit-pdf-sdk-for-web-library",
        "version": "10.0.0",
        "description": "Foxit pdf sdk for web.",
        "author": "Foxit Software Inc.",
        "main": "./lib/UIExtension.full.js",
        "types": "./lib/UIExtension.full.d.ts",
        "typings": "./lib/UIExtension.full.d.ts",
        "scripts": {
            "start": "concurrently --kill-others \"npm run start-http-server\" \"npm run start-snapshot-server\"",
            "start-snapshot-server": "node ./server/snapshot/src/index -p 3002",
            "start-http-server": "node ./server/index"
        },
        "license": "Commercial",
        "devDependencies": {
            "boxen": "^4.1.0",
            "chalk": "^2.4.1",
            "concurrently": "^8.2.2",
            "http-proxy-middleware": "^3.0.0",
            "koa": "^2.7.0",
            "koa-body": "^4.0.4",
            "koa-body-parser": "^1.1.2",
            "koa-cors": "0.0.16",
            "koa-router": "^7.4.0",
            "koa-serve-list": "^1.0.1",
            "koa-static": "^5.0.0",
            "koa2-connect": "^1.0.2",
            "lru-cache": "^4.1.3",
            "raw-body": "^2.3.3",
            "require-dir": "^1.0.0",
            "serve-handler": "^6.0.2",
            "sockjs": "^0.3.21",
            "ws": "^7.3.1"
        },
        "dependencies": {
            "@csstools/normalize.css": "^11.0.0",
            "@types/hammerjs": "^2.0.36",
            "@types/jquery": "^3.3.29",
            "bootstrap-datepicker": "^1.9.0",
            "core-js": "3.35.1",
            "dayjs": "^1.11.1",
            "dayjs-plugin-utc": "^0.1.2",
            "dialog-polyfill": "^0.4.10",
            "dom4": "^2.1.4",
            "es6-promise": "^4.2.5",
            "eventemitter3": "^3.1.0",
            "fast-printf": "^1.6.9",
            "flatpickr": "4.6.9",
            "hammerjs": "^2.0.8",
            "human-format": "^0.11.0",
            "i18next": "^23.8.1",
            "i18next-chained-backend": "^4.6.2",
            "i18next-localstorage-backend": "^4.2.0",
            "i18next-xhr-backend": "^3.2.2",
            "jquery": "^3.4.1",
            "jquery-contextmenu": "^2.7.1",
            "jszip": "^3.7.1",
            "lodash": "^4.17.21",
            "papaparse": "^5.4.1",
            "print-area": "^0.1.4",
            "punycode": "^2.1.1",
            "sortablejs": "~1.9.0",
            "whatwg-fetch": "^3.0.0"
        },
        "resolutions": {
            "jquery": "^3.4.1",
            "core-js": "3.35.1",
            "qs": ">=6.0.4"
        },
        "overrides": {
            "jquery": "^3.4.1",
            "core-js": "3.35.1",
            "qs": ">=6.0.4"
        },
        "serve": {
            "port": 8080,
            "public": "/",
            "proxy": {
                "target": "http://127.0.0.1:3002",
                "changeOrigin": true
            }
        },
        "files": [
            "lib",
            "server",
            "legal.txt",
            "locales_changelog.txt",
            "MigrationNode.txt",
            "ReleaseNote.md"
        ]
    }

## # Foxit PDF SDK for Web 使用的第三方库

Foxit PDF SDK for Web 提供了两种版本的 JS 文件：包含第三方库的完整版本的 JS 文件和不包含第三方库的常规的 JS 文件。如果您的工程已经使用了 SDK 中包含的第三方库，那么您不需要再安装该库。

PDFViewCtrl.full.js 脚本包含：

- PDFViewCtrl.full.js: PDFViewCtrl viewer 库的完整脚本文件。
- PDFViewCtrl.polyfills.js: PDFViewCtrl 所依赖的 polyfill 脚本文件，用于兼容不同的浏览器。
- PDFViewCtrl.vendor.js: PDFViewCtrl所使用的第三方库 (列表见后文)。
- PDFViewCtrl.js: 无第三方库的 PDFViewCtrl viewer 库的脚本文件。

因此，`PDFViewCtrl.polyfills.js` + `PDFViewCtrl.vendor.js` + `PDFViewCtrl.js` = PDFViewCtrl.full.js.

以下两种形式是等效的：

    <script src="../FoxitPDFSDKForWeb/lib/PDFViewCtrl.full.js"></script>

和

    <script src="../FoxitPDFSDKForWeb/lib/ PDFViewCtrl.polyfills.js"></script>
    <script src="../FoxitPDFSDKForWeb/lib/PDFViewCtrl.vendor.js"></script>
    <script src="../FoxitPDFSDKForWeb/lib/PDFViewCtrl.js"></script>

`PDFViewCtrl.vendor.js` 包含的第三方库如下所示：

    jquery
    i18next
    i18next-chained-backend
    i18next-localstorage-backend
    i18next-xhr-backend
    jquery-contextmenu
    dialog-polyfill
    hammerjs
    eventemitter3

UIExtension.full.js脚本包含:

- UIExtension.full.js: UIExtension viewer 库的完整脚本文件。
- UIExtension.polyfills.js: UIExtension 所依赖的 polyfill 脚本文件，用于兼容不同的浏览器。
- UIExtension.vendor.js: UIExtension 所使用的第三方库 (列表见后文)。
- UIExtension.js: 无第三方库的 UIExtension viewer 库的脚本文件。

因此， `UIExtension.polyfills.js` + `UIExtension.vendor.js` + `UIExtension.js` = UIExtension.full.js.

以下两种形式是等效的：

    <script src="../FoxitPDFSDKForWeb/lib/UIExtension.full.js"></script>

和

    <script src="../FoxitPDFSDKForWeb/lib/UIExtension.polyfills.js"></script>
    <script src="../FoxitPDFSDKForWeb/lib/UIExtension.vendor.js"></script>
    <script src="../FoxitPDFSDKForWeb/lib/UIExtension.js"></script>

`UIExtension.vendor.js` 包含的第三方库如下所示：

    jquery
    i18next
    i18next-chained-backend
    i18next-localstorage-backend
    i18next-xhr-backend
    dialog-polyfill
    hammerjs
    eventemitter3
    file-saver