是否可以通过 PDF 中的正则表达式进行索引搜索?

Is it possible to make an index search by regex in PDF?

我想搜索匹配此正则表达式的所有行

^([0-9IVX]\.)*.*\R

并报告他们所在的页码。输出将类似于:

1. Heading/page number
1.1 Subheading/page number
1.1.1. Subsubheading/page number

这可以在 PDF 中完成吗?我想这需要 Ghostscript,但是在 How to Use Ghostscript 页面上搜索 regex 我什么也没找到。

我不明白为什么你会期望 Ghostscript 为你搜索。

我不确定您是否希望从 PDF 文件中获取数据类型 'heading, page number' 等,或者您是否打算根据找到的数据自行解决。

如果是前者,那么第一个问题是,一般来说,PDF 文件 没有 您要查找的那种结构信息。大多数 PDF 文件中没有任何内容显示 'this is a heading'、'this is a page number' 等

有诸如 'tagged PDF' 之类的东西,它将 non-printing 元素添加到 PDF 文件中,PDF 文件确实携带了这种数据。这是一个完全可选的功能,绝大多数 PDF 文件不包含它,Ghostscript 完全忽略它。

由于大多数 PDF 文件没有该信息,您不能依赖它,除非您很高兴知道 PDF 文件的生成位置并且它们包含此类信息。在这种情况下,有许多工具可以为您提取它,或者使您能够编写代码来提取它。

仅搜索文本的问题是,首先文本不需要写成连续的流。因此,如果您正在寻找可能写为:

的“1.1”
(1.1) Tj

(1) Tj
(.) Tj
(1) Tj

[(1) -0.1 (.) 0.1 (1)] TJ

或这些的任意组合。单个字符代码甚至不需要按顺序或在同一内容流中出现。

其次,PDF 内容流中的字符代码不需要(通常不是)Unicode 代码点。或ASCII,或任何其他标准编码方案,它完全可以是任意的。

一些 PDF 文件带有一个 ToUnicode CMap,围绕它映射字符代码到 Unicode 代码点,但并非所有文件都这样做。某些字体可能使用标准(即 PDF 标准)编码,在这种情况下可以推断出 Unicode 代码点。一些编码可能包含字形名称,从中可以再次推断出 Unicode 代码点。

但最后,如果不使用 OCR,一些 PDF 文件根本无法提取文本。

最好的办法可能是编写代码来提取文本,而 Ghostscript 可以做到这一点。它甚至通过上面列出的回退层次结构来尝试找到一个 Unicode 代码点。如果一切都失败了,它只使用字符代码并希望它足够好。

如果您使用 Ghostscript 的 txtwrite 设备,它会生成一个伪造的文本页面(默认设置),该页面会尽可能地模仿原始 PDF 文件中的文本布局,包括合并文本位在 PDF 文件中不连续,但在页面上彼此相邻。或者 'XML-like' 输出,它会告诉您遇到了哪些 Unicode 代码点或字符代码,以及它们在原始页面上的位置。如果您不喜欢 txtwrite 尝试弄清楚哪些文本与哪些文本搭配,那么您可以使用它来编写您自己的文本。

我怀疑文本页面可能足以满足您的需要。您可以让 txtwrite 设备每页生成一个文件,这样您就可以从文件名中获取页码。然后您可以编写自己的正则表达式来搜索文件并找到您的匹配项。