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

时间:2015-03-25 07:56:11

标签: perl pdf sed

我有一个大的PDF(~20mb,160 mb。未压缩)。 我需要在其中的文本中进行查找和替换,大约1000次。 这是我试过的。

  1. 通过SVG

    • 转换为SVG(inkscape)
    • 逐行阅读SVG并在文件中进行替换
    • 转换回PDF
  2.   

    =>糟糕的输出,可能是由于SVG中的一些几何变换矩阵,文本渲染不好

    1. 创建~1000 sed命令

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

      =>太久了。每个sed命令大约需要20秒,导致几个小时的过程

      1. 逐行阅读并替换

        • 解压缩PDF
        • 逐行阅读PDF
          • 找到要替换的文字
          • 使用perl替换
          • 将行写入新文件
        • 压缩新文件
      2.   

        =>由于未压缩的PDF中的左数据流,新文件明显受损(将二进制文本写为文本行)

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

        我搜索过perl内联编辑,但它会立即执行整个文件中的更改,而我想编辑一行。

        其他想法非常受欢迎;)

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

2 个答案:

答案 0 :(得分:3)

2.和3之间没有区别.Sed会逐行读取输入文件,并将更改的行写入输出文件。如果您将-i切换到它,sed只需打开输入文件然后取消链接(它是rm执行的操作)然后打开具有相同名称的输出文件并写入成。就是这样。没有魔法涉及。因此,如果您通过Perl损坏内容,而不是sed,则执行与sed不同的操作。主要区别在于,您可以更快地使Perl脚本更换许多字符串。见Using sed on text files with a csv

主要技巧是你可以编译regexp for search nad replace,它可以在线性时间内工作。

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

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

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

答案 1 :(得分:0)

您可以按照中所述的pdftk步骤进行操作 How to find and replace text in a existing PDF file with PDFTK (or other command line application)

您可以先将PDF拆分为较小的文档,每个文档都有几页,替换文本并再次将它们合并在一起 - 全部使用pdftk。

还有PDFEdit软件(http://pdfedit.cz/en/index.html)。它是一个带有脚本界面的GUI应用程序。您可以处理单个页面,然后使用脚本命令执行查找替换。看看它是否加载了您的PDF。

相关问题