我需要将一些 PDF 转换回文本。我尝试了很多软件和在线工具,但结果总是平庸。
从技术上来说为什么这么难?
我们不要假设您正在谈论的 PDF 仅包含一些位图图像,因为很明显,在这种情况下您只能诉诸 OCR 及其所有限制。
我们假设文本是在手边的 PDF 中绘制的。
PDF 页面上绘制的内容由sequence of 指示在该页面的内容流中。 “在页面上绘制文本”意味着在这些指令中,有一些设置后续指令要使用的字体,一些设置后续指令要使用的文本位置和方向,还有一些实际绘制由“给出的文本”字符串参数”。
文本提取是从内容流中获取指令序列的任务,而不是drawing字体和位置设置指令指示的文本,使用标准编码(通常是所使用的编程语言/平台的字符类型的编码)以合理的顺序导出它。
第一个问题是理解这些文本绘制指令的字符串参数的编码:
每种字体可以有自己的编码;要提取文本,除了绘制文本并连接其字符串内容的指令之外,不能简单地忽略所有内容,您始终必须考虑当前字体(一些非常简单的文本提取器会忽略这一点,因此经常无法返回合理的内容) ;
有大量预定义的编码,其中一些让您想起您所知道的编码,例如WinAnsi编码,很多你可能不知道,例如添加-RKSJ-H;这些编码可以使用每个字形的恒定字节数,也可以是混合多字节;因此文本提取器必须首先支持很多编码;
编码也可以是完全临时的和任意的;特别是在嵌入子集字体的情况下,人们经常会看到通过在需要时从某个起始值处理字符代码而生成的临时编码;即,页面上使用的给定字体中的第一个字形被赋予起始值作为代码,下一个不同的字形被赋予起始值加一,下一个不同的字形被赋予起始值加二,依此类推; “Hello World”和起始值 48(ASCII 值“0”)将生成“01223453627”;这些字体may包含到 Unicode 的映射,但它们不是必需的。
下一个问题是理解字符串的顺序:
字符串绘制指令可以以任意顺序出现,例如“Hello”可能首先绘制“lo”,然后移回“el”,然后再次移回“H”;要提取文本,不能忽略文本定位指令并简单地连接文本字符串,您始终必须考虑当前位置(一些简单的文本提取器会忽略这一点,因此可能无法返回有意义的内容);
多列文本可能会出现困难,文本可以逐行绘制,例如首先是第一列顶行的文本,然后是第二列的顶行,然后是第一列的第二行,然后是第二列的第二行,依此类推; PDF 中不需要任何提示文本是多栏的。
另一个问题是识别格式或样式工件:
单词之间的空格不需要通过绘制空格字形来创建,也可以通过文本位置更改指令来完成;文本提取器不尝试识别由文本定位指令创建的间隙可能会返回没有空格的结果;另一方面,可以使用相同的技术以最佳距离绘制相邻字形,即字距调整;尝试识别由文本定位指令创建的间隙的文本提取器可能会错误地返回不应存在的空格;
有时,选定的单词会被打印为“空格”以额外强调;在提取的文本中,这些间隙可能会呈现为空格字符,文本的自动后处理可能会将其视为单词分隔符;
通常对于粗体文本,人们使用不同的粗体字体程序;如果手头没有,人们有时会发挥创意,通过以微小的偏移量打印相同的文本两次来模仿粗体;使用稍大的偏移(或不同的变换)和不同的颜色,可以模拟阴影效果;如果文本提取器不尝试识别这一点,您最终会在输出中出现一些重复的字符。
由于额外信息不完整或错误,会出现更多问题:
转Unicode字体映射(从字符代码到 Unicode 的可选映射)可能不完整或包含错误;那里例如这里有很多关于堆栈溢出处理不正确的问题转Unicode印度文字地图;文本提取结果反映了这些错误;
甚至有些 PDF 的信息相互矛盾,例如有一个错误转Unicode地图,但正确的信息实际文本入口;一些 PDF 创建者使用它来允许从某些程序进行正确的复制和粘贴(首选实际文本在这种情况下进入),同时在其他程序的输出中注入错误(首选转Unicode则信息)。
如果您希望文本提取器仅提取页面中最终可见的文本,则会出现另一个问题:
文本可能绘制在当前剪切区域之外或可见页面区域之外;文本提取器需要记住这些;
可以使用“不可见”渲染模式绘制文本;文本提取器必须关注渲染模式;
可以使用与背景相同的颜色绘制文本;为了认识到这一点,文本提取器不仅可以查看当前指令和一些图形状态细节,还必须考虑在文本位置预先绘制的任何内容;
文本可以绘制为剪辑路径;为了识别该文本最终是否可见,只要剪辑路径处于活动状态,文本提取器就必须跟踪文本区域中绘制的内容;
文本稍后可能会被其他内容覆盖;在这种情况下,文本提取器必须删除已识别的文本;但根据混合模式和透明度设置,这些覆盖物可能会或可能不会让文本透过;因此,为了获得正确的结果,文本提取器必须为每个字形跟踪其绘制的颜色、背景的颜色以及所有这些漂亮的效果随后对这些颜色的作用;当然,字形颜色和背景颜色都可能很有趣,例如一些底纹颜色;并且涉及的色彩空间可能不同,需要在色彩空间之间来回转换;等等。
此外,文本可能会在文本提取器通常看不到的地方绘制:
- 有些工具通过将文本放入模式并用该模式填充页面区域来隐藏文本以防止文本提取;
- 同样还有 type 3 字体; Type 3 字体中的每个字符都由其自己的内容流表示;因此,工具可以绘制单个 3 类字体字形的内容流中的所有文本,然后在页面上绘制该字形。
...
同时您肯定已经了解为什么文本提取结果可能不是最佳的。请放心,上面的列表并不完整,文本提取仍然存在更多复杂性。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)