2013-11-02 3 views
0

Я использую следующий код, чтобы сделать PDF-файл из jpg. Он отлично работает, но я хотел бы сделать это, чтобы изменить этот скрипт, чтобы он мог использоваться без какого-либо ввода пользователем. Я бы хотел, чтобы щелкнуть правой кнопкой мыши папку в Windows, выберите этот сценарий и сделайте pdf-файл. Таким образом, этот скрипт должен получить имя папки и создать файл PDF без запроса имени. Было бы идеально, если бы название окончательного pdf было бы таким же, как и в папке, где находятся jps. Не могли бы вы мне помочь, пожалуйста?Perl script: модификация, чтобы избежать необходимости ввода пользователем

ключ реестра следующим образом:

"C: \ клубничный \ Perl \ Bin \ perl.exe" "D: \ Test \ 790024.pl" % 1

вот код:

#!usr/bin/perl -w 
    use strict; 
    use PDF::API2; 
    #concatenates image files of type JPEG, GIF, and PNG in a specific directory into a pdf file that will 
    #be spit out into that same directory upon completion 

    #very fun 


    print "Input a filepath to a directory (ending with a /. ex: 'C:/path/to/dir/'): "; 
    my $dir = <STDIN>; 
    chomp $dir; 
    print "\nInput the name for the pdf file you wish to create (ex: 'pictures'): "; 
    my $pdf_name = <STDIN>; 
    chomp $pdf_name; 

    #grab a list of files in our very special directory. 
    my @images = sort glob("$dir*") or die "No images\n"; 

    #xreate a new document with no pages 
    my $pdf = PDF::API2->new; 

    #loop through our images, create a page for each image 
    # - while adding the image to the created page -> this is done in the subs 
    for my $file (@images){ 
     #call sub based on what regex matches 
     add_jpg($file) if ($file =~ /.jpg/); 
     #add_png($file) if ($file =~ /\.png$/); 
     #add_png($file) if ($file =~ /.png/); 
     #add_gif($file) if ($file =~ /.gif/); 

    } 

    $pdf->saveas("$dir$pdf_name.pdf"); 


    #subs 
    sub add_jpg{ 
     my $jpg = shift; 
     my $image = $pdf->image_jpeg($jpg); 
     my $page = $pdf->page(); 
     $page->mediabox(0,0,$image->width, $image->height); 
     $page->trimbox(0,0,$image->width, $image->height); 
     my $gfx = $page->gfx; 
     $gfx->image($image, 0, 0); 

    } 

    sub add_png{ 
     my $png = shift; 
     my $image = $pdf->image_png($png); 
     my $page = $pdf->page(); 
     $page->mediabox(0,0,$image->width, $image->height); 
     $page->trimbox(0,0,$image->width, $image->height); 
     my $gfx = $page->gfx; 
     $gfx->image($image, 0, 0); 
    } 

    sub add_gif{ 
     my $gif = shift; 
     my $image = $pdf->image_gif($gif); 
     my $page = $pdf->page(); 
     $page->mediabox(0,0,$image->width, $image->height); 
     $page->trimbox(0,0,$image->width, $image->height); 
     my $gfx = $page->gfx; 
     $gfx->image($image, 0, 0); 
    } 
+0

'мой ($ реж) = @ARGV;' –

+0

Он работает только тогда, когда командная строка открыта, и когда я вставляю путь к JPGs, оканчивающихся /. Я создал ключ в реестре Windows, чтобы иметь правильное меню в каждой папке, что позволило бы мне щелкнуть правой кнопкой мыши и сделать pdf-файл. Они имеют следующий вид: «C: \ strawberry \ perl \ bin \ perl.exe» «D: \ test \ 790024.pl»% 1. Если я последую за вашим решением, это не сработает. – menteith

ответ

1

Вы можете использовать массив @ARGV для захвата параметров для командной строки.

#!/usr/bin/perl 

use PDF::API2; 
use strict; 

# assume all just one directory path 
my $folder = join(' ', @ARGV); 

# deal with dos paths 
$folder =~ s|\\|/|g; 

$folder =~ s|/$||; 

my $pdf_file = $folder . '.pdf'; 

die "Not a folder!\n" unless -d $folder; 
die "There's already a pdf of that name!\n" if -f $pdf_file; 

my $pdf = PDF::API2->new; 

opendir DIR, $folder; 
while(my $file = readdir DIR) { 
    next unless $file =~ /\.je?pg$/i; 
    my $jpg = $folder . '/' . $file; 

    my $image = $pdf->image_jpeg($jpg); 
    my $page = $pdf->page(); 
    $page->mediabox(0,0,$image->width, $image->height); 
    $page->trimbox(0,0,$image->width, $image->height); 
    my $gfx = $page->gfx; 
    $gfx->image($image, 0, 0); 
} 
close DIR; 

$pdf->saveas($pdf_file); 
+0

Благодарим вас за отличное улучшение. Это почти трюк, но если в имени папки есть символ пробела, скрипт не работает. Не могли бы вы исправить это, пожалуйста? – menteith

+0

@menteith Если символ пробела разбивает скрипт, я бы сказал, что ваш путь передачи имени каталога скрипту нарушен, и вы должны исправить это, возможно, указав имя каталога. Однако, если вы не знаете, как это работает в Windows. – user2719058

+0

Вам необходимо сменить раздел реестра: «C: \ strawberry \ perl \ bin \ perl.exe» «D: \ test \ 790024.pl» «% 1» –

Смежные вопросы