如何 add/project iTextSharp 向量
How to add/project iTextSharp vectors
问题
PDF 工具包 iText(Sharp) 有其 own vector type,实施 Substract
、Dot
产品 Cross
产品和 Multiply
,但我没有查看向量的 添加 或一个向量到另一个向量的 投影 。
有简单的方法吗?
上下文
我正在实施 ITextExtractionStrategy
,如果 将文本收集到块中 (class MyTextChunk
)
- 在同一行
renderInfo.GetBaseline()
- 密切关注以避免在table
中连接来自不同列的文本
- 身高相同:
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的计算尚未验证
Vector
class 用于在解析文档时存储点在PDF页面上的位置。例如:对于 PDF 内容流中的每个文本片段,我们存储几个 LineSegment
对象:一个知道基线在哪里开始和结束,一个知道上升线在哪里开始和结束,一个知道在哪里下降线开始和结束。一个 LineSegment
有两个 Vector
元素,一个用于开始,一个用于结束。
PDF 页面上的默认坐标系具有指向右侧的 X 轴和指向上方的 Y 轴。坐标系的原点取决于 MediaBox
的值(每个 PDF 页面的强制性 属性)。
可以使用变换 (*) 更改默认坐标系。转换是使用如下所示的矩阵定义的:
改变坐标系的运算符(cm
运算符)需要6个操作数:a
、b
、c
、d
、e
和 f
。我们不需要这个矩阵中的 9 个操作数,因为我们在二维空间中工作。
如果要定义翻译,a
和d
应该是1
; b
和 c
应该是 0
。您可以通过更改 e
的值来定义 X 方向的平移;通过更改 f
.
的值在 Y 方向
您可以通过将b
、c
、e
和f
定义为0
并将a
更改为定义 X 方向的比例因子,更改 d
以定义 Y 方向的比例因子。等等。所有这些在 ISO-32000-1 中都有详细解释。
我建议您使用 cross()
方法和定义 6 个元素的矩阵执行平移(添加)和其他转换。
我们从来不需要 Vector
class 的更多方法,因为解析器总是给我们 cm
运算符的 6 个操作数,所以我们总是拥有所有必要的元素创建一个 Matrix
对象。
(*) 在 PDF 中,我们不转换对象。我们变换坐标系!我看到你住在比利时。我也是,我必须承认变换坐标系的概念似乎有点违反直觉,因为我们的学校和大学教我们变换对象,而不是坐标系。
问题
PDF 工具包 iText(Sharp) 有其 own vector type,实施 Substract
、Dot
产品 Cross
产品和 Multiply
,但我没有查看向量的 添加 或一个向量到另一个向量的 投影 。
有简单的方法吗?
上下文
我正在实施 ITextExtractionStrategy
,如果 将文本收集到块中 (class MyTextChunk
)
- 在同一行
renderInfo.GetBaseline()
- 密切关注以避免在table 中连接来自不同列的文本
- 身高相同:
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的计算尚未验证
Vector
class 用于在解析文档时存储点在PDF页面上的位置。例如:对于 PDF 内容流中的每个文本片段,我们存储几个 LineSegment
对象:一个知道基线在哪里开始和结束,一个知道上升线在哪里开始和结束,一个知道在哪里下降线开始和结束。一个 LineSegment
有两个 Vector
元素,一个用于开始,一个用于结束。
PDF 页面上的默认坐标系具有指向右侧的 X 轴和指向上方的 Y 轴。坐标系的原点取决于 MediaBox
的值(每个 PDF 页面的强制性 属性)。
可以使用变换 (*) 更改默认坐标系。转换是使用如下所示的矩阵定义的:
改变坐标系的运算符(cm
运算符)需要6个操作数:a
、b
、c
、d
、e
和 f
。我们不需要这个矩阵中的 9 个操作数,因为我们在二维空间中工作。
如果要定义翻译,a
和d
应该是1
; b
和 c
应该是 0
。您可以通过更改 e
的值来定义 X 方向的平移;通过更改 f
.
您可以通过将b
、c
、e
和f
定义为0
并将a
更改为定义 X 方向的比例因子,更改 d
以定义 Y 方向的比例因子。等等。所有这些在 ISO-32000-1 中都有详细解释。
我建议您使用 cross()
方法和定义 6 个元素的矩阵执行平移(添加)和其他转换。
我们从来不需要 Vector
class 的更多方法,因为解析器总是给我们 cm
运算符的 6 个操作数,所以我们总是拥有所有必要的元素创建一个 Matrix
对象。
(*) 在 PDF 中,我们不转换对象。我们变换坐标系!我看到你住在比利时。我也是,我必须承认变换坐标系的概念似乎有点违反直觉,因为我们的学校和大学教我们变换对象,而不是坐标系。