我有一个相当大的个人图书馆,里面有各种格式的书籍。我尝试整理它们的元数据,包括包含目录的文本字段。目前,我正在使用文档阅读器中的“区域文本选择”功能来复制文本。使用 djview 对 DJVU 执行此操作可生成格式良好的目录,如下所示:
CONTENTS
1. EXPERIMENTS
1.1. The definition of an experiment ..... 1
1.2. Algebras of events as Boolean algebras .... 6
1.3. Operations with experiments ...... 9
1.4. Canonical representation of polynomials of events . . 12
....
我强调,我所做的只是将鼠标拖过页面并单击“复制文本”。如果我尝试对 PDF 执行此操作,结构将完全丢失,我必须花一些时间清理文本选择,移动页码和章节编号。我可能会得到如下结果:
Table of Contents
I
Introduction
1
Introduction
1.1
Table of Contents
1.2
Acknowledgments
1
3
3
6
II
....
我正在寻找一款可以以类似的方式复制文本但保留“结构”的 PDF 阅读器。DJVU 阅读器具有此功能,这告诉我这应该是可能的。
注意:我不是在谈论从书签中提取目录:我的许多 PDF 都没有目录。我还想避免使用必须处理整个文件的 CLI 工具:我只希望它选择我选择的文本,但保留换行符和整体结构。
但一般来说,你会误会:DJVU 文档包含更多原始元数据;特别是,如果你有一本书的 DJVU,那么很有可能它是直接从该书的 TeX 或 ROFF 源生成的,并保留了该结构信息。
另一方面,PDF 通常只是“您将这个字母放在这里,下一个字母放在那里,下一个字母放在那里……”,因此 PDF 查看器必须更多地“猜测”您选择、复制和粘贴时的文本流。而且,通常情况下,PDF 查看器只是按照 PDF 生成的顺序选择所有字形(将 PDF 视为生成可见输出的东西,而不是带有美化信息的纯文本),从您开始选择时跨越的第一个字符到您停止时的最后一个字符。如果您的目录实际上是按列存储的,那么令人惊讶的是,这会将第一列(在您的示例中为“I”、“1”……)放在第一位,然后是第二列。
例如,当你从此页面(来自
802.11-2012.pdf
)获取时,并从第一个“1.”选择到“定义...”后面的某个地方,你会得到以下内容
atril
:以及以下内容
okular
:因此,文档中根本不存在您所希望的结构,并且两个不同的查看者在选择内容时已经对您的意图做出了不同的解释。而且,两者都是错误的。
okular
有一个“矩形”选择,其功能与“普通”文本选择基本相同,但会排除矩形中不存在的任何字符。因此,虽然它只包含正确的内容,但无法为您提供正确的顺序。现在,这并不意味着一般来说没有一个查看器比其他查看器更好。但我的经验是,做正确事情的不同尝试基本上与不同的 PDF 引擎一样多,而且由于变化多端,没有明显的赢家。虽然上面的
atril
“错误”程度比“更少”okular
,但对 CCSDS 131.0-B-3“蓝皮书”目录进行的相同实验得出了相当荒谬的结果:其中
okular
的区域选择效果更好一些有一种查看器在大多数情况下都能正常工作,但使用起来很烦人,因为它不允许您在 PDF 中的超链接内开始选择(而大多数目录条目本质上都是超链接),它是浏览器
chromium
的内置 PDF 查看器(遗憾的是?)。所以,也许可以试试这个!在 Ubuntu 24.04.1 LTS 系统上查找命令行工具来从 PDF 文件中提取文本。
使用
USB Type-C Spec R2.4 - October 2024.pdf
GNOME 文档查看器 46.3.1 呈现的内容如下:pdf转txt
pdf2txt
版本v20221105
输出目录中的原始文本输出:然后在提取的文本中,章节编号和标题和页码并不总是对齐。即
pdf2txt
没有帮助。pdf转文本
pdftotext
版本24.02.0
产生以下文本:pdftotext
看起来在按章节编号、标题和页码排序方面比以前做得更好pdf2txt
,但可能仍然需要一些手动的后期处理。另一个答案已经解释过,PDF 文档格式并非设计用于以连贯的顺序返回到源文本,这解释了此类工具的局限性。