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()
...
添加回答
举报