如何添加/投影iTextSharp矢量

时间:2015-12-23 10:13:42

标签: vector itextsharp itext

问题

PDF工具包iText(夏普)有own vector type,实施SubstractDot产品Cross产品和Multiply,但我看不到添加的向量,或者一个向量的投影到另一个向量上。

有一种简单的方法吗?

上下文

我正在实施一个ITextExtractionStrategy将文字收集到块class MyTextChunk),如果他们

  • 位于同一行renderInfo.GetBaseline()
  • 密切关注以避免连接表格中不同列的文本
  • 并且具有相同的高度:renderInfo .GetAscentLine().GetStartPoint() .Subtract(renderInfo .GetDescentLine() .GetStartPoint()) .Length

如果我遇到单个较小的上标字符(即在基线上方,但不在上升线之上),我想这将在文本后面引用并存储为大块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的计算尚未验证。

1 个答案:

答案 0 :(得分:1)

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

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

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

enter image description here

更改坐标系(cm运算符)的运算符需要6个操作数:abcd,{{1 }和e。我们在这个矩阵中不需要9个操作数,因为我们在两个维度上工作。

如果您要定义翻译,fa应为d; 1b应为c。您可以通过更改0的值来定义X方向的平移;通过更改e的值来在Y方向上。

您可以通过将fbce定义为f来缩放坐标系,并更改0以定义在X方向上缩放因子,更改a以在Y方向上定义缩放因子。等等。所有这些都在ISO-32000-1中有详细解释。

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

我们从不需要cross()类的更多方法,因为解析器总是给我们Vector运算符的6个操作数,所以我们总是拥有创建{的所有必要元素{1}}对象。

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