PDF中的文本旋转

PDF中的文本旋转,pdf,floating-point,rotation,coordinates,glyph,Pdf,Floating Point,Rotation,Coordinates,Glyph,所以我有这样的情况: 使用sourceforge.net中的pdftoxml.exe,我得到了文本标记及其坐标。如果pdf文件被旋转(即它的源代码中写入了/Rotate 90),pdftoxml.exe将交换给定页面的高度和宽度以及任何给定对象的x和y坐标。这就是我的理解 我对它很满意,直到我看到一个pdf文件,它使用re来画粗线条。也就是说,对于粗线,绘制4条细线并填充空间,如图所示。在左侧,您可以看到两条细线(非彩色),它们是较大矩形(高度放大)的一部分。我清空了中间实际上充满黑色的空间,以

所以我有这样的情况:

使用sourceforge.net中的
pdftoxml.exe
,我得到了文本标记及其坐标。如果pdf文件被旋转(即它的源代码中写入了
/Rotate 90
),pdftoxml.exe将交换给定页面的高度和宽度以及任何给定对象的x和y坐标。这就是我的理解

我对它很满意,直到我看到一个pdf文件,它使用
re
来画粗线条。也就是说,对于粗线,绘制4条细线并填充空间,如图所示。在左侧,您可以看到两条细线(非彩色),它们是较大矩形(高度放大)的一部分。我清空了中间实际上充满黑色的空间,以查看线条:

此外,上面的pdf是旋转的。因此,为了最终使
B
垂直,使用了以下文本矩阵:
01-1090.7228.3705TM
。细线是从
83.04 27.891 0.48 0.48 re
中这样画出来的(坐标在这里可能会有所不同,但这是一些类似这样的重新操作。操作类似于
x y宽高re
re
是第133页的矩形)。与此相关的是计算
27.891+0.48=28.371
,由于浮点问题,该计算未舍入或更改。这是行x的精确值,不幸的是,它大于硬编码的
B
的x,即
28.3705

83.52 27.891 m 92.39999999999999 27.891 l s

92.39999999999999 27.891 m 92.39999999999999 28.371 l s

92.39999999999999 28.371 m 83.52 28.371 l s

83.52 28.371 m 83.52 27.891 l s
根据左上角的PDFXChange viewer,页面的坐标类似于
842 x 595,2
。这看起来很自然,因为页面是旋转的。不旋转,它将是左下角,所以应该可以


当文本被
1 0 0 1 90.72 28.3705 Tm
更改为其原始方向时,可以看到正在折叠的底线和左侧的线:

这正是我所期望的,因为
B
的y是
28.3705
,而该行的水平位置是
28.371
(如上述代码行的第二行所示)。所以很可能
B
的底线超出了
28.371
,但我无法放大它

现在,第一张图中线条和
B
之间的间隙来自何处?这对我来说很重要,因为我试图找出左边离
B
最近的一行,并对这两个值感到惊讶,即我从pdftoxml.exe获得的文本的支持x值,即
28.3705
和行水平值
28.371
。因为我知道这条线实际上远远超出了
B
的左边,这是不正确的,至少不是在“取线的x位置,取B的x位置,比较一下,如果这条线的x小于
B
的x,那么这条线就在左边”

我找不到具有x值的正确行。相反,我把另一行放在最左边…就像文本落在它们之间一样

这是文本图形代码:

BT
%0 7.5 -7.5 0 90.72 28.3705 Tm
0 1 -1 0 90.72 28.3705 Tm
%1 0 0 1 90.72 28.3705 Tm
/F1 1 Tf
1 Tr
q
0.01 w
(B) Tj
Q
ET
所以,B的大小和线的厚度并没有什么特别的变化

你能帮我弄清楚吗


这是一张更新的图片,在同一页上绘制了两个
I
,对于上层
I
,使用
0 1-1 0 90.72 28.3705 Tm
(数学旋转90度),对于下层
1 0 1 90.72 28.3705 Tm
。所以我不明白,下面的
I
是如何旋转的
+90
,最后变成上面的

这是pdf代码。它相当大,但您应该能够将其复制到您的文件中,并将其命名为sth.pdf

编辑 事实上,我找到了一些关于查找glyph边界框的信息,但我还无法将这些信息组合在一起。

请查看

轮廓原点是轮廓坐标系中的点(0,0)。Tj和其他文本显示操作员应将要绘制的第一个字形的原点定位在文本空间的原点

(无耻地抄袭)

如您所见,图示符所在的坐标(图示符原点)不一定是实际图示符边界框的起点。这也许可以解释你第一张照片中的差距

因此,当你试图从光学角度找出左边哪条线离B最近时,只取线的x位置,取B的x位置,进行比较是不够的,如果线的x小于B的x,则线在左边,相反,您还必须考虑字体数据本身,并考虑字形原点和由B表示的字形边界框之间的间隙

要进行更深入的分析,请提供字体数据

编辑关于你的双I问题。。。在上面的评论中,您说您实际上希望在两个I字符中看到一个公共点-旋转点,因此您可以获得字符左侧边界框的可靠水平坐标


红线交叉点不是你的旋转点吗?它应该是两个Tj操作的标志符号原点,而I-标志符号的原点在那里。现在您可以从这里开始测量。

看起来是相当普遍的浮点比较和舍入问题,所以我们重新标记了。我认为数字没有问题,尽管它们看起来不好看,但在pdf中绘制直线或圆没有问题。而且,数字
28.3705
被硬编码到pdf的源代码中,数字
28.371
27.891+0.48
计算得出,这是正确的答案。很公平。Fwiw,以下是PDF 1.7规范中关于浮点表示的说明:
实对象表示数学实数。数字的范围和精度可能受到运行一致性读取器的计算机中使用的内部表示法的限制
我不知道…可能是。Th