我有一个 pdf 文档,它是由(大量)小文档串联而成的。例如,1.pdf、2.pdf 和 3.pdf。问题是1.pdf的最后一页也是2.pdf的第一页,2.pdf的过去一页也是第一页……你懂的。
所以,加入后,我得到了很多重复页面的pdf文档。并且该文档大约有 12000 页 (!!)。有没有办法自动检测重复页面并删除它们?
或任何想法如何使这更容易一点?
如果您的“相同”页面在屏幕上呈现完全相同的视觉外观,则以下算法方法可以用来找出重复项:
pdftk.exe在原始 PDF 上运行命令行以删除重复项。你可以用你喜欢的任何语言编写这个算法(甚至在 Windows 上批处理或在 Linux/Unix/MacOSX 上使用 bash)。
第一: 使用 Ghostscript 的一些注意事项。创建您的 1200 个 TIFF(或 JPEG)页面(在 Linux 上,您将使用gs而不是gswin32c):
gswin32c.exe ^
-dBATCH -dNOPAUSE -dSAFER ^
-sDEVICE=tiffg4 ^
-sOutputFile=C:\temp\tiffs\page-%06d.tif ^
-r72x72 ^
12000pages.pdf ^
# use -sDEVICE=jpeg to create *.jpeg files + adapt -sOutputFile= accordingly
# page-%06d.tif creates TIFFs named page-000001.tif through page-012000.tif*
Run Code Online (Sandbox Code Playgroud)
第二: 关于使用(免费提供的)libtiff 实用程序要求的一些说明。当 Ghostscript 创建一个 TIFF 页面时,它会记录它的当前版本、日期和时间以及 TIFF 中的一些其他元数据。这可能会破坏您的 MD5 检查,因为否则相同的 TIFF 可能带有不同的日期/时间戳。因此需要“规范化”这些。使用tiffinfo page-000001.tif或tiffdump page-000001.tif来了解我的意思。你可以看到 s.th。像这样:
c:\downloads> tiffdump.exe page-000001.tif
page-000001.tif:
Magic: 0x4949 <little-endian> Version: 0x2a
Directory 0: offset 2814 (0xafe) next 0 (0)
SubFileType (254) LONG (4) 1<2>
ImageWidth (256) SHORT (3) 1<595>
ImageLength (257) SHORT (3) 1<842>
BitsPerSample (258) SHORT (3) 1<1>
Compression (259) SHORT (3) 1<4>
Photometric (262) SHORT (3) 1<0>
FillOrder (266) SHORT (3) 1<1>
StripOffsets (273) LONG (4) 8<8 341 1979 1996 2013 2030 2047 2064>
Orientation (274) SHORT (3) 1<1>
SamplesPerPixel (277) SHORT (3) 1<1>
RowsPerStrip (278) SHORT (3) 1<109>
StripByteCounts (279) LONG (4) 8<333 1638 17 17 17 17 17 13>
XResolution (282) RATIONAL (5) 1<72>
YResolution (283) RATIONAL (5) 1<72>
PlanarConfig (284) SHORT (3) 1<1>
Group4Options (293) LONG (4) 1<0>
ResolutionUnit (296) SHORT (3) 1<2>
PageNumber (297) SHORT (3) 2<0 0>
Software (305) ASCII (2) 21<GPL Ghostscript 8.71\0>
DateTime (306) ASCII (2) 20<2010:06:22 04:56:12\0>
Run Code Online (Sandbox Code Playgroud)
这是在示例 TIFF 中“规范化”日期+时间字段(在我的情况下标记为“306”)的命令:
c:\downloads> tiffset -s 306 "0000:00:00 00:00:00" ex001.tif
Run Code Online (Sandbox Code Playgroud)
因此,DateTime字段现在已更改:
c:\pa>tiffdump ex001.tif | findstr DateTime
DateTime (306) ASCII (2) 20<0000:00:00 00:00:00\0>
Run Code Online (Sandbox Code Playgroud)
现在循环遍历所有 TIFF 以规范化它们的所有 DateTime 字段:
c:\downloads> for /l %i in (C:\temp\tiffs\*.tif) ^
do tiffset -s 306 "0000:00:00 00:00:00" %i
Run Code Online (Sandbox Code Playgroud)
第三和第四: 运行 md5sum.exe 并对文件列表进行排序以查找重复项。这是一个要使用的命令行:
c:\downloads> md5sum.exe C:\temp\tiffs\*.tif | sort
Run Code Online (Sandbox Code Playgroud)
因此,您应该很容易看到哪些文件/页面具有相同的 MD5 哈希值。它看起来类似于:
c:\> md5sum.exe c:/temp/tiffs/page-0*.tif
[....]
fae9fa136c4f7ecca23b6a34d620fb02 *c:\temp\tiffs\page-000032.tif
fae9fa136c4f7ecca23b6a34d620fb02 *c:\temp\tiffs\page-000033.tif
fb5fef1732148d71bfff841c214cf836 *c:\temp\tiffs\page-000076.tif
fb5fef1732148d71bfff841c214cf836 *c:\temp\tiffs\page-000077.tif
fb86c1bdbc697eef7cb869f4e2e2957b *c:\temp\tiffs\page-000187.tif
fb86c1bdbc697eef7cb869f4e2e2957b *c:\temp\tiffs\page-000188.tif
fbb801ab3ef7ea33619132f97dcab045 *c:\temp\tiffs\page-000443.tif
fbb801ab3ef7ea33619132f97dcab045 *c:\temp\tiffs\page-000444.tif
fbc33cc0ff3e1252de1653ef2e978f94 *c:\temp\tiffs\page-000699.tif
fbc33cc0ff3e1252de1653ef2e978f94 *c:\temp\tiffs\page-000700.tif
fc3fd164e20bb707acddeabbc4e60f7e *c:\temp\tiffs\page-000899.tif
fc3fd164e20bb707acddeabbc4e60f7e *c:\temp\tiffs\page-000900.tif
[....]
Run Code Online (Sandbox Code Playgroud)
我让你来自动化这一步。
第五和第六: 从原始 PDF 中删除所有重复页面。假设您现在要删除第 33、77、188、444、700 和 900 页。这是pdftk.exe实现此目的的命令:
c: > pdftk.exe A=12000pages.pdf ^
cat A1-32 A34-76 A78-187 A189-443 A445-699 A701-899 A901-end ^
output nonduplicates.pdf
Run Code Online (Sandbox Code Playgroud)
*编辑:不知道为什么我一开始建议使用 TIFF——更聪明的是使用 BMP。*
如果您使用-sDEVICE=bmp256并且-sOutputFile=C:\temp\tiffs\page-%06d.bmp您将不必处理我上面概述的“规范化”步骤。其余的过程 ( md5sum ...) 是相同的......