我有两个 PDF 集合。一个 (集合1) 包含 1000 多个 PDF,文件大小更大(100+GB),并且包含不合逻辑的部分(想想 pdf 1 (1)、1 (3),... 而它本来可以也应该只是一个文件)。另一个 (集合2) 为 300 个文件。
集合2应该是集合1。我使用 Adobe Acrobat 进行处理,将多个 PDF 压缩为一个 PDF,然后应用压缩(和贝茨编号)。做了一些之后,我让一名初级员工接手……
而且,我们最近发现其中有错误。与原始 PDF 相比,缺少部分内容,以及类似的问题。这是一个巨大的错误,我希望我们能够轻松修复它。
不确定我在这种情况下寻找的是否真的是差异,因为我需要将多个文件与一个文件进行比较。
如果我能隔离问题文件,我就能轻松修复它们。目前我能想到的最好的办法可能是预览(MacOS),它允许你打开多组文件(并提供页数)。从那里我可以检查第一个、最后一个和中间的几个。如果这些是一致的,页数也是一致的,那么从错误中我可以看出,这些文件很可能是可靠的。然而,这并不是最彻底的解决方案。
类似问题的答案是这里和这里但是它们要么是几年前的,要么是 Windows 专用的(如果需要的话也可以,但在这个特定情况下不是首选),要么不是我需要的规模。与 SU 社区相比,我的团队中没有人拥有高级技术技能,因此,如果能提供详细的答案或相关先决知识的链接,我将不胜感激。
非常感谢 SU
答案1
您绝对需要首先以某种方式按顺序将 1000 个文件与 300 个文件进行映射。
在最简单的情况下,你一方面会看到“CIDOC Ontology 2.0 (1).pdf”、“CIDOC Ontology 2.0 (2).pdf”和“CIDOC Ontology 2.0 (3).pdf”,另一方面会看到“CIDOC ontology.pdf”。
现在,我能想到的最佳方法是:
使用
pdftk
或pdf2json
,提取 1000 组的页数,并查看总数是否与 300 组相对应:12, 9, 10 vs. 31 = OK 12, 9, 10 vs 22 = BAD (and you might suspect section 2 is missing)
这种方法非常基础,无法识别三个部分的顺序混乱。
使用
pdf2ps
和ps2ascii
,创建所有文件的文本版本。根据 PDF 流程,这些文本可能几乎难以辨认,但这无关紧要:如果运气好的话,用于合并文件的工具不会改变文本度量和分组。如果是这样,那么三个文件的串联将与第四个文件非常非常相似(如果不是,您将把它标记为异常)。因此,这些启发式方法应该有效:- 这三个文件的“wc”输出的总和将等于(或非常接近)第四个文件的输出。
- 通过 cat file1 file2 file3 | sed -e "s#\s#\n#g" | sort 对三个文本文件或第四个文件进行 cat 处理,应该会产生几乎相同的单词列表(输出
diff -Bbawd
应该不超过三或四行;理想情况下,没有)。如果省略该| sort
阶段,则应该可以识别出乱序的部分:如果已排序检查匹配而未排序检查不匹配,则您面临的是部分乱序的情况。
该sed
部分将拆分单词,即使合并工具确实对文本做了一些改动,这也可能会有所帮助。字距调整的改变,以及 PDF 内部单词的拆分方式不同(“homeostasis”从“home osta sis”变成了“ho meos tas is”),将导致这还不够;但可能性不大。
我认为困难在于将原始文件与最终文件进行匹配。有了每个文件的样本,我可能可以编写一个脚本来运行比较。
答案2
您可以使用类似于 DNA 序列分析的序列比对过程。具体来说,是一种动态规划方法进行序列比对。
提取每个集合中每个 PDF 的文本,然后尝试将集合 1 中的每个单个文本序列与集合 2 中的每个较长的连接序列对齐。任何字母完美匹配可得一分,不匹配可得零分。总分是对齐序列之间的匹配数。您还可以允许在序列之间进行编辑,但要引入间隙。
该算法并不难,但可能需要一段时间才能运行。考虑到您提到的数据集大小,我猜它会在几个小时或一夜之间运行完成。
以下是维基百科中该算法的链接: https://en.m.wikipedia.org/wiki/Sequence_alignment