我有一个很大的 PDF(~20mb,160mb。未压缩)。
我需要在其中的文本中进行查找和替换,大约 1000 次。
这是我尝试过的。
-
Via SVG
- 转换为 SVG (inkscape)
- 逐行读取 SVG 并在文件中进行替换
- 转换回 PDF
=>输出不好,可能是由于SVG中的一些几何变换矩阵,文本渲染得不好
-
创建约 1000 个 sed 命令
- 解压PDF
- 使用 sed 命令执行每个替换
- 重新压缩 PDF
=> 太长了。每个 sed 命令大约需要 20 秒,导致处理过程需要几个小时
-
逐行读取并替换
- 解压PDF
- Read line by line the PDF
- 查找要替换的文本
- 使用 perl 替换
- 将行写入新文件
- 压缩新文件
=>由于未压缩的PDF中存在剩余数据流,新文件显然已损坏(将二进制写入文本行)
我想知道是否可以逐行阅读未压缩的 PDF,但直接在其中进行编辑。我怎么能这样做呢?
我搜索过 perl 内联编辑,但它会立即执行整个文件中的更改,而我想编辑一行。
其他想法也非常受欢迎;)
根据建议,我使用了 CAM::PDF,这是最有效、最简单的解决方案
2. 和 3. 没有区别。 sed 逐行读取输入文件并将更改的行写入输出文件。如果你喂了-i
切换到它,sed
只需打开输入文件,然后取消链接(这就是rm
do) 然后打开同名的输出文件并写入。就是这样。不涉及魔法。因此,如果您通过 Perl 损坏了内容,而不是通过sed
你做了一些不同于sed
。主要区别是,您可以使 Perl 脚本更快地替换许多字符串。看在带有 csv 的文本文件上使用 sed https://stackoverflow.com/questions/29071270/using-sed-on-text-files-with-a-csv/29075406#29075406
主要技巧是您可以编译用于搜索和替换的正则表达式,它可以在线性时间内工作。
my %replace = ( foo => 'bar' );
my $re = join '|', map quotemeta, keys %replace;
$re = qr/($re)/;
while (<>) {
s/$re/$replace{$1}/g;
}
您可以按照原来的方法使用它,但我建议使用 Perl 脚本制作它,这样您可以保留正则表达式并替换 pdf 文件之间的哈希值。您也可以尝试将其与CAM::PDF https://metacpan.org/pod/CAM::PDF。有示例脚本changepagestring.pl https://metacpan.org/source/CDOLAN/CAM-PDF-1.60/bin/changepagestring.pl在里面。您还可以看看PDF::API2 https://metacpan.org/pod/PDF::API2这需要更多的工作,但可能会提供更好的结果。但请记住,PDF 格式不适合修改。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)