猿问

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

文件示例: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(正确!)。所以我的问题是导致第一页背景不正确的原因......提前致谢!


四季花海
浏览 122回答 1
1回答

海绵宝宝撒

这是 PDFBox 中的一个错误。(好吧,您的代码中也存在问题,但手头问题的原因是基于 PDFBox。)错误问题是PDColor.toRGB()调用fillColorRgb&nbsp;=&nbsp;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]&nbsp;=&nbsp;clipToRange(input[i],&nbsp;domain.getMin(),&nbsp;domain.getMax());input[i]&nbsp;=&nbsp;interpolate(input[i],&nbsp;domain.getMin(),&nbsp;domain.getMax(),&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;encodeValues.getMin(),&nbsp;encodeValues.getMax());input[i]&nbsp;=&nbsp;clipToRange(input[i],&nbsp;0,&nbsp;sizeValues[i]&nbsp;-&nbsp;1);但是这个数组是原来的PDColor成员components。因此,此评估将颜色对象的单个分量从 0.172 更改为 43.688。后来toRGB对该颜色的调用找到了 43.688(或由于进一步不需要的变化而导致的其他值),它远远超出了最大值 1.0,因此他们将其裁剪为 1.0 并从那里进行转换。但是该颜色空间中带有 1.0 分量的颜色正是用于前景文本的颜色。因此,您的代码认为背景和前景是相同的。一种解决方法要解决此问题,PDFunctionType0.eval(float[])应重写方法以不写入其参数数组。一个快速的方法是添加input&nbsp;=&nbsp;input.clone();在该方法的顶部PDFunctionType0.eval(float[])。您的代码中的问题您的方法getTextPositionCenterPoint使用页面旋转来确定给定的基线中心TextPosition。但是,这仅适用于页面旋转后垂直绘制的文本。但是,对于您的文档,情况并非如此。因此,您需要分析文本矩阵以了解文本的实际方向,而不是页面旋转。不过,这不会对您的情况产生太大影响,因为TextPosition.getWidth()您用作字符宽度的值也是根据页面旋转计算的。由于相关页面未旋转,但文本方向旋转了 90°,因此TextPosition.getWidth()始终返回 0...您可能希望使用getWidthDirAdj()...
随时随地看视频慕课网APP

相关分类

Java
我要回答