PDF中的文本对象如何工作?

时间:2017-07-20 13:24:55

标签: pdf watermark text-extraction

我有一份PDF文档,我希望尽可能自动删除水印,以便从pdftotext获得更好的结果。

pdftk解压后,我几乎用纯文字看到水印:

BT
1 0 0 1 277.40012 755.2005 Tm
0.501961 0.501961 0.501961 rg /R1 gs /R2 8 Tf
[()]TJ
0 0 Td
[(Abc)30(defghi K)30(lm)-40(no)]TJ
-5.423981 -9.600038 Td
[()]TJ
0 0 Td
[(Apr 01, 2017 12:34)]TJ
ET

水印是

Abcdefghi Klmno
Apr 01, 2017 12:34

浏览Document management — Portable document format后(特别是第248f页),我发现了以下内容:

BT: Begin Text
Tm: Text matrix - what is that?
x y Td: Move to the start of the next line with an offset of (x, y)
TJ: Text showing
Tf: Text state
ET: End Text

我不明白的是所有数字和原因

[(Abc)30(defghi K)30(lm)-40(no)]TJ

是否会增加Abcdefghi K之间的空间并减少lmno之间的空间(看起来如此,请参阅第259页的图46)?按什么单位?

Tf做了什么?

有人可以解释一下吗?

2 个答案:

答案 0 :(得分:1)

  

我不明白的是所有数字和原因

[(Abc)30(defghi K)30(lm)-40(no)]TJ
     

是否会增加Abcdefghi K之间的空间并减少lmno之间的空间(看起来如此,请参阅第259页的图46)?< / p>

接近如此,正值减少,负值增加,参见表109 - PDF规范中的文本显示操作符

  

阵列    TJ :   显示一个或多个文本字符串,允许单独的字形定位。 array 的每个元素都应该是字符串或数字。如果元素是字符串,则此运算符应显示字符串。如果是数字,运营商应按该数量调整文本位置;也就是说,它应翻译文本矩阵 T m 。数字应以文本空间为单位的千分之一表示(见9.4.4,&#34;文本空间详细信息&#34;)。根据写入模式,该量应从当前水平或垂直坐标减去。在默认坐标系中,正调整具有将下一个字形向左或向下移动给定量的效果。图46显示了将偏移量传递给 TJ 的效果示例。

这个数字有误导性,显然某些类型设定程序扰乱了作者想要展示的效果。该图的实际来源如下:

BT
/T1_2 1 Tf
0 Tc 8.7503 0 0 8.7503 118.989 450.2115 Tm
[([ \()11(A)53(W)57(A)79(Y again\) ] )41(T)43(J)]TJ
40.0016 0 0 40.0015 296.9949 440.2111 Tm
[(A)53(W)57(A)79(Y again)]TJ
8.7503 0 0 8.7503 118.989 403.2097 Tm
[([ \()11(A)9(\) 120 \()-50(W)-55(\) 120 \()11(A)9(\) 95 \()-41(Y again\) ] )41(T)43(J)]TJ
40.0016 0 0 40.0015 296.9949 392.2093 Tm
(AWAY again)Tj
ET 
  

以什么单位?

单位文本空间的千分之一, cf.上面的引用。

  

文本空间是显示文本的坐标系。它应由文本矩阵 T m 定义,文本状态参数 T fs T h T 上升,它们共同决定从文本空间到用户空间的转换。

这通常与字形空间中的单个单元重合

  

Tf做了什么?

根据表105 - PDF规范中的文本状态运算符

  

字体大小 Tf :   将文本字体 T f 设置为 font ,文本字体大小 T fs < / sub>,到 size font 应为当前资源字典的 Font 子字典中字体资源的名称; size 应为表示比例因子的数字。 font size 没有初始值;在显示任何文本之前,应使用 Tf 明确指定它们。

  

我现在唯一不理解的是

0.501961 0.501961 0.501961 rg /R1 gs /R2 8 Tf
     

你能解释一下吗?

指令

0.501961 0.501961 0.501961 rg

将填充颜色设置为RGB颜色空间中的中灰色。

然后

/R1 gs

从名为 R1 ExtGState 资源设置其他图形状态参数;可能在这里定义了一些透明效果。

最后

/R2 8 Tf

将字体设置为由名为 R2 字体资源定义的字体,并将字体大小设置为8.

答案 1 :(得分:0)

部分答案

TF

font size Tf

设置字体和大小(参见第244页)

GS

dictName gs设置图形状态:

  

(PDF 1.2)在图形状态下设置指定的参数。   dictName应为图形状态参数的名称   当前资源的ExtGState子字典中的字典   字典(见下一小节)。

我不太清楚\R1的含义。

RG

1.0 1.0 0.0 rg % Set nonstroking colour to yellow

因此0.501961 0.501961 0.501961 rg将颜色设置为某个灰度值。

文字矩阵

Text矩阵是仿射变换矩阵,如the docs中所述。

因此

1 0 0 1 0 0 Tf

不会改变任何事情。

矩阵1 0 0 1 277.40012 755.2005 Tm将文字向右(?)移动277.40012个文本单位(?),向下移动755.2005个文本单位。