如何在PDF :: Extract中使用`sprintf`

时间:2012-12-18 11:39:56

标签: perl

我目前正在使用PDF::Extract模块

我试过了:

testing.pdf

脚本:

use strict;

use PDF::Extract;

my $input = $ARGV[0];
my $newpdf = new PDF::Extract(PDFDoc => $input);
my $i = 1;
$i++ while ($newpdf->savePDFExtract(PDFPages => sprintf("%03d", $i)));

此脚本成功运行,但在提取过程中缺少某些页面。 2.分:

use strict;

use PDF::Extract;

my $input = $ARGV[0];
my $newpdf = new PDF::Extract(PDFDoc => $input);
my $i = 1;
$i++ while ($newpdf->savePDFExtract(PDFPages => $i));

此脚本成功运行,所有页面都成功提取,但我所有页面都已提取,并包含序列001002003等。

例如:

testing001.pdf
testing002.pdf
testing003.pdf

...等

此页面中的所有页面都没有丢失的页面。我怎么能得到这个?

3 个答案:

答案 0 :(得分:1)

PDFPages的{​​{1}}参数采用页码列表。它不是为了让您指定自定义文件命名方案而设计的。您可以自己指定名称,如下所示:

savePDFExtract

答案 1 :(得分:0)

您应始终use warnings,这不像use strict那样重要,但会提供一些有关容易忽视的问题的宝贵调试信息。

我知道这不是文档所说的,但你也应该避免使用new PDF::Extract中的间接对象表示法。类方法调用PDF::Extract->new更安全。

我不明白你的程序为什么会按原样跳过页面,因为字符串001与数值1一样有效。但是指定输出文件名的方法是将xcall的PDFSaveAs选项设置为所需的文件名字符串。

此代码的工作原理是从原始文件名构建sprintf格式。例如,它会将testing.pdf更改为testing%03.pdf。然后,可以在调用setVars时使用此格式在文件生成之前命名该文件。

use strict;
use warnings;

use PDF::Extract;

my $input = $ARGV[0];
my $format = $input =~ s/\.([^.]*)\z/%03d.$1/r;

my $newpdf = new PDF::Extract(PDFDoc => $input);

my $i = 1;
while (1) {
    $newpdf->setVars(PDFSaveAs => sprintf($format, $i));
    my $success = $newpdf->savePDFExtract(PDFPages => $i));
    last unless $success;
    ++$i;
}

答案 2 :(得分:0)

对于您要执行的操作,此脚本过于苛刻。我只想使用PDFTK: http://www.pdflabs.com/tools/pdftk-the-pdf-toolkit/

它可以非常有效地完成您的需求:

pdftk testing.pdf burst output testing%03d.pdf

如果您需要将其作为Perl脚本的一部分,则可以通过系统调用调用PDFTK。