Pdftotext 不进行段落分隔符

Pdftotext 不进行段落分隔符

OSX、Homebrew 的pdftotext作品,但它不尊重段落分隔符。我已经尝试过-pagebrk-eol mac-eol unix,但划分段落的问题似乎始终存在。这是一个典型的问题吗?

答案1

PDF 是很奇怪的东西,其中的文本不一定按任何合理的顺序排列。

尝试 pdftotext 的-layout选项。

根据 PDF,这可能会为您提供一个多列文本文件,该文件完全可读(尤其是在具有超过 80 列的宽屏显示器上),但单列文本可能更有用。

--

我发现将多列文本转换为单列的最简单方法是使用 vim 编辑文本,在列之间插入 TAB,然后编写一个 perl 脚本将列合并为每页上的一列(页面由换页符,^L)。这可能非常耗时且乏味。

我第一次尝试编写一个 Perl 脚本来执行此操作,试图通过列之间的空格字符数来识别列,但不幸的是,这从 1 或 2 个空格字符到 5 个或更多(而且还有一个事实是)有些列需要额外的空格),因此没有自动方法来区分单词之间的正常间距和列之间的间距。它完全无法处理pdftotext输出中的表。

手动编辑和插入 TAB 字符并拆分列要容易得多,vi/vim 使这样的重复编辑任务变得相当容易:找到一个方便的光标位置来插入 TAB,按下Ctrl-V并将光标向下移动到底部您正在编辑的页面或部分,然后按rTAB将选定的 vim 列替换为制表符。


最后,在您的评论中,您提到在输出文本中看到 Unicode 字符“右单引号”(U+2019)。这完全正常,许多(大多数?)PDF 中都嵌入了 Unicode 字符(例如智能引号、破折号和省略号等),因为它们不仅限于 ASCII 字符

答案2

我创建了这个简单的单行代码,它可以做一些有用的事情,但请记住,PDF 很奇怪并且并不总是有效。

sed 's/\.$/.\n/; s/• /\n/; /^[0-9]/ s/$/\n/' | perl -00 -pe 's/\n(?!\Z)/ /g'
  • 如果句子中有句号,sed 命令会添加一个新行,因为这可能是段落的结尾。(这个假设已经失败了很多次。)
  • 如果遇到逐项列表,请添加额外的新行。
  • 如果一行以数字开头,则可能是标题,请添加新行。

现在,只要有一组用换行符分隔的行,它就可能是一个段落。 perl 命令会将这些组放在一行上。这个 Perl 一行代码的解释如下:

https://unix.stackexchange.com/a/479229/245582

注意。我使用 Debian 的 pdftotext popper-utils

相关内容