PDF:使用TJ运算符时了解数组中的数字

PDF:使用TJ运算符时了解数组中的数字,pdf,Pdf,我试图找出如何在PDF文件中使用TJ运算符数组中的数字 我用的例子是: [(A)120(W)120(A)95(Y again)]TJ 这些数字应该如何使用 是否应该单独处理 该数字是否应与前面的字符串一起用于计算前面字符串的第一个字符?e、 g.:(A)+120 该数字是否应与后面的字符串一起用于计算后面字符串的第一个字符?e、 g:120+(W) 其他选择 到目前为止,我一直试图单独处理,但没有取得好的效果 期待阅读您的答案/评论,以帮助更好地理解它。 (希望组合位移的其他计算是正确的) 另

我试图找出如何在PDF文件中使用TJ运算符数组中的数字

我用的例子是:

[(A)120(W)120(A)95(Y again)]TJ
这些数字应该如何使用

  • 是否应该单独处理
  • 该数字是否应与前面的字符串一起用于计算前面字符串的第一个字符?e、 g.:(A)+120
  • 该数字是否应与后面的字符串一起用于计算后面字符串的第一个字符?e、 g:120+(W)
  • 其他选择
  • 到目前为止,我一直试图单独处理,但没有取得好的效果

    期待阅读您的答案/评论,以帮助更好地理解它。 (希望组合位移的其他计算是正确的)

    另一个示例阵列:

    [(1.1)-1753(A)1(bo)-7(ut This Book)]TJ
    
    更新:

    示例文件I测试:

    “坏”结果:

    包含TJ的字符串和数字的数组:

    [(1)-100(0)-99( )-101(m)-100(e)-100(i)-99( )-101(1)-100(9)-99(1)-100(8)
    -99( )-101(d)-99(e)-100( )-101(r)-99(a)-101(i)-99(d)-100(s)-100( )-101(o)
    -100(p)-100( )-100(O)-100(o)-100(s)-100(t)-100(e)-100(n)-100(d)-99(e)]TJ
    
    计算Tx时,我分别处理字符串和数字。对于数字(-100,-99,-101,…)的计算,当我为w0参数添加glyph width 100而不是0时,结果是ok。。。但是我不能将这个w0(100)值保留在数字中,因为98%的其他pdf文件都不符合这个值。

    公式 看起来你试图解释这个等式

    tx = ((w0 - Tj/1000) * Tfs + Tc + Tw) * Th
    
    在glyph空间(而不是文本空间)中,至少插入的值显示为指示。相反,在文本空间中以字体类型不可知的方式解释它

    特别是:

    • w0
      -使用PDF字体字典中宽度数组中相应字符的宽度,并将其除以1000;我预计首府a的价值约为.667
    • Tj
      -使用Tj操作数组参数中的值,例如120
    • Tfs
      -使用图形状态中的字体大小,这是相关Tf操作中的字体大小参数,例如10
    • Tc
      -使用图形状态中的值,该值是相关Tc操作中的参数
    • Tw
      -使用0或(在单字节字符代码32的情况下)图形状态中的值,该值是相关Tw操作中的参数
    • Th
      -使用图形状态的值,该值是相关Tz操作的参数除以100
    您的示例文件 不幸的是,您没有显示您的代码为字形原点计算的x坐标,因此我无法判断您的计算是否错误,或者代码中的其他内容是否错误

    由于这些值通常都很小(字体大小为1,没有Tc或Tw,Th 1),因此我手动计算了前几个字符的字形原点的x坐标:

    character   x coordinate
    '1'         734.204784
    '0'         745.564784
    ' '         756.908784
    'm'         765.452784
    'e'         779.468784
    'i'         790.012784
    ' '         796.076784
    '1'         804.620784
    '9'         815.980784
    '1'         827.324784
    '8'         838.684784
    ' '         850.028784
    'd'         858.572784
    
    根据你的图像,你的坐标已经非常错误了

    我计算的坐标看起来是正确的,但是,它们特别匹配绘制字形“阴影”的矢量图形指令的坐标


    因此,请与代码计算的坐标进行比较。如果您的不同,特别是如果它们的差异越来越大,您仍然没有按照上面解释的方式进行计算,至少不准确(可能您使用的数值类型在这些计算中太有损?)。如果你的没有不同,那么你的问题不在于坐标的计算,而在于坐标的使用;尤其是在文本中使用它们与在矢量图形指令中使用它们不同。

    请详细说明“没有好结果”。例如,您如何知道?well good result=呈现的文本与在foxit reader、adobe reader等中相同。。。错误结果=文本呈现在顶部或带有空格等。。。(自己的渲染器尝试修复TJ操作符)以渲染示例中的“A”。这是否意味着您必须计算一次公式(公式中使用w0(A)+TJ=120)。或者计算公式两次(首先使用:w0(A)+TJ=0进行计算,然后使用:w0()+TJ=120进行计算)?这取决于您尝试实现的目标。如果要计算从“A”原点到“W”原点的组合位移,可以在一个步骤中计算,即字符“A”的
    w0
    和值120的
    Tj
    。如果您想以某种方式将120的后一步视为特别的,并且需要知道如果没有它,您将处于什么位置,您可以应用该公式两次,一次用于
    Tj=0
    的“A”,一次用于
    w0=0
    的120。大多数pdf文件渲染正确,但有些文件不正常。例如,我分别计算位移(参见前面的注释)。从阵列计算数字时,间距不正确。但是,当我将glyphwidth设置为100时,间距是正确的,但我甚至没有在该点上设置glyph,因为我是根据数组计算数字的。如果我在空间计算中保持w0=100,我的其他PDF(98%)是不正确的。在某些罕见的情况下,找不到为什么它与w0=100的值一起工作。请共享一个示例文件来说明您的意思。我第一次在TJ运算符中看到这一点-没有理由不在TJ操作中使用十六进制编码字符串。事实上,这并不罕见。请解释你的问题是什么。无论代码是在尖括号中的十六进制编码字符串
    001300130002
    上运行,还是在圆括号中包含字节0x00、0x13、0x00、0x13、0x00、0x02的字节字符串上运行,都不会对代码造成影响。