You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用PDFBox获取PDF文档中文字的渐变色属性?

使用PDFBox获取PDF文字的渐变色属性

可以通过PDFBox获取PDF文档中文字的渐变色属性,但需要注意:PDF里的文字渐变是绑定在图形状态的填充/描边颜色设置上,而非直接关联文本对象,因此需要跟踪文本绘制时的图形状态,并解析对应的渐变资源。

实现思路与步骤

  1. 跟踪图形状态:自定义PDFTextStripper,在处理文本位置时获取当前的图形状态(GraphicsState),从中提取填充/描边颜色。
  2. 识别渐变颜色空间:判断颜色是否属于PDShadingPattern类型(PDF中渐变的核心载体)。
  3. 提取渐变参数:从PDShading对象中获取渐变类型(轴向/径向)、颜色停止点、变换矩阵等详细属性。

示例代码

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.graphics.PDColor;
import org.apache.pdfbox.pdmodel.graphics.PDGraphicsState;
import org.apache.pdfbox.pdmodel.graphics.shading.PDAxialShading;
import org.apache.pdfbox.pdmodel.graphics.shading.PDRadialShading;
import org.apache.pdfbox.pdmodel.graphics.shading.PDShading;
import org.apache.pdfbox.pdmodel.graphics.shading.PDShadingPattern;
import org.apache.pdfbox.text.PDFTextStripper;
import org.apache.pdfbox.text.TextPosition;

import java.io.File;
import java.io.IOException;

public class GradientTextExtractor extends PDFTextStripper {
    public GradientTextExtractor() throws IOException {
        super();
    }

    @Override
    protected void processTextPosition(TextPosition text) {
        super.processTextPosition(text);
        PDGraphicsState currentGs = getGraphicsState();

        // 处理填充渐变(文字通常用填充色)
        PDColor fillColor = currentGs.getNonStrokingColor();
        parseGradientColor(fillColor, "填充");

        // 如需处理描边渐变(文字描边带渐变的情况)
        PDColor strokeColor = currentGs.getStrokingColor();
        parseGradientColor(strokeColor, "描边");
    }

    private void parseGradientColor(PDColor color, String type) {
        if (color.getColorSpace() instanceof PDShadingPattern) {
            PDShadingPattern pattern = (PDShadingPattern) color.getColorSpace();
            PDShading shading = pattern.getShading();

            System.out.printf("检测到%s渐变:%n", type);
            if (shading instanceof PDAxialShading) {
                PDAxialShading axialShading = (PDAxialShading) shading;
                System.out.println("渐变类型:轴向渐变");
                System.out.println("起止坐标:" + axialShading.getCoords());
                System.out.println("颜色停止点:" + axialShading.getColorStops());
                System.out.println("变换矩阵:" + axialShading.getMatrix());
            } else if (shading instanceof PDRadialShading) {
                PDRadialShading radialShading = (PDRadialShading) shading;
                System.out.println("渐变类型:径向渐变");
                System.out.println("圆心与半径参数:" + radialShading.getCoords());
                System.out.println("颜色停止点:" + radialShading.getColorStops());
            }
            System.out.println("-----");
        }
    }

    public static void main(String[] args) throws IOException {
        try (PDDocument doc = PDDocument.load(new File("new york.pdf"))) {
            GradientTextExtractor extractor = new GradientTextExtractor();
            extractor.getText(doc);
        }
    }
}

关键注意事项

  • 确保使用PDFBox 2.x版本,旧版本的渐变相关API与示例代码不兼容。
  • 若渐变定义在表单XObject或嵌套内容流中,需额外遍历这些对象的内容流以跟踪图形状态。
  • 部分PDF可能将渐变封装在间接资源中,PDFBox会自动处理资源加载,但需注意文档的权限设置(如是否允许资源提取)。

内容的提问来源于stack exchange,提问作者Serendipity

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 00:47:33