Java 探索pdf中的水平解析TJ(tx公式的详细理解)?

Java 探索pdf中的水平解析TJ(tx公式的详细理解)?,java,pdf,pdfbox,Java,Pdf,Pdfbox,是的,我知道这是一个重复的问题。但我仍然需要了解很多关于水平解析的知识。我在这里期待着完全清楚的答案 我有一些内容流示例,如下所示: 例1: BT /F33 20.665 Tf 72 633.8289 Td [(Chapter)-375(12)]TJ /F33 24.78709 Tf 0 51.30099 Td [(P)31(arametric)-375(and)-375(P)32(olar)-375(Curv)31(es)]TJ 例2: BT /C0_1 14 Tf 39.812999 68

是的,我知道这是一个重复的问题。但我仍然需要了解很多关于水平解析的知识。我在这里期待着完全清楚的答案

我有一些内容流示例,如下所示:

例1:

BT
/F33 20.665 Tf
72 633.8289 Td
[(Chapter)-375(12)]TJ
/F33 24.78709 Tf
0 51.30099 Td
[(P)31(arametric)-375(and)-375(P)32(olar)-375(Curv)31(es)]TJ
例2:

BT
/C0_1 14 Tf
39.812999 681.73999 Td
[(\000"\000M\000U\000I\000P\000V\000H\000I\000\001)-82(\000$\000B\000S\000P\000V\000T\000F\000M\000\0001)-82(\000X\000B\000T\000\001)-82.07099........]TJ
水平解析(tx)的公式为

现在我想代表示例1替换值:

W0=?(mkl提到的W0表示宽度数组中各个字符的宽度。如何获取长度。上述3个示例的不同值是什么。如何从现有pdf获取。如何从CMAP获取字符宽度。)

Tj=Tj数组中的数字

Tfs=使用图形状态中的字体大小,这是相关Tf操作中的字体大小参数,例如10

Tc=使用图形状态的值,该值是相关Tc或“操作”的参数

Tw=使用0或(对于单字节字符代码32)图形状态的值,该值是相关Tw或“操作”的参数

Th=使用图形状态的值,该值是相关Tz操作的参数除以100

请为每个示例编写一步一步的解决方案,如果可能,请解释PDF使用的所有类型的TJ阵列(我们可以在内容流中看到哪些类型)。我阅读了PDF32000_2008(9.4.4文本空间详细信息)中的概念,但仍处于困惑状态。您可以在下面的链接中找到实际的pdf


听起来您最想知道从哪里检索宽度,
w0

这其实很简单,宽度数组在PDF字体对象中!对于简单字体,宽度值位于宽度数组中。唯一的例外是标准的14种字体。对于他们来说,PDF处理器应该知道字形的宽度。对于CID字体,宽度值在W数组中,默认为DW值,默认为1000

对于类型1、TrueType和CID字体,宽度以单位测量,其中1000个单位对应于文本空间中的1个单位

如果是3类字体,这些宽度应按照字体矩阵的规定在字形空间中进行解释;但值得注意的是,通常的做法是根据1000单位的字形坐标系定义字形,在这种情况下,字体矩阵为[0.001 0 0.001 0 0],从而产生与上述相同的1000:1比率

你的第一个例子
/F33 20.665 Tf
72 633.8289 Td
[(第章)-375(12)]TJ
在这里,字体F33在第一条指令中选择,字体大小为20.665。该字体在对象21中定义:

24 0 obj
[656.2 625 625 937.5 937.5 312.5 343.7 562.5 562.5 562.5 562.5 562.5 849.5 500 574.1 812.5 875 562.5 1018.5 1143.5 875 312.5 342.6 581 937.5 562.5 937.5 875 312.5 437.5 437.5 562.5 875 312.5 375 312.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 312.5 312.5 342.6 875 531.2 531.2 875 849.5 799.8 812.5 862.3 738.4 707.2 884.3 879.6 419 581 880.8 675.9 1067.1 879.6 844.9 768.5 844.9 839.1 625 782.4 864.6 849.5 1162 849.5 849.5 687.5 312.5 581 312.5 562.5 312.5 312.5 546.9 625 500 625 513.3 343.7 562.5 625 312.5 343.7 593.7 312.5 937.5 625 562.5 625 593.7 459.5 443.8 437.5 625 593.7 812.5 593.7 593.7 500]
endobj
21 0 obj
> 
因此,带有代码11的图示符的宽度为.6562,带有代码12的图示符的宽度为.625单位,以此类推

因此,在开始时,文本矩阵和文本行矩阵指向(0,0)。在
72633.8289 Td
之后,他们指向(72633.8289)。这是画“C”的地方

图纸“C”将文本矩阵指向的位置提前tx值

((w0-Tj/1000)×Tfs+Tc+Tw)*Th

我们在指令参数中看到的'C'实际上是字节0x43=67。因此,在宽度数组中,我们发现指数56(基于0)处的w0值为1000:1,为812.5。“C”后面没有数字参数,因此Tj为0。Tfs为20.665。Tc和Tw均为0。这是1

因此,tx为(.8125-0)×20.665+0+0)×1=16.7903125,图纸“C”将文本矩阵指向的位置提前到(88.7903125633.8289)。这是画“h”的地方

类似地,图纸“h”通过tx=(.625-0)×20.665+0+0)×1=12.915625将位置提前到(101.7059375,633.8289)。这是绘制“a”的地方

图纸“a”通过tx=(.5469-0)×20.665+0+0)×1=11.3016885将位置提前到(113.007626633.8289)。这是画“p”的地方

图纸“p”通过tx=(.625-0)×20.665+0+0)×1=12.915625将位置提前到(125.923251,633.8289)。这是画‘t’的地方

图纸“t”通过tx=(.4375-0)×20.665+0+0)×1=9.0409375将位置提前到(134.9641885,633.8289)。这是“e”的绘制位置

图纸“e”通过tx=(.5133-0)×20.665+0+0)×1=10.6073445将位置提前到(145.571533633.8289)。这是绘制“r”的地方

考虑数值参数-375的图纸“r”将位置提前tx=(.4595-(-375/1000))×20.665+0+0)×1=17.2449425至(162.8164755633.8289)。这是绘制“1”的位置

图纸“1”通过tx=(.5625-0)×20.665+0+0)×1=11.6240625将位置提前到(174.440538633.8289)。这是绘制“2”的位置

图纸“2”通过tx=(.5625-0)×20.665+0+0)×1=11.6240625将位置提前到(186.0646005633.8289)

随后,指令
/F33 24.78709 Tf
将文本字体大小更改为24.78709,指令
0 51.30099 Td
将文本位置提前