我正在尝试从 PDF 中提取表格数据。为此,我需要一段文本的开始和结束的精确位置,这就是我的问题所在。为了进行测试,我使用 LaTeX 生成了一些文本。请考虑以下最小示例:
\documentclass{article}
\begin{document}
foo
\end{document}
通过 latex -> dvips -> ps2pdf 编译时,我得到(解压后)以下 PDF 代码,看起来不错:
10 0 0 10 0 0 cm # concat to transformation matrix
BT # begin text mode
/R8 9.96264 Tf # select font
1 0 0 1 148.68 657.24 Tm # set text matrix
[(f)3.87556(o)-29.9875(o)-5.88993]TJ
# ^ print 'f', then go a little bit left, print 'o' (so f and o
# overlap a bit), go a little bit right, print 'o'. Then go right again,
# for whatever reason.
但是当使用 xelatex 时,它看起来像这样:
1 0 0 1 72 720 cm # concat a DIFFERENT transformation matrix
0 G 0 g # set gray levels to 0
BT # begin text mode
/F1 9.963 Tf # select font
76.71 -62.76 Td # move to text position (this was missing above)
[(fo)-28(o)]TJ # print 'fo', then go 28 right, then print 'o'
让我困惑的是第二个输出的最后一行:为什么“f”和“o”重叠?在哪里指定了?我没有看到任何“Tc”命令或类似的东西。那么为什么第二个“o”不与第一个重叠?
多谢!
答案1
生成未压缩的文件
如果是 pdfLaTeX 或 LuaLaTeX,可以通过 TeX 命令生成未压缩的文件:
\ifx\pdfobjcompresslevel\undefined
\else
\pdfobjcompresslevel=0
\pdfcompresslevel=0
\fi
\documentclass{article}
\pagestyle{empty}
\begin{document}
foo
\end{document}
使用 XeLaTeX 可以通过命令行生成未压缩的文件:
xelatex --output-driver="xdvipdfmx -V4 -z0" test
路线 latex/dvips/ps2pdf:
ps2pdf -dCompressPages=false test.ps
页面流
pdfTeX:
BT
/F8 9.9626 Tf 148.712 707.125 Td [(fo)-28(o)]TJ
ET
LuaLaTeX:
BT
/F15 9.96264 Tf 1 0 0 1 148.712 707.125 Tm [(fo)-27(o)]TJ
ET
XeTeX:
q 1 0 0 1 72 769.89 cm 0 G 0 g BT /F1 9.963 Tf 76.71 -62.76 Td[(fo)-28(o)]TJ ET
Q
latex/dvips/ps2pdf:
q 0.1 0 0 0.1 0 0 cm
/R7 gs
0 g
q
10 0 0 10 0 0 cm BT
/R8 9.96264 Tf
1 0 0 1 148.68 707.14 Tm
[(f)3.87556(o)-29.9875(o)-5.88993]TJ
ET
Q
Q
讨论
在这两种情况下,我都看不到字形的任何重叠。
不涉及任何连字符。
两个
o
s 之间会插入额外的空格。这称为隐式字距调整,TeX 会在 TFM 文件 ( ) 中查找数据cmr10.tfm
。负数 (-28) 表示在中间插入空格。正数表示字形边界框重叠。仅在 latex/dvips/ps2pdf 的情况下,
f
下一个o
会稍微靠近 0.00387556(单位为千分之一!),由 Ghostscript 引入。您的 XeLaTeX 案例与此处的发现不同:通常由包多次
0 G 0 g
添加。也许您使用了带有颜色包的不同 TeX 文件并清理了 PDF 结果。检查您是否还使用了不同的字体。color