Perl:将每个文件的页面拆分为两个

时间:2016-01-26 14:57:11

标签: perl pdf

我编写的代码应该执行以下操作:

  1. 如果命令行参数!= 1,则脚本退出。如果给出了文件名作为命令行参数,则脚本将拆分此文件。
  2. 如果给出'go'命令行参数,则脚本获取当前目录,然后尝试拆分此目录中的每个pdf文件。此过程失败。我稍后会提供更多细节。
  3. 如果命令行参数既不是文件名也不是'go',那么脚本会显示一条合适的消息。
  4. 至于第二点,错误读取:

      

    全局符号“$ oldpdf”需要在C:\ strawberry \ perl \ bin \ current.pl第21行显式包名。   全局符号“$ newpdf”需要在C:\ strawberry \ perl \ bin \ current.pl第24行显式包名。   全局符号“$ oldpdf”需要在C:\ strawberry \ perl \ bin \ current.pl第24行显式包名。   全局符号“$ newpdf”需要在C:\ strawberry \ perl \ bin \ current.pl第31行显式包名。   全局符号“$ oldpdf”需要在C:\ strawberry \ perl \ bin \ current.pl第31行显式包名。   全局符号“$ filename”需要在C:\ strawberry \ perl \ bin \ current.pl第39行显式包名。   全局符号“$ newpdf”需要在C:\ strawberry \ perl \ bin \ current.pl第40行显式包名。   由于编译错误,C:\ strawberry \ perl \ bin \ current.pl的执行中止。

    脚本如下(我知道它很难看 - 我完全是新手):

    use strict; 
    use warnings;
    use PDF::API2;
    use Cwd;
    
    if ( @ARGV != 1 ) {
    die "Command line should be either \"go\" or a filename!\n";
    }
    
    my $cmd = $ARGV[0];
    
    if ($cmd eq "go") {
        my $current = getcwd();
        print "Current folder: $current\n";
        my @files = glob("*.pdf");
        foreach my $file (@files) {
            my $filename = $file;
            my $oldpdf = PDF::API2->open($filename);
            my $newpdf = PDF::API2->new;
    }
    for my $page_nb (1..$oldpdf->pages) {
    my ($page, @cropdata);
    
    $page = $newpdf->importpage($oldpdf, $page_nb);
    @cropdata = $page->get_mediabox;
    $cropdata[2] /= 2;
    $page->cropbox(@cropdata);
    $page->trimbox(@cropdata);
    $page->mediabox(@cropdata);
    
    $page = $newpdf->importpage($oldpdf, $page_nb);
    @cropdata = $page->get_mediabox;
    $cropdata[0] = $cropdata[2] / 2;
    $page->cropbox(@cropdata);
    $page->trimbox(@cropdata);
    $page->mediabox(@cropdata);
    }
    
    (my $newfilename = $filename) =~ s/(.*)\.(\w+)$/$1-crop.$2/;
    $newpdf->saveas("$newfilename");
    }
    
    elsif   (-f $cmd) {
        my $oldpdf = PDF::API2->open($cmd);
        my $newpdf = PDF::API2->new;
        for my $page_nb (1..$oldpdf->pages) {
        my ($page, @cropdata);
    
        $page = $newpdf->importpage($oldpdf, $page_nb);
        @cropdata = $page->get_mediabox;
        $cropdata[2] /= 2;
        $page->cropbox(@cropdata);
        $page->trimbox(@cropdata);
        $page->mediabox(@cropdata);
    
        $page = $newpdf->importpage($oldpdf, $page_nb);
        @cropdata = $page->get_mediabox;
        $cropdata[0] = $cropdata[2] / 2;
        $page->cropbox(@cropdata);
        $page->trimbox(@cropdata);
        $page->mediabox(@cropdata);
    }
    
    (my $newfilename = $cmd) =~ s/(.*)\.(\w+)$/$1-crop.$2/;
    $newpdf->saveas("$newfilename");
    }
    
    else {
        print "Bad parameter!\n";
    }
    


    更新

    use strict;
    use warnings;
    
    use PDF::API2;
    use Cwd;
    
    if ( @ARGV != 1 ) {
        die "Command line should be either \"go\" or a filename!\n";
    }
    
    my $cmd = $ARGV[0];
    
    if ( $cmd eq "go" ) {
    
        my $current = getcwd();
        print "Current folder: $current\n";
        my @files = glob("*.pdf");
    
        foreach my $file (@files) {
    
            my $filename = $file;
            my $oldpdf   = PDF::API2->open($filename);
            my $newpdf   = PDF::API2->new;
        }
    
        for my $page_nb ( 1 .. $oldpdf->pages ) {
    
            my ( $page, @cropdata );
    
            $page = $newpdf->importpage( $oldpdf, $page_nb );
            @cropdata = $page->get_mediabox;
            $cropdata[2] /= 2;
            $page->cropbox(@cropdata);
            $page->trimbox(@cropdata);
            $page->mediabox(@cropdata);
    
            $page        = $newpdf->importpage( $oldpdf, $page_nb );
            @cropdata    = $page->get_mediabox;
            $cropdata[0] = $cropdata[2] / 2;
            $page->cropbox(@cropdata);
            $page->trimbox(@cropdata);
            $page->mediabox(@cropdata);
        }
    
        ( my $newfilename = $filename ) =~ s/(.*)\.(\w+)$/$1-crop.$2/;
        $newpdf->saveas("$newfilename");
    }
    
    elsif ( -f $cmd ) {
    
        my $oldpdf = PDF::API2->open($cmd);
        my $newpdf = PDF::API2->new;
    
        for my $page_nb ( 1 .. $oldpdf->pages ) {
            my ( $page, @cropdata );
    
            $page = $newpdf->importpage( $oldpdf, $page_nb );
            @cropdata = $page->get_mediabox;
            $cropdata[2] /= 2;
            $page->cropbox(@cropdata);
            $page->trimbox(@cropdata);
            $page->mediabox(@cropdata);
    
            $page        = $newpdf->importpage( $oldpdf, $page_nb );
            @cropdata    = $page->get_mediabox;
            $cropdata[0] = $cropdata[2] / 2;
            $page->cropbox(@cropdata);
            $page->trimbox(@cropdata);
            $page->mediabox(@cropdata);
        }
    
        ( my $newfilename = $cmd ) =~ s/(.*)\.(\w+)$/$1-crop.$2/;
        $newpdf->saveas("$newfilename");
    }
    
    else {
        print "Bad parameter!\n";
    }
    

2 个答案:

答案 0 :(得分:1)

我想要的是你的循环

foreach my $file (@files) {

    my $filename = $file;
    my $oldpdf   = PDF::API2->open($filename);
    my $newpdf   = PDF::API2->new;
}

只需设置三个变量的值,然后一遍又一遍地丢弃它们,每个文件一次。您正试图在下一个循环中使用这些值

for my $page_nb ( 1 .. $oldpdf->pages ) { ... }

但到现在为止$oldpdf不再存在,所以程序已经死了

你走了。我添加了一些东西,特别是我已经把文件拆分成子程序以避免重复代码

use strict;
use warnings 'all';

use PDF::API2;
use Cwd 'getcwd';

STDOUT->autoflush;

@ARGV == 1 or die qq{Command line should be either "go" or a filename!\n};

my ($cmd) = @ARGV;

if ( -f $cmd ) {
    split_file($cmd);
}
elsif ( lc($cmd) eq 'go' ) {

    printf "Current folder: %s\n", getcwd;

    split_file($_) for glob '*.pdf';
}
else {
    print "Bad parameter!\n";
}


sub split_file {

    my ($file) = @_;
    ( my $newfile = $file ) =~ s/(.+)\./$1-crop./x;

    printf qq{Processing "%s" => "%s"\n}, $file, $newfile;

    my $oldpdf = PDF::API2->open($file);
    my $newpdf = PDF::API2->new;

    for my $page_nb ( 1 .. $oldpdf->pages ) {

        for my $i ( 2, 0 ) {
            my $page      = $newpdf->importpage( $oldpdf, $page_nb );
            my @mediabox  = $page->get_mediabox;    # Left X, Bottom Y, Right X, Top Y
            $mediabox[$i] = $mediabox[2] / 2;
            $page->cropbox(@mediabox);
            $page->trimbox(@mediabox);
            $page->mediabox(@mediabox);
        }
    }

    $newpdf->saveas($newfile);
}

答案 1 :(得分:0)

如果您收到Perl错误或警告,但您无法理解,那么您可以随时(暂时)将use diagnostics添加到您的代码中。这将提供有关问题的更多详细信息。在这种情况下,它会说出这样的话:

  

(F)您已经说过"使用严格的"或"使用严格的变量",表示所有>变量必须是词法范围的(使用"我的"或"状态"),   事先声明使用"我们的",或明确限定说明哪个   包含全局变量(使用" ::")。

当然,您已经努力用my声明变量,但似乎您还没有确定范围正确。使用my声明的变量的范围仅存在于当前代码块中。因此,您似乎正在尝试使用声明范围之外的变量。

第21行是这样的:

$page = $newpdf->importpage($oldpdf, $page_nb);

这使用$oldpdf和$ newpdf . But neither of of these variables exist at this point. You declared them both within you foreach我的$ file(@files){...}`块,但这些声明只在该块内有效。当你尝试使用该块之外的变量时,Perl(非常正确)会抱怨。

您需要更深入地思考变量的使用位置,然后您需要在正确的范围内声明它们。