PDF工具包iText(夏普)有own vector type,实施Substract
,Dot
产品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的计算尚未验证。
答案 0 :(得分:1)
Vector
类用于在解析文档时存储PDF页面上的点的位置。例如:对于PDF内容流中的每个文本片段,我们存储了几个LineSegment
个对象:一个知道基线开始和结束的位置,一个知道上升线开始和结束的位置,一个知道在哪里下降线开始和结束。 LineSegment
有两个Vector
元素,一个用于开头,一个用于结尾。
PDF页面上的默认坐标系有一个指向右侧的X轴和一个指向上方的Y轴。坐标系的原点取决于MediaBox
的值(每个PDF页面的强制属性)。
可以使用转换(*)更改默认坐标系。使用如下矩阵定义转换:
更改坐标系(cm
运算符)的运算符需要6个操作数:a
,b
,c
,d
,{{1 }和e
。我们在这个矩阵中不需要9个操作数,因为我们在两个维度上工作。
如果您要定义翻译,f
和a
应为d
; 1
和b
应为c
。您可以通过更改0
的值来定义X方向的平移;通过更改e
的值来在Y方向上。
您可以通过将f
,b
,c
和e
定义为f
来缩放坐标系,并更改0
以定义在X方向上缩放因子,更改a
以在Y方向上定义缩放因子。等等。所有这些都在ISO-32000-1中有详细解释。
我建议您使用d
方法和定义6个元素的矩阵执行翻译(添加)和其他转换。
我们从不需要cross()
类的更多方法,因为解析器总是给我们Vector
运算符的6个操作数,所以我们总是拥有创建{的所有必要元素{1}}对象。
(*)在PDF中,我们不会转换对象。我们改变了坐标系!我看到你住在比利时。我也是如此,我必须承认,改变坐标系的概念似乎有点违反直觉,因为我们的学校和大学教会我们改造对象,而不是协调系统。