Skip to content

页面对象

福昕 PDF SDK 安卓版通过 Core SDK 提供了两个层级的页面内容操作 API:

  • PDFPage 快捷接口 — 通过 PDFPage 的快捷方法向页面添加文本或图片,适合常见场景。
  • 图形对象 API — 通过图形对象(Graphics Objects)直接操作页面内容流,支持创建、遍历、修改和删除文本、图片、路径等对象,适合需要精确控制的高级场景。

PDFPage 快捷接口:插入文本与图片

PDFPage 提供了以下快捷方法,无需手动管理图形对象和内容流:

插入图片

从文件路径插入:

java
PDFPage.addImageFromFilePath(String file_path, PointF position,
    float width, float height, boolean auto_generate_content)

从 Image 对象插入(支持多帧图片):

java
PDFPage.addImage(Image image, int frame_index, PointF position,
    float width, float height, boolean auto_generate_content)

备注

调用 addImage / addImageFromFilePath 前,需先获取并解析目标页面。

示例:

java
PDFDoc doc = new PDFDoc(filePath);
doc.load(null);

PDFPage page = doc.getPage(0);
if (!page.isParsed()) {
    Progressive parse = page.startParse(PDFPage.e_ParsePageNormal, null, false);
    int state = Progressive.e_ToBeContinued;
    while (state == Progressive.e_ToBeContinued) {
        state = parse.resume();
    }
}

page.addImageFromFilePath("/sdcard/FoxitSDK/logo.png",
    new PointF(20, 30), 60, 50, true);

doc.saveAs(outputPath, PDFDoc.e_SaveFlagNormal);

插入文本

java
PDFPage.addText(String text, RectF rect, RichTextStyle style)
PDFPage.addText(String text, RectF rect, RichTextStyle style, int rotation)

其中 RichTextStyle 用于设置字体、字号、颜色、粗体、斜体、下划线等文本样式。

示例:

java
RichTextStyle style = new RichTextStyle();
style.setFont(new Font(Font.e_StdIDHelvetica));
style.setText_size(16.0f);
style.setText_color(0xFF000000);
style.setIs_bold(true);
style.setText_alignment(CommonDefines.e_AlignmentLeft);

page.addText("Hello, Foxit PDF SDK!", new RectF(50, 750, 400, 700), style);

doc.saveAs(outputPath, PDFDoc.e_SaveFlagNormal);

图形对象 API:精确操作页面内容

以下内容介绍直接操作页面内容流中图形对象的 API,适用于需要精确控制对象属性、位置和层叠顺序的场景。

核心类

包路径说明
GraphicsObjectscom.foxit.sdk.pdf页面图形对象集合(PDFPage 的父类),管理对象的插入、删除和遍历
GraphicsObjectcom.foxit.sdk.pdf.graphics图形对象基类,提供类型、颜色、矩阵变换、透明度等通用属性
TextObjectcom.foxit.sdk.pdf.graphics文本对象 — 创建和编辑页面中的文本
ImageObjectcom.foxit.sdk.pdf.graphics图片对象 — 创建和编辑页面中的图片
PathObjectcom.foxit.sdk.pdf.graphics路径对象 — 创建和编辑页面中的矢量图形
FormXObjectcom.foxit.sdk.pdf.graphicsForm XObject — 可复用的页面内容片段
ShadingObjectcom.foxit.sdk.pdf.graphics着色对象

图形对象类型

常量说明
GraphicsObject.e_TypeAll0所有类型
GraphicsObject.e_TypeText1文本对象
GraphicsObject.e_TypePath2路径对象
GraphicsObject.e_TypeImage3图片对象
GraphicsObject.e_TypeShading4着色对象
GraphicsObject.e_TypeFormXObject5Form XObject

遍历页面图形对象

PDFPage 继承自 GraphicsObjects,可直接遍历页面中的图形对象:

java
PDFPage page = doc.getPage(0);
if (!page.isParsed()) {
    Progressive parse = page.startParse(PDFPage.e_ParsePageNormal, null, false);
    int state = Progressive.e_ToBeContinued;
    while (state == Progressive.e_ToBeContinued) {
        state = parse.resume();
    }
}

long pos = page.getFirstGraphicsObjectPosition(GraphicsObject.e_TypeAll);
while (pos != 0) {
    GraphicsObject obj = page.getGraphicsObject(pos);
    int type = obj.getType();

    switch (type) {
        case GraphicsObject.e_TypeText:
            TextObject textObj = obj.getTextObject();
            String text = textObj.getText();
            break;
        case GraphicsObject.e_TypeImage:
            ImageObject imgObj = obj.getImageObject();
            break;
        case GraphicsObject.e_TypePath:
            PathObject pathObj = obj.getPathObject();
            break;
    }

    pos = page.getNextGraphicsObjectPosition(pos, GraphicsObject.e_TypeAll);
}

创建文本对象

java
TextObject textObj = TextObject.create();
textObj.setText("Hello, Foxit SDK!");

TextState textState = new TextState();
textState.font_size = 24.0f;
textState.font = new Font(Font.e_StdIDHelvetica);
textState.textmode = TextState.e_ModeFill;
textObj.setTextState(page, textState, false, 400);

textObj.setFillColor(0xFF000000);

// 设置位置(通过变换矩阵)
Matrix2D matrix = new Matrix2D(1, 0, 0, 1, 100, 700);
textObj.setMatrix(matrix);

// 插入到页面末尾
long lastPos = page.getLastGraphicsObjectPosition(GraphicsObject.e_TypeAll);
page.insertGraphicsObject(lastPos, textObj);

// 生成内容流(必须调用,否则修改不会生效)
page.generateContent();

注意

对页面图形对象进行插入、删除或修改后,必须调用 page.generateContent() 来将更改写入页面内容流。

创建图片对象

java
ImageObject imgObj = ImageObject.create(doc);

Bitmap bitmap = BitmapFactory.decodeFile(imagePath);
imgObj.setBitmap(bitmap, null);

Matrix2D matrix = new Matrix2D(200, 0, 0, 150, 100, 500);
imgObj.setMatrix(matrix);

long lastPos = page.getLastGraphicsObjectPosition(GraphicsObject.e_TypeAll);
page.insertGraphicsObject(lastPos, imgObj);
page.generateContent();

创建路径对象

java
PathObject pathObj = PathObject.create();

Path pathData = new Path();
pathData.moveTo(new PointF(100, 700));
pathData.lineTo(new PointF(300, 700));
pathData.lineTo(new PointF(300, 500));
pathData.closeFigure();

pathObj.setPathData(pathData);
pathObj.setFillMode(Path.e_FillModeAlternate);
pathObj.setStrokeState(true);
pathObj.setStrokeColor(0xFF0000FF);
pathObj.setFillColor(0x80FFFF00);

long lastPos = page.getLastGraphicsObjectPosition(GraphicsObject.e_TypeAll);
page.insertGraphicsObject(lastPos, pathObj);
page.generateContent();

创建 Form XObject

FormXObject 是可复用的内容容器,可以将一个页面的内容导入为 XObject:

java
FormXObject formXObj = FormXObject.create(doc);

// 从源页面导入内容(包含或排除注释)
formXObj.importPageContent(sourcePage, false);

// 获取 FormXObject 内部的图形对象集合
GraphicsObjects innerObjects = formXObj.getGraphicsObjects();

删除图形对象

java
page.removeGraphicsObject(graphicsObject);

// 或按位置删除
page.removeGraphicsObjectByPosition(position);

page.generateContent();

移动图形对象顺序

java
// 将对象从当前位置移动到指定位置之后
page.moveGraphicsObjectByPosition(currentPos, targetPos);
page.generateContent();

API 参考

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