【问题标题】:How to add/project iTextSharp vectors如何添加/投影 iTextSharp 向量
【发布时间】:2015-12-23 10:13:42
【问题描述】:

问题

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

有简单的方法吗?

上下文

我正在实现一个ITextExtractionStrategy,如果它们将文本收集成块class MyTextChunk

  • 在同一行renderInfo.GetBaseline()
  • 密切关注以避免连接表格中不同列的文本
  • 和高度一样:renderInfo .GetAscentLine().GetStartPoint() .Subtract(renderInfo .GetDescentLine() .GetStartPoint()) .Length

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

如果 this 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 类是为内部使用而创建的,更具体地说是为了进行坐标系计算。 用它们做什么?这个问题背后的用例是什么?
  • 无论如何:我们不需要加法或投影方法,因为在 PDF 中,坐标系的所有变换都使用Matrix 表示。平移、旋转、缩放……所有这些变换都是使用 6 个值定义的(如果您期望 9 个,请再想一想:PDF 页面是二维的,因此矩阵的 3 个值预定义为 001)。如有疑问,请查阅 ISO-32000-1。

标签: vector itextsharp itext


【解决方案1】:

Vector 类用于在解析文档时存储点在 PDF 页面上的位置。例如:对于 PDF 内容流中的每个文本 sn-p,我们存储多个 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 类不再需要更多方法,因为解析器总是为我们提供 cm 运算符的 6 个操作数,因此我们始终拥有创建 Matrix 对象所需的所有元素。

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

【讨论】:

  • 那么Matrix offsetMatrix = new Matrix(offsetVector[Vector.I1], offsetVector[Vector.I2]); ?
猜你喜欢
  • 1970-01-01
  • 2015-10-04
  • 1970-01-01
  • 2011-01-11
  • 2017-09-09
  • 2018-08-16
  • 2012-08-04
  • 2015-03-23
  • 2012-11-10
相关资源
最近更新 更多