Skip to content

图层(可选内容)

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() 参数说明:

参数类型说明
indexint插入位置索引
nameString图层名称
has_Layerboolean是否为实际图层(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 参考

LayerTreeLayerNode 的完整接口说明请参阅 API 手册