根据位置c ++从PDF文档中提取文本

Ale*_*ruC 5 c++ pdf podofo

我试图根据它的坐标从PDF文档中提取文本,所以我在Adobe PDF参考中遇到了两个概念(第5.3章):

  1. 文本定位运算符
  2. 文本显示运算符

现在我对Td&Tm定位运算符感兴趣,而使用Td你有txty,相对于当前行的开始,这在PDF文档中有明确规定: tx ty Td,我已经使用这种方法通过tx提取文本和ty坐标.问题是我不知道如何根据其位置从PDF中提取文本,同时仅提供txty.

a b c d e f Tm
Run Code Online (Sandbox Code Playgroud)

这是'Tm用法'.af值代表什么?这将是我对Tm的输入:

BT
/F1 8.88 Tf
0 0 0 rg
0.9998 0 0 1 401.52 448.08 Tm
[<0014>-11<0015>-11<0013>-11<000F>-19<0014>-11<0019>] TJ
ET
Run Code Online (Sandbox Code Playgroud)

为什么每组四人都有一个领先的00?这是十六进制?我应该将它从十六进制转换为int和相应的字符吗?

这将是我对Td的输入:

BT 43.20 421.90 Td 0 Tw /C001 10.00 Tf 0.00 Tw <BlablablaTextInHexThatICanProcess>Tj ET
Run Code Online (Sandbox Code Playgroud)

这更加清晰,坐标更清晰.如何根据简单的X和Y坐标从Tm定位的PDF文本对象中提取文本?我正在使用c ++和PoDoFo库

mkl*_*mkl 16

首先,当试图从中提取基于其位置的PDF文本,而只供应tx和ty,它并不能足以只考虑文本矩阵(其中设置使用的Tm你已经找到运营商).您还必须考虑当前的转换矩阵!

我假设当您引用默认用户空间坐标中给出的位置时.

为了避免在设备空间中指定对象的设备相关影响,PDF定义了与设备无关的坐标系统,该坐标系统始终与当前页面具有相同的关系,无论打印或显示的输出设备如何.这种与设备无关的坐标系称为用户空间.

用户空间坐标系应初始化为文档每页的默认状态.页面字典中的CropBox条目应指定与预期输出介质(显示窗口或打印页面)的可见区域相对应的用户空间矩形.正x轴水平向右延伸,正y轴垂直向上延伸

(第8.3.2.3节,ISO 32000-1:2008)

由于我们只看到x和y坐标,我们将位置看作R²中的向量(x,y).但是,在内部,PDF认为这个平面嵌入在R³中,具有恒定的z坐标值1,即[x,y,1].这是因为PDF希望允许多种变换(平移,旋转,缩放,倾斜......),但另一方面想要尽可能地限制所需的数学运算.顺便说一句,在将我们的平面作为[x,y,1]嵌入到R³之后,所有这些变换都可以通过矩阵乘法来实现:

单一转型

在这里,您已经看到了您询问的那些数字a,b,c,d,e和f.

现在,在考虑文本特定的转换之前,您必须考虑当前(文本无关的)转换矩阵的操作.此矩阵由cm运算符操作:

abcdef cm通过连接指定的矩阵来修改当前的变换矩阵(CTM)(参见8.3.2,"坐标空间").尽管操作数指定了矩阵,但它们应写为六个单独的数字,而不是数组.

(第8.4.4节,ISO 32000-1:2008)

这意味着,BTW,您必须考虑当前正在运行的所有cm运算符,即自页面内容开始以来所有运算符,除了通过恢复以前的图形状态而撤销的运算符(参见运算符qQ推送和恢复图形状态,第8.4.2节,ISO 32000-1:2008).

只有现在你可以考虑文本特定的转换矩阵:

在文本对象的开头,Tm应为单位矩阵; 因此,文本空间的起源应该与用户空间的起源相同.表108中描述的文本定位操作符改变Tm,从而控制随后绘制的字形的放置.此外,表109中描述的文本显示运算符更新Tm(通过改变其e和f平移分量)以考虑绘制的每个字形的水平或垂直位移以及任何字符或字间距参数.文字状态.

另外,在文本对象内,符合标准的阅读器应跟踪文本行矩阵Tlm,该矩阵在一行文本的开头捕获Tm的值.文本定位和文本显示操作符应在表108和109中提到的特定场合读取和设置Tlm

(第9.4.2节,ISO 32000-1:2008)

因此,在文本对象内部,您必须跟踪文本矩阵,该文本矩阵主要使用您在矩阵中排列的操作数(如上所示)找到的Tm运算符,但也可以作为其他文本定位和文本的效果进行处理显示运营商.

并且还有其他参数确定文本的最终位置,文本状态参数Tfs(文本字体大小),Th(水平缩放)和Trise(文本上升),参见 第9.3.1节,ISO 32000-1:2008.

从概念上讲,从文本空间到设备空间[或在您的情况下到默认用户空间]的整个转换可以由文本呈现矩阵Trm表示:

文本渲染矩阵

Trm是一个临时矩阵; 从概念上讲,在文本显示操作期间绘制每个字形之前重新计算它.

(第9.4.2节,ISO 32000-1:2008)

因此,您的坐标(x,y)在概念上是通过乘以Trm从文本空间坐标得到的:

[x,y,1] = [xts,yts,1] x Trm

其中(xts,yts)是字形原点的(0,0).对于每个打印的字形,您都有一个字形位移,以到达下一个字形原点所在的位置:

字形位移

文本矩阵应由这些字形位移值更新,如下所示:

通过字形位移更新文本矩阵

(第9.4.4节,ISO 32000-1:2008)

我引用了当前PDF规范ISO 32000-1:2008中的一些段落.我认为这比使用PDF参考资料1.4更为可取; 此外,它被Adobe个人称为"非规范性".

编辑 回答评论的一些澄清

设备空间和用户空间,它们之间有什么区别,是不是设备空间受到打印机/视频显示的影响?和用户空间,以克服每个设备的特殊性?喜欢用户页面是我看到的文档页面?

是的,设备空间是一个固定的坐标系,主要取决于手头设备的属性.是的,用户空间是与目标设备无关的坐标系.但不,它不是"您看到的文档页面",因为您在某些设备上(或在某些设备处理后)看到它.

用户空间坐标系是一个独立的坐标系,其点的坐标可以通过与当前变换矩阵(CTM)的矩阵乘法转换为设备坐标.

UserCoords x CTM = DeviceCoords

用户空间坐标系被初始化为这样一种状态,其中页面字典的CropBox条目通过相应地初始化CTM 来指定对应于可见区域的用户空间的矩形(参见上文).

但是,随着单词的选择已经表明(" 当前变换矩阵","坐标系被初始化 "),用户空间坐标系是动态的,不断变换的坐标系.

无论使用何种输出设备,默认用户空间都为PDF页面描述提供了一致,可靠的起始位置.如果有必要,PDF内容流可通过将修改用户空间更适合自己的需要坐标变换操作,厘米(参见8.4.4节,"图形状态操作符").因此,在内容流中看起来可能是绝对坐标的内容对于当前页面而言不是绝对的,因为它们在可以滑动并收缩或扩展的坐标系中表达.协调系统转换不仅增强了设备独立性,而且本身就是一个有用的工具.

(第8.3.2.3节,ISO 32000-1:2008)

因此,当一个cm运算符PdfReader偶然发现其参数表示某个矩阵M时,CTM会发生变化:

CTMnew = M x CTMold

并且根据这个新矩阵CTMnew解释以下运算符中存在的坐标:

UserCoords x CTMnew = DeviceCoords

所以现在用户空间坐标系可能与它以前的状态,缩放,旋转,倾斜等有很大不同.

您最感兴趣的坐标最有可能是用户空间初始化的坐标系中的坐标,即CTM初始化为单位矩阵的虚拟设备的设备坐标系.

文本空间和字形空间在哪里开始和结束.

文本坐标在文本空间中指定.从文本空间到用户空间的转换由文本矩阵结合图形状态中的几个与文本相关的参数定义(参见9.4.2,"文本定位运算符").

文本矩阵TM在文本对象的开头被初始化为单位矩阵,但在执行文本操作期间发生变化,最明显的是当您使用Tm运算符时,隐式地使用其他运算符时.该矩阵由矩阵TR操纵,矩阵TR包含与文本相关的参数字体大小,水平缩放和文本上升.有关详细信息,请参阅上面的文本呈现矩阵TRM.从而,

DeviceCoords = UserCoords x CTM = TextCoords x TR x TM x CTM

从字形空间到文本空间的转换应由字体矩阵定义.对于大多数类型的字体,应预定义此矩阵以将1000个单位的字形空间映射到1个单位的文本空间; 对于Type 3字体,字体矩阵应在字体字典中明确给出(见9.6.5,"Type 3字体").

因此,此转换取决于当前字体.字体字典中的字体矩阵FM将如下所示:

DeviceCoords = GlyphCoords x FM x TR x TM x CTM

您不希望找到字形的单个片段的设备坐标,因此这些坐标似乎不感兴趣.但是,字形宽度将在字形空间中进行解释.但是,除非您正在处理Type 3字体,否则这仅仅意味着您必须将它们除以1000 ...

在字形绘画过程中,参数w0和w1是如何演变的?他们最初是(0,0)

w0和w1表示字形的水平和垂直位移.在水平书写模式中,w0是转换为文本模式的字形宽度(即,通常仅除以1000),并且w1为0.对于垂直书写模式,文本检查ISO 32000-1:2008中的第9.2.4和9.7.4.3节.

文本空间与第一个字形空间的起源是否相同?并且他们用计算的(tx,ty)更新?

由于字形空间坐标仅仅乘以字体矩阵以在所有情况下产生文本空间坐标和字体矩阵,但对于类型3字体仅压缩1000倍,见上文,字形原点被映射到文本空间起源.

但是tx和ty用于更新文本矩阵本身.因此,文本拼写坐标系针对每个字形移动,并且对于每个(非类型3)字形原点映射移动到稍微改变的文本空间坐标系的原点....