我编写的代码应该执行以下操作:
至于第二点,错误读取:
全局符号“$ 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";
}
答案 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(非常正确)会抱怨。
您需要更深入地思考变量的使用位置,然后您需要在正确的范围内声明它们。