Это действительно сбило меня с толку: этот код работает нормально ...

$filename="name_of_file.pdf";

for ($x=0; $x<@pdf; $x++){
$file.=$pdf[$x];
}
$file=~s/\*ref\*/$new_aff/g;    # converts a variable within the PDF

use Archive::Zip qw( :ERROR_CODES :CONSTANTS );
my $zip = Archive::Zip->new(); 
$now=time();
$save_zip=$now.".zip";
my $member = $zip->addString($file,$filename);
$member->desiredCompressionMethod( COMPRESSION_DEFLATED );
$member->desiredCompressionLevel( 9 );
die 'write error' unless $zip->writeToFileNamed($save_zip) == AZ_OK;

open (FILE, "<$save_zip");
flock(FILE,2);
binmode(FILE);
    while(<FILE>){
    $infile.=$_;
    }
flock(FILE,8);
close (FILE);

unlink($save_zip);
$filename=~s/\.pdf/\.zip/;


print "Content-type: application/zip\n";
print "Content-disposition: inline;filename=\"$filename\"\n\n";
print $infile;

Файл читается и хранится в @pdf. Затем он преобразуется в файл, а не в массив. Это тогда добавлено к почтовому индексу и сохранено. Затем снова прочитайте, чтобы распечатать на экране, чтобы открыть диалог сохранения. (Хорошо, так что кодирование немного "ненадежно", но избавляет от необходимости возиться с потоками и т.д., О которых я сейчас не знаю!)

Сейчас я делаю практически то же самое, но вместо одного имени файла я читаю каталог, а затем выполняю вызовы подпрограммы ...

opendir(PDF, "../data/viral/");
@pdfDir=readdir(PDF);
closedir(DIR);
@pdfDir=grep(!/^\./, @pdfDir);
@pdfDir=grep(!/\.txt/, @pdfDir);

use Archive::Zip qw( :ERROR_CODES :CONSTANTS );
my $zip = Archive::Zip->new(); 
$now=time();
$save_zip=$now.".zip";

for ($x=0; $x<@pdfDir; $x++){
 &process_all;
 }
die 'write error' unless $zip->writeToFileNamed($save_zip) == AZ_OK;  # Write file out once loop finished

sub process_all{    # Processs all the PDF's
&open_pdf;          # Read in as BINMODE
    for ($z=0; $z<@pdf; $z++){
    $file.=$pdf[$z];
    }
$file=~s/\*ref\*/$new_aff/g;    # converts a variable within the PDF

my $member = $zip->addString($file,$pdfDir[$x]);
$member->desiredCompressionMethod( COMPRESSION_DEFLATED );
$member->desiredCompressionLevel( 9 );
$file="";   # Empty the file ready for next PDF
}

Но он жалуется, что «не может вызвать метод" addString "с неопределенным значением». И все же имя файла отображается как правильное, а файл PDF преобразуется в файл, как показано, если я выполняю печать на экране.

Я пробовал $ filename = $ pdf [$ x] в цикле $ x и в подпрограмме. Оба показывают правильное имя файла, но ни один не избегает ошибки.

Это, вероятно, смотрит мне в лицо - но я не вижу этого!

1 ответ1

0

Решил это!

В верхней части кода, где я открывал каталог, я использовал «opendir (PDF ...»), но на закрытом я имел «closedir (DIR ...»), что означало, что поток все еще открыт. Затем - когда я пошел, чтобы открыть файл, я использовал «open (PDF ...»), и он уже был открыт, поэтому он не смог прочитать данные для хранения в zip-архиве.

Или, по крайней мере, это было частью проблемы. Казалось, что все еще не нравится бегать из подпрограммы! В итоге мне пришлось использовать:

use Archive::Zip qw( :ERROR_CODES :CONSTANTS );
$zip = Archive::Zip->new(); 
$now=time();
$save_zip=$now.".zip";

for ($x=0; $x<@pdfDir; $x++){
$filename=$pdfDir[$x];
&open_pdf;
$file=~s/\*ref\*/$new_aff/g;
$member = $zip->addString($file,$filename);
$member->desiredCompressionMethod( COMPRESSION_DEFLATED );
$member->desiredCompressionLevel( 9 );
$file="";
}
die 'write error' unless $zip->writeToFileNamed($save_zip) == AZ_OK;

И теперь открытая рутина:

open (PDF, "<....$filename");
while(<PDF>){
$file.=$_;
}
close(PDF);

Это может помочь кому-то, кто получает такие же странные результаты!

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .