为了账号安全,请及时绑定邮箱和手机立即绑定

由于某种原因,首页的背景颜色不正确

由于某种原因,首页的背景颜色不正确

四季花海 2022-06-15 15:35:53
文件示例:here 问题:我正在尝试确定文本是否在页面上可见。为此,对于每个填充命令,我都会保存其路径 + 颜色,如下所示:    public class FillNonZeroRule extends OperatorProcessor {        @Override        public final void process(Operator operator, List<COSBase> operands) throws IOException {            PDGraphicsState gs = getGraphicsState();                linePath.setWindingRule(GeneralPath.WIND_NON_ZERO);            addFillPath(gs.getNonStrokingColor());            linePath.reset();        }        @Override        public String getName() {            return "f";        }    }    void addFillPath(PDColor color) {        filledPaths.put((GeneralPath)linePath.clone(), color);    }而且,这就是我后来为每个角色获取背景的方式:private PDColor getCharacterBackgroundColor(TextPosition text) {        PDColor color = null;                   for (Map.Entry<GeneralPath, PDColor> filledPath : filledPaths.entrySet()) {            Vector center = getTextPositionCenterPoint(text);            if (filledPath.getKey().contains(lowerLeftX + center.getX(), lowerLeftY + center.getY())) {                color = filledPath.getValue();                              }        }        return color;    }此外,还要为每个文本位置保存颜色。然后我尝试确定该背景颜色是否与字符颜色相同。有趣的是,对于第一页的背景颜色和标题的文本颜色(顶部有背景的行)都是 2301728(int RGB 值) - 这是不正确的,但是,对于第二页,文本颜色是 2301728,背景颜色是14145754(正确!)。所以我的问题是导致第一页背景不正确的原因......提前致谢!
查看完整描述

1 回答

?
海绵宝宝撒

TA贡献1809条经验 获得超8个赞

这是 PDFBox 中的一个错误。

(好吧,您的代码中也存在问题,但手头问题的原因是基于 PDFBox。)

错误

问题是PDColor.toRGB()调用

fillColorRgb = filledPath.getValue().toRGB();

损坏有问题的特定颜色的颜色值本身!

所讨论的颜色空间是分离颜色空间。因此,PDColor.toRGB()调用PDSeparation.toRGB(float[])使用其components成员作为参数。

如果给定参数的 RGB 值尚未缓存在颜色空间中,PDSeparation.toRGB(float[])则评估给定参数的 RGB 值tintTransform。对于有问题的色彩空间,色调变换是一个PDFunctionType0实例。因此,PDFunctionType0.eval(float[])被称为。

不幸的是PDFunctionType0.eval(float[]),假设它可以将数组参数input用于自己的目的:

input[i] = clipToRange(input[i], domain.getMin(), domain.getMax());input[i] = interpolate(input[i], domain.getMin(), domain.getMax(), 
        encodeValues.getMin(), encodeValues.getMax());input[i] = clipToRange(input[i], 0, sizeValues[i] - 1);

但是这个数组是原来的PDColor成员components。因此,此评估将颜色对象的单个分量从 0.172 更改为 43.688。

后来toRGB对该颜色的调用找到了 43.688(或由于进一步不需要的变化而导致的其他值),它远远超出了最大值 1.0,因此他们将其裁剪为 1.0 并从那里进行转换。但是该颜色空间中带有 1.0 分量的颜色正是用于前景文本的颜色。因此,您的代码认为背景和前景是相同的。

一种解决方法

要解决此问题,PDFunctionType0.eval(float[])应重写方法以不写入其参数数组。一个快速的方法是添加

input = input.clone();

在该方法的顶部PDFunctionType0.eval(float[])

您的代码中的问题

您的方法getTextPositionCenterPoint使用页面旋转来确定给定的基线中心TextPosition。但是,这仅适用于页面旋转后垂直绘制的文本。但是,对于您的文档,情况并非如此。因此,您需要分析文本矩阵以了解文本的实际方向,而不是页面旋转。

不过,这不会对您的情况产生太大影响,因为TextPosition.getWidth()您用作字符宽度的值也是根据页面旋转计算的。由于相关页面未旋转,但文本方向旋转了 90°,因此TextPosition.getWidth()始终返回 0...您可能希望使用getWidthDirAdj()...


查看完整回答
反对 回复 2022-06-15
  • 1 回答
  • 0 关注
  • 121 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信