Skip to content

通过配置文件自定义 UI

本节介绍如何在 Android 平台基于 UI Extensions,通过配置文件 uiextensions_config.json 定制内置 UI。您可以在不修改业务代码的情况下,按需控制 UI 的启用范围与行为,例如:

  • 启用/禁用功能模块(modules)
  • 权限/能力开关(permissions)
  • UI 行为与样式(uiSettings,例如页面模式、链接高亮、注释默认属性等)

修改配置后,重新编译运行应用即可生效。

配置文件位置

在 SDK 示例工程中,配置文件位于:

  • samples/complete_pdf_viewer/app/src/main/res/raw/uiextensions_config.json

您也可以在自己的工程中按同样方式放置并使用该配置文件。

JSON 文件说明

UI Extensions 的配置既可以通过 JSON 文件提供,也可以在代码中直接构造配置对象。为便于阅读与维护,推荐优先使用 JSON 格式(更直观、更易于审阅配置差异)。

配置文件示例(uiextensions_config.json

下面给出示例工程中的 完整配置文件。建议您先以该文件为模板,按需调整少量配置项,以快速验证定制效果。

[uiextensions_config.json(完整示例)]
json
{
  "modules": {
    "readingbookmark": true,
    "outline": true,
    "annotations": {
      "highlight": true,
      "underline": true,
      "squiggly": true,
      "strikeout": true,
      "insert": true,
      "replace": true,
      "line": true,
      "rectangle": true,
      "oval": true,
      "arrow": true,
      "pencil": true,
      "eraser": true,
      "typewriter": true,
      "textbox": true,
      "callout": true,
      "note": true,
      "stamp": true,
      "polygon": true,
      "cloud": true,
      "polyline": true,
      "measure": true,
      "image": true,
      "audio": true,
      "video": true
    },
    "thumbnail": true,
    "attachment": true,
    "signature": true,
    "search": true,
    "pagenavigation": true,
    "form": true
  },
  "permissions": {
    "runJavaScript": true,
    "enableLink": true
  },
  "uiSettings": {
    "pageMode": "Single",
    "continuous": false,
    "zoomMode": "FitWidth",
    "colorMode": "Normal",
    "mapForegroundColor": "#5d5b71",
    "mapBackgroundColor": "#00001b",
    "enableFormNavigationBar": true,
    "highlightForm": true,
    "highlightFormColor": "#200066cc",
    "highlightLink": true,
    "highlightLinkColor": "#16007fff",
    "annotations": {
      "continuouslyAdd": true,
      "highlight": {
        "color": "#ffff00",
        "opacity": 1.0
      },
      "areaHighlight": {
        "color": "#ffff00",
        "opacity": 1.0
      },
      "underline": {
        "color": "#66cc33",
        "opacity": 1.0
      },
      "squiggly": {
        "color": "#993399",
        "opacity": 1.0
      },
      "strikeout": {
        "color": "#ff0000",
        "opacity": 1.0
      },
      "insert": {
        "color": "#993399",
        "opacity": 1.0
      },
      "replace": {
        "color": "#0000ff",
        "opacity": 1.0
      },
      "line": {
        "color": "#ff0000",
        "opacity": 1.0,
        "thickness": 2
      },
      "rectangle": {
        "color": "#ff0000",
        "opacity": 1.0,
        "thickness": 2,
        "fillColor": null
      },
      "oval": {
        "color": "#ff0000",
        "opacity": 1.0,
        "thickness": 2,
        "fillColor": null
      },
      "arrow": {
        "color": "#ff0000",
        "opacity": 1.0,
        "thickness": 2
      },
      "pencil": {
        "color": "#ff0000",
        "opacity": 1.0,
        "thickness": 2,
        "stylusOnly": false
      },
      "polygon": {
        "color": "#ff0000",
        "opacity": 1.0,
        "thickness": 2,
        "fillColor": null
      },
      "cloud": {
        "color": "#ff0000",
        "opacity": 1.0,
        "thickness": 2,
        "fillColor": null
      },
      "polyline": {
        "color": "#ff0000",
        "opacity": 1.0,
        "thickness": 2
      },
      "typewriter": {
        "textColor": "#0000ff",
        "opacity": 1.0,
        "textFace": "Courier",
        "textSize": 18
      },
      "textbox": {
        "color": "#ff0000",
        "textColor": "#0000ff",
        "opacity": 1.0,
        "textFace": "Courier",
        "textSize": 18
      },
      "callout": {
        "color": "#ff0000",
        "textColor": "#0000ff",
        "opacity": 1.0,
        "textFace": "Courier",
        "textSize": 18
      },
      "note": {
        "color": "#ff0000",
        "opacity": 1.0,
        "icon": "Comment"
      },
      "attachment": {
        "color": "#ff0000",
        "opacity": 1.0,
        "icon": "PushPin"
      },
      "image": {
        "rotation": 0,
        "opacity": 1.0
      },
      "measure": {
        "color": "#ff0000",
        "opacity": 1.0,
        "thickness": 2,
        "scaleFromUnit": "inch",
        "scaleToUnit": "inch",
        "scaleFromValue": 1.0,
        "scaleToValue": 1.0
      }
    },
    "form": {
      "textField": {
        "textColor": "#000000",
        "textFace": "Courier",
        "textSize": 0
      },
      "checkBox": {
        "textColor": "#000000"
      },
      "radioButton": {
        "textColor": "#000000"
      },
      "comboBox": {
        "textColor": "#000000",
        "textFace": "Courier",
        "textSize": 0,
        "customText": false
      },
      "listBox": {
        "textColor": "#000000",
        "textFace": "Courier",
        "textSize": 0,
        "multipleSelection": false
      }
    },
    "signature": {
      "color": "#000000",
      "thickness": 8
    }
  }
}

注意

  • 关于默认值:配置文件中未显式声明的配置项,会按 SDK 的默认值处理。比如,即使您未在配置文件中写入或将 "highlight": true 注释掉,高亮功能也可能仍保持可用(因为默认值为启用)。

  • 关于附件(attachment)与注释(annotations)的边界

    • modules.annotations 下的子项(如 highlight / underline 等)用于控制"注释工具"中的对应功能开关。
    • 附件相关能力(包含"附件面板"与"附件注释"入口)由顶层模块 modules.attachment 统一控制,不受 modules.annotations 子项开关影响。
    • 如果您的目标是隐藏/禁用 Comment 中所有注释相关入口,通常需要同时关闭 modules.annotationsmodules.attachment

    例如(仅示意配置关系):

    json
    {
      "modules": {
        "annotations": false,
        "attachment": false
      }
    }
    

JSON 配置项说明

JSON 配置文件通常包括三个部分:功能模块(modules)权限管理(permissions)、以及 UI 设置(uiSettings,例如 UI 元素属性)

功能模块配置项

功能模块配置项的值类型是 bool,其中 true 表示启用该功能模块,false 表示将禁用该功能模块。默认值为 true

功能模块描述
readingbookmark用户定义书签
outlinePDF 文档书签
annotations (highlight, underline, squiggly, strikeout, insert, replace, line, rectangle, oval, arrow, pencil, eraser, typewriter, textbox, callout, note, stamp, polygon, cloud, polyline, measure, image, audio, video)注释模块集合
thumbnailPDF 页面缩略图显示和页面管理
attachmentPDF 文档附件和附件注释
Signature电子签名和手写签名
fillSign为“平面表单(非交互表单)”填充文本与符号
search文本搜索
navigationPDF 页面导航
form表单填写和表单数据导入导出
selection文本选择
encryptionPDF 加密
multipleSelection多选注释

权限管理配置项

权限管理配置项的值类型为 bool,其中 true 表示将启用该权限,false 表示将禁用该权限。通常 runJavaScriptcopyText 默认值为 truedisableLink 默认值为 false

权限管理描述
runJavaScript是否允许执行 JavaScript
copyText是否允许复制文本
disableLink是否禁用超链接

基础 UI 配置

参数类型说明
页面显示设置
pageModeString页面显示模式
可选值:Single / Facing / CoverLeft / CoverMiddle / CoverRight / Reflow
默认值:Single
备注:动态 XFA 文件不支持 Reflow 模式
continuousBool是否连续显示单页
可选值:true / false
默认值:false
备注:在 Reflow 模式下无效
zoomModeString页面缩放模式
可选值:FitWidth / FitPage
默认值:FitWidth
颜色与显示模式
colorModeString页面颜色显示模式
可选值:Normal / Night / Map
默认值:Normal
备注:Night 是特殊的 Map 模式
mapForegroundColorRGB页面前景色(仅 Map 模式生效)
默认值:#5d5b71
mapBackgroundColorRGB页面背景色(仅 Map 模式生效)
默认值:#00001b
表单与链接设置
disableFormNavigationBarBool是否禁用表单导航栏
可选值:true / false
默认值:false
highlightFormBool是否高亮表单域
可选值:true / false
默认值:true
highlightFormColorARGB表单高亮颜色
默认值:#200066cc
备注:包含 alpha 通道,对动态 XFA 文件无效
highlightLinkBool是否高亮超链接
可选值:true / false
默认值:true
highlightLinkColorARGB超链接高亮颜色
默认值:#16007fff
备注:包含 alpha 通道

注释配置(annotations)

参数类型说明
通用配置
continuouslyAddBool是否连续添加某个注释
可选值:true / false
默认值:true
文本高亮类注释
highlight.colorRGB高亮颜色
默认值:#ffff00
highlight.opacitynumeric高亮透明度
可选值:[0.0-1.0]
默认值:1.0
areaHighlight.colorRGB区域高亮颜色
默认值:#ffff00
areaHighlight.opacitynumeric区域高亮透明度
可选值:[0.0-1.0]
默认值:1.0
备注:区域超出页面时使用默认配置
underline.colorRGB下划线颜色
默认值:#66cc33
underline.opacitynumeric下划线透明度
可选值:[0.0-1.0]
默认值:1.0
squiggly.colorRGB波浪线颜色
默认值:#993399
squiggly.opacitynumeric波浪线透明度
可选值:[0.0-1.0]
默认值:1.0
strikeout.colorRGB删除线颜色
默认值:#ff0000
strikeout.opacitynumeric删除线透明度
可选值:[0.0-1.0]
默认值:1.0
insert.colorRGB插入标记颜色
默认值:#993399
insert.opacitynumeric插入标记透明度
可选值:[0.0-1.0]
默认值:1.0
replace.colorRGB替换标记颜色
默认值:#0000ff
replace.opacitynumeric替换标记透明度
可选值:[0.0-1.0]
默认值:1.0
图形类注释
line.colorRGB直线颜色
默认值:#ff0000
line.opacitynumeric直线透明度
可选值:[0.0-1.0]
默认值:1.0
line.thicknessnumeric直线宽度
可选值:[1-12]
默认值:2
rectangle.colorRGB矩形边框颜色
默认值:#ff0000
rectangle.opacitynumeric矩形透明度
可选值:[0.0-1.0]
默认值:1.0
rectangle.thicknessnumeric矩形边框宽度
可选值:[1-12]
默认值:2
rectangle.fillColorRGB矩形填充色
默认值:null
oval.colorRGB椭圆形边框颜色
默认值:#ff0000
oval.opacitynumeric椭圆形透明度
可选值:[0.0-1.0]
默认值:1.0
oval.thicknessnumeric椭圆形边框宽度
可选值:[1-12]
默认值:2
oval.fillColorRGB椭圆形填充色
默认值:null
arrow.colorRGB箭头颜色
默认值:#ff0000
arrow.opacitynumeric箭头透明度
可选值:[0.0-1.0]
默认值:1.0
arrow.thicknessnumeric箭头线宽
可选值:[1-12]
默认值:2
pencil.colorRGB画笔颜色
默认值:#ff0000
pencil.opacitynumeric画笔透明度
可选值:[0.0-1.0]
默认值:1.0
pencil.thicknessnumeric画笔粗细
可选值:[1-12]
默认值:2
pencil.addHistoricalPointsBool是否添加当前帧的历史坐标点
可选值:true / false
默认值:true
polygon.colorRGB多边形边框颜色
默认值:#ff0000
polygon.opacitynumeric多边形透明度
可选值:[0.0-1.0]
默认值:1.0
polygon.thicknessnumeric多边形边框宽度
可选值:[1-12]
默认值:2
polygon.fillColorRGB多边形填充色
默认值:null
cloud.colorRGB云形边框颜色
默认值:#ff0000
cloud.opacitynumeric云形透明度
可选值:[0.0-1.0]
默认值:1.0
cloud.thicknessnumeric云形边框宽度
可选值:[1-12]
默认值:2
cloud.fillColorRGB云形填充色
默认值:null
polyline.colorRGB折线颜色
默认值:#ff0000
polyline.opacitynumeric折线透明度
可选值:[0.0-1.0]
默认值:1.0
polyline.thicknessnumeric折线宽度
可选值:[1-12]
默认值:2
文本类注释
typewriter.textColorRGB打字机文本颜色
默认值:#0000ff
typewriter.opacitynumeric打字机透明度
可选值:[0.0-1.0]
默认值:1.0
typewriter.textFaceString打字机字体
可选值:Courier / Helvetica / Times
默认值:Courier
备注:非法值时使用默认字体
typewriter.textSizeInteger打字机字号
可选值:>=1
默认值:18
textbox.colorRGB文本框边框颜色
默认值:#ff0000
textbox.textColorRGB文本框文本颜色
默认值:#0000ff
textbox.opacitynumeric文本框透明度
可选值:[0.0-1.0]
默认值:1.0
textbox.textFaceString文本框字体
可选值:Courier / Helvetica / Times
默认值:Courier
备注:非法值时使用默认字体
textbox.textSizeInteger文本框字号
可选值:>=1
默认值:18
callout.colorRGB标注边框颜色
默认值:#ff0000
callout.textColorRGB标注文本颜色
默认值:#0000ff
callout.opacitynumeric标注透明度
可选值:[0.0-1.0]
默认值:1.0
callout.textFaceString标注字体
可选值:Courier / Helvetica / Times
默认值:Courier
备注:非法值时使用默认字体
callout.textSizeInteger标注字号
可选值:>=1
默认值:18
其他注释
note.colorRGB批注颜色
默认值:#ff0000
note.opacitynumeric批注透明度
可选值:[0.0-1.0]
默认值:1.0
note.iconString批注图标类型
可选值:Comment / Key / Note / Help / NewParagraph / Paragraph / Insert
默认值:Comment
备注:非法值时使用默认图标
attachment.colorRGB附件颜色
默认值:#ff0000
attachment.opacitynumeric附件透明度
可选值:[0.0-1.0]
默认值:1.0
attachment.iconString附件图标类型
可选值:Graph / PushPin / Paperclip / Tag
默认值:PushPin
备注:非法值时使用默认图标
image.rotationnumeric图片旋转角度
可选值:0 / 90 / 180 / 270
默认值:0
image.opacitynumeric图片透明度
可选值:[0.0-1.0]
默认值:1.0
image.textSizeInteger图片文本标注字号
可选值:>=1
默认值:12
measure.colorRGB测量线颜色
默认值:#ff0000
measure.opacitynumeric测量线透明度
可选值:[0.0-1.0]
默认值:1.0
measure.thicknessnumeric测量线宽度
可选值:[1-12]
默认值:2
measure.scaleFromUnitString缩放基准单位
可选值:pt / m / cm / mm / inch / p / ft / yd
默认值:inch
备注:缩放计算的基准单位
measure.scaleToUnitString缩放目标单位
可选值:pt / m / cm / mm / inch / p / ft / yd
默认值:inch
备注:缩放计算的目标单位
measure.scaleFromValuenumeric缩放基准数值
默认值:1.0
备注:缩放计算的基准数值
measure.scaleToValuenumeric缩放目标数值
默认值:1.0
备注:缩放计算的目标数值

表单控件配置(form)

参数类型说明
form.textField 配置
form.textField.textColorRGB文本颜色
默认值:#000000
form.textField.textFaceString文本字体名称
可选值:Courier / Helvetica / Times
默认值:Courier
说明:若设置为非法值,则使用默认字体
form.textField.textSizeInteger文本字号
可选值:>=0
默认值:0
说明:0 表示自动调整字体大小
form.checkBox 配置
form.checkBox.textColorRGB复选框文本颜色
默认值:#000000
form.radioButton 配置
form.radioButton.textColorRGB单选按钮文本颜色
默认值:#000000
form.comboBox 配置
form.comboBox.textColorRGB下拉框文本颜色
默认值:#000000
form.comboBox.textFaceString下拉框文本字体名称
可选值:Courier / Helvetica / Times
默认值:Courier
说明:若设置为非法值,则使用默认字体
form.comboBox.textSizeInteger下拉框文本字号
可选值:>=0
默认值:0
说明:0 表示自动调整字体大小
form.comboBox.customTextBool下拉框是否允许自定义文本
可选值:true / false
默认值:false
说明:True 表示允许自定义文本,False 表示不允许自定义文本
form.listBox 配置
form.listBox.textColorRGB列表框文本颜色
默认值:#000000
form.listBox.textFaceString列表框文本字体名称
可选值:Courier / Helvetica / Times
默认值:Courier
说明:若设置为非法值,则使用默认字体
form.listBox.textSizeInteger列表框文本字号
可选值:>=0
默认值:0
说明:0 表示自动调整字体大小
form.listBox.multipleSelectionBool列表框是否支持多选
可选值:true / false
默认值:false
说明:True 表示支持多选,False 表示不支持多选
signature(签名)配置
signature.colorRGB签名颜色
默认值:#000000
signature.thicknessnumeric签名线条粗细
可选值:[1-12]
默认值:8

使用配置文件实例化 UIExtensionsManager

full-viewer 等示例中,直接实例化 UIExtensionsManager 会默认加载所有内置 UI。若您希望在初始化阶段就按 JSON 配置启用/禁用模块或调整 UI 行为,可按以下方式加载配置文件并实例化 UIExtensionsManager

前提条件

您已将 uiextensions_config.json 放置于 app/src/main/res/raw/ 目录下(若工程中没有 raw 目录,请自行创建)。

MainActivity.java 中(示例代码按原文逻辑整理为可直接复制的形式):

java
import com.foxit.uiextensions.UIExtensionsManager;
import com.foxit.uiextensions.config.Config;

import java.io.InputStream;

// ...

private PDFViewCtrl pdfViewCtrl = null;
private UIExtensionsManager uiExtensionsManager = null;

// 初始化 PDFViewCtrl 对象
pdfViewCtrl = new PDFViewCtrl(this);

// 加载配置文件
InputStream stream = this.getApplicationContext()
        .getResources()
        .openRawResource(R.raw.uiextensions_config);
Config config = new Config(stream);

// 使用配置文件初始化 UIExtensionsManager,并关联到 PDFViewCtrl
uiExtensionsManager = new UIExtensionsManager(this.getApplicationContext(), pdfViewCtrl, config);
pdfViewCtrl.setUIExtensionsManager(uiExtensionsManager);
uiExtensionsManager.setAttachedActivity(this);
uiExtensionsManager.onCreate(this, pdfViewCtrl, savedInstanceState);

示例:修改配置项实现 UI 定制

以下示例来自 SDK 示例工程(complete_pdf_viewer),展示如何通过修改 uiextensions_config.json 实现不同的 UI 行为变化。

示例 1:禁用某些功能模块

readingbookmarknavigation 置为 false

json
{
  "modules": {
    "readingbookmark": false,
    "navigation": false
  }
}

示例 2:禁用超链接

disableLink 置为 true

json
{
  "permissions": {
    "runJavaScript": true,
    "copyText": true,
    "disableLink": true
  }
}

示例 3:将高亮注释颜色从黄色改为红色

设置 highlight.color#ff0000

json
{
  "uiSettings": {
    "annotations": {
      "highlight": {
        "color": "#ff0000",
        "opacity": 1.0
      }
    }
  }
}