2015-12-15 2 views
-1

У меня есть следующий скрипт для создания pdf-файла из jpg. Это должно быть легко изменить, чтобы создать PDF-файл из pngs и tif. Ну, на самом деле это не так. Сценарий выглядит следующим образом:Perl: сделайте pdf не только из jpg

#!/usr/bin/perl 

use PDF::API2; 
use strict; 
use warnings; 

# 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; 

#indepedently works OK - JPG 
foreach my $file (glob "$folder/*.jpg") { 
    my $jpg = $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); 
} 

$pdf->saveas($pdf_file); 

indepedently works OK - PNG 
foreach my $file (glob "$folder/*.png") { 
    my $png = $file; 
    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); 
} 

$pdf->saveas($pdf_file); 

#indepedently works OK - TIF 
foreach my $file (glob "$folder/*.tif") { 
    my $tif = $file; 
    my $image = $pdf->image_tiff($tif); 
    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); 
} 

$pdf->saveas($pdf_file); 

Когда я комментирую часть JPG, он работает для PNG, когда я комментирую JPG и PNG часть, она работает для TIFs. Однако он не работает для всех расширений: JPG, PNG и TIF.

+0

Нет, проблема в том, что регулярное выражение на предыдущей строке не имеет ограничителя закрытия. –

+2

Кроме того, файлы JPEG обычно не заканчиваются на '.jepg', но это одна из вещей, которые вы разрешаете. И вы закрываете каталог после каждого цикла, но вы все еще пытаетесь его прочитать. Кроме того, отсутствующие замыкающие скобки и, вероятно, другие синтаксические ошибки, которые я не поймал. Если весь код выполняет почти то же самое, это хороший кандидат для подпрограммы. –

+0

Еще одна вещь (возможно): 'close' закрывает дескриптор файла, а не дескриптор каталога. Вы хотите «закрыть». –

ответ

2

Ваша ошибка говорит вам, где проблема:

(Может быть беглый многострочный '' строка, начиная со строки 40)

next unless $file =~ /\.tif$; 

Должно быть

next unless $file =~ /\.tif$/; 

Пока мы на нем:

  • добавить use warnings;
  • opendir/closedir, как правило, лучше с использованием glob вместо этого. Например .:

    foreach my $file (glob "$folder/*.jpg") { 
    
    } 
    
  • Вы на самом деле не прекращается, что второй цикл - Вы, вероятно, нужно } где-то - предположительно до close заявления.

  • Возможно, вам понадобится opendir, потому что вы closedir, а затем попробуйте и readdir.
+0

Это было очень полезно. Я новичок perl, поэтому я заберу время, чтобы переписать код. Я вернусь завтра. Теперь я могу сделать PDF-файл из tifs, так что есть улучшение. – menteith

+0

Я написал код с помощью 'glob'.Он работает только для определенных расширений файлов: когда присутствует только часть кода JPG, он работает, то же самое для кода TIF и PNG. Я не могу заставить его работать для всех расширений: он терпит неудачу после того, как первый цикл (jpgs) не сможет найти какие-либо jpg в папке. – menteith

+0

Вы можете указать несколько аргументов для glob. – Sobrique

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