Esto realmente me ha desconcertado: este código funciona bien ...
$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;
El archivo se lee y se almacena en @pdf. Luego se convierte en un archivo en lugar de una matriz. Luego se agrega a un zip y se guarda. Luego se lee nuevamente para imprimir en la pantalla y abrir el diálogo de guardar. (OK, entonces la codificación es un poco "dudosa", ¡pero ahorra enredar con las transmisiones, etc., lo que no sé!)
Ahora estoy haciendo prácticamente lo mismo, pero en lugar de un solo nombre de archivo, estoy leyendo un directorio y luego haciendo llamadas a una subrutina ...
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
}
Pero se queja de que "No se puede llamar al método" addString "en un valor indefinido" Y, sin embargo, el nombre de archivo se muestra como correcto y el pdf se está convirtiendo en un archivo como se muestra si hago una impresión en pantalla.
Intenté $ filename = $ pdf [$ x] dentro del bucle $ x, y en la subrutina. Ambos muestran el nombre de archivo correcto, pero ninguno evita el error.
Probablemente me está mirando a la cara, ¡pero no puedo verlo!