我有一个大的PDF(~20mb,160 mb。未压缩)。 我需要在其中的文本中进行查找和替换,大约1000次。 这是我试过的。
通过SVG
=>糟糕的输出,可能是由于SVG中的一些几何变换矩阵,文本渲染不好
创建~1000 sed命令
=>太久了。每个sed命令大约需要20秒,导致几个小时的过程
逐行阅读并替换
=>由于未压缩的PDF中的左数据流,新文件明显受损(将二进制文本写为文本行)
我想知道是否可以逐行读取未压缩的PDF,但是直接在其中进行编辑。我怎么能这样做?
我搜索过perl内联编辑,但它会立即执行整个文件中的更改,而我想编辑一行。
其他想法非常受欢迎;)
根据建议,我使用CAM :: PDF,这是最有效和最简单的解决方案
答案 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。