图层(可选内容)
PDF 图层(也称可选内容组,OCG)允许将页面内容组织到不同的图层中,用户可按需控制各图层的可见性、打印行为和导出行为。福昕 PDF SDK 安卓版通过 Core SDK 提供了完整的图层 API,支持读取图层树、管理图层节点以及控制图层中的图形对象。
核心类
| 类 | 说明 |
|---|---|
LayerTree | 图层树对象,从 PDFDoc 获取,提供根节点和全局状态控制 |
LayerNode | 图层节点,支持子节点管理、名称、可见性及各种用途设置 |
LayerPrintData | 图层打印行为数据 |
LayerZoomData | 图层缩放行为数据 |
检查文档是否包含图层
java
if (doc.hasLayer()) {
LayerTree layerTree = new LayerTree(doc);
// ...
}
获取图层树
java
LayerTree layerTree = new LayerTree(doc);
// 获取根节点
LayerNode root = layerTree.getRootNode();
// 遍历子节点
int count = root.getChildrenCount();
for (int i = 0; i < count; i++) {
LayerNode child = root.getChild(i);
String name = child.getName();
boolean hasLayer = child.hasLayer();
}
设置图层全局基础状态
通过 LayerTree.setBaseState() 设置所有图层的基础可见状态:
java
layerTree.setBaseState(LayerTree.e_StateON);
| 常量 | 说明 |
|---|---|
e_StateON | 所有图层默认可见 |
e_StateOFF | 所有图层默认隐藏 |
e_StateUnchanged | 保持不变 |
e_StateUndefined | 未定义 |
管理图层节点
添加子节点
java
// 在索引 0 处添加一个新图层节点
LayerNode newNode = parentNode.addChild(0, "新图层", true);
addChild() 参数说明:
| 参数 | 类型 | 说明 |
|---|---|---|
index | int | 插入位置索引 |
name | String | 图层名称 |
has_Layer | boolean | 是否为实际图层(true)或仅为分组节点(false) |
删除和移动节点
java
// 删除子节点
parentNode.removeChild(0);
// 将节点移动到另一个父节点的指定位置
node.moveTo(newParent, 2);
设置图层属性
java
// 设置名称
node.setName("Background Layer");
// 设置默认可见性
node.setDefaultVisible(true);
控制图层用途
图层的用途(Usage)决定了在不同场景下的行为:
视图和导出用途
java
// 设置视图可见性(使用 LayerTree 状态常量)
node.setViewUsage(LayerTree.e_StateON);
// 设置导出行为
node.setExportUsage(LayerTree.e_StateOFF);
打印用途
java
LayerPrintData printData = node.getPrintUsage();
node.setPrintUsage(printData);
缩放用途
java
LayerZoomData zoomData = node.getZoomUsage();
node.setZoomUsage(zoomData);
移除用途设置
java
node.removeUsage(usageType);
图层查询
java
// 检查节点是否为实际图层
boolean isLayer = node.hasLayer();
// 检查图层是否被锁定
boolean locked = node.isLocked();
// 检查图层是否存在于指定页面
boolean inPage = node.isInPage(page);
// 检查图层是否具有指定意图
boolean hasIntent = node.hasIntent("View");
管理图层中的图形对象
可以获取、添加和移除图层节点中关联的页面图形对象:
java
// 获取图层在指定页面上的图形对象
GraphicsObjectArray objects = node.getGraphicsObjects(page);
// 向图层添加图形对象
node.addGraphicsObject(page, graphicsObject);
// 从图层移除图形对象
node.removeGraphicsObject(graphicsObject);
完整示例:遍历图层树
java
PDFDoc doc = new PDFDoc(filePath);
doc.load(null);
if (!doc.hasLayer()) return;
LayerTree layerTree = new LayerTree(doc);
LayerNode root = layerTree.getRootNode();
printLayerNode(root, 0);
private void printLayerNode(LayerNode node, int depth) throws PDFException {
String indent = new String(new char[depth * 2]).replace('\0', ' ');
String name = node.getName();
boolean isLayer = node.hasLayer();
Log.d("Layer", indent + name + (isLayer ? " [Layer]" : " [Group]"));
int count = node.getChildrenCount();
for (int i = 0; i < count; i++) {
printLayerNode(node.getChild(i), depth + 1);
}
}
API 参考
LayerTree、LayerNode 的完整接口说明请参阅 API 手册。