在未压缩的PDF中进行大规模内联编辑

丹尼斯·鲁扎德(Denis Rouzaud)

我有一个很大的PDF(〜20mb,160mb。未压缩)。我需要查找并替换其中的文本,大约1000次。这是我尝试过的。

  1. 通过SVG

    • 转换为SVG(墨迹)
    • 逐行读取SVG并在文件中进行替换
    • 转换回PDF

=>输出错误,可能是由于SVG中存在一些几何变换矩阵,导致文本无法很好地呈现

  1. 创建〜1000 sed命令

    • 解压缩PDF
    • 使用sed命令执行每个替换
    • 重新压缩PDF

=>时间太长。每个sed命令大约需要20秒,导致数小时的处理

  1. 逐行读取并替换

    • 解压缩PDF
    • 逐行阅读PDF
      • 查找要替换的文本
      • 使用Perl替换
      • 将行写入新文件
    • 压缩新文件

=>由于未压缩的PDF中存在数据流,因此新文件显然已损坏(将二进制文件写为文本行)

我想知道是否有可能逐行读取未压缩的PDF,但直接在其中进行编辑。我该怎么办?

我已经搜索过perl内联编辑,但是它可以一次对整个文件进行更改,而我想编辑一行。

欢迎其他想法;)

根据建议,我使用了CAM :: PDF,这是最有效,最简单的解决方案

Hynek -Pichi-他走了出去

2.和3之间没有区别。Sed逐行读取输入文件,并将更改的行写入输出文件。如果您将-i开关喂给它,则sed只需打开输入文件,然后取消链接(即是这样rm做),然后打开具有相同名称的输出文件并写入。而已。不涉及魔术。所以,如果你被Perl损坏的内容,而不是由sed你做不同的事情比sed主要区别在于,您可以使Perl脚本的方式更快,以替换许多字符串。请参阅在带有csv的文本文件上使用sed

主要技巧是您可以编译正则表达式以进行搜索和替换,这可以在线性时间内工作。

my %replace = ( foo => 'bar' );
my $re = join '|', map quotemeta, keys %replace;
$re = qr/($re)/;

while (<>) {
    s/$re/$replace{$1}/g;
}

您可以将其与您的原始方法一起使用,但是我建议在Perl脚本中使用它,该脚本允许您保留regexp并替换pdf文件之间的哈希。您也可以尝试将其与结合使用CAM::PDF其中包含示例脚本changepagestring.pl您还可以查看PDF::API2哪些将需要更多的工作,但可能会提供更好的结果。但是请记住,PDF格式不适合修改。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章