如何 add/project iTextSharp 向量

How to add/project iTextSharp vectors

问题

PDF 工具包 iText(Sharp) 有其 own vector type,实施 SubstractDot 产品 Cross 产品和 Multiply,但我没有查看向量的 添加 或一个向量到另一个向量的 投影

有简单的方法吗?

上下文

我正在实施 ITextExtractionStrategy,如果 将文本收集到块中 (class MyTextChunk)

如果我遇到一个单个较小的上标字符(即在基线上方,但不在上升线上方),我想这是稍后在文本并将其作为 char referable 存储在块中。

如果此 referable 后面紧跟更多文本,则此文本必须包含在块中。因此,我需要将基线扩展到可引用字符之后。所以我想写点像

    public bool Append(TextRenderInfo renderInfo)
    {
        ...
        if (thisIsAReferable) 
        {
            this.referable = infoText.Trim()[0];
            Vector offsetVector = baseVector.Multiply(
                baseVector.Dot(renderInfo.GetBaseline().GetEndPoint()
                .Subtract(this.baseline.GetStartPoint()))
                / baseVector.LengthSquared);
            this.baseline = new LineSegment(this.baseline.GetStartPoint(), 
                this.baseline.GetStartPoint().Add(offsetVector));
            ...                
            return true;
        }
        ...
    }

备注:offsetVector的计算尚未验证

Vector class 用于在解析文档时存储点在PDF页面上的位置。例如:对于 PDF 内容流中的每个文本片段,我们存储几个 LineSegment 对象:一个知道基线在哪里开始和结束,一个知道上升线在哪里开始和结束,一个知道在哪里下降线开始和结束。一个 LineSegment 有两个 Vector 元素,一个用于开始,一个用于结束。

PDF 页面上的默认坐标系具有指向右侧的 X 轴和指向上方的 Y 轴。坐标系的原点取决于 MediaBox 的值(每个 PDF 页面的强制性 属性)。

可以使用变换 (*) 更改默认坐标系。转换是使用如下所示的矩阵定义的:

改变坐标系的运算符(cm运算符)需要6个操作数:abcdef。我们不需要这个矩阵中的 9 个操作数,因为我们在二维空间中工作。

如果要定义翻译,ad应该是1bc 应该是 0。您可以通过更改 e 的值来定义 X 方向的平移;通过更改 f.

的值在 Y 方向

您可以通过将bcef定义为0并将a更改为定义 X 方向的比例因子,更改 d 以定义 Y 方向的比例因子。等等。所有这些在 ISO-32000-1 中都有详细解释。

我建议您使用 cross() 方法和定义 6 个元素的矩阵执行平移(添加)和其他转换。

我们从来不需要 Vector class 的更多方法,因为解析器总是给我们 cm 运算符的 6 个操作数,所以我们总是拥有所有必要的元素创建一个 Matrix 对象。

(*) 在 PDF 中,我们不转换对象。我们变换坐标系!我看到你住在比利时。我也是,我必须承认变换坐标系的概念似乎有点违反直觉,因为我们的学校和大学教我们变换对象,而不是坐标系。