2

我目前正在使用该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

...ETC。

所有页面也在此表单中,没有丢失的页面。我怎样才能得到这个?

4

3 回答 3

1

PDFPages参数savePDFExtract采用页码列表。它并非旨在让您指定自定义文件命名方案。您可以自己指定名称,如下所示:

$i++ while ($newpdf->savePDFExtract(
        PDFPages  => $i, 
        PDFSaveAs => $base_file_name . sprintf("%03d", $i)
    )
);
于 2012-12-18T12:10:06.833 回答
0

你应该总是use warnings,这并不重要,use strict但会提供一些关于容易忽略的问题的有价值的调试信息。

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

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

此代码通过sprintf从原始文件名构建格式来工作。例如,它更改testing.pdftesting%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;
}
于 2012-12-18T12:26:59.613 回答
0

这个脚本对于你想要做的事情来说太过分了。我只会使用 PDFTK: http ://www.pdflabs.com/tools/pdftk-the-pdf-toolkit/

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

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

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

于 2012-12-18T15:31:59.680 回答