Archivo Perl :: Zip respuesta extraña


0

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!

Respuestas:


0

¡Resuelto!

En la parte superior del código donde abrí el directorio, usé "opendir (PDF ..." pero en el closedir tenía "closedir (DIR ...", lo que significaba que la transmisión aún estaba abierta. Entonces, cuando fui para abrir el archivo, utilicé "abrir (PDF ..." y eso ya estaba abierto, por lo que no podía leer los datos para almacenarlos en el archivo zip.

O al menos, eso era parte del problema. ¡Todavía no parecía gustarme correr de una subrutina! Al final, tuve que usar:

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;

Y la rutina abierta es ahora:

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

¡Esto podría ayudar a alguien que obtiene resultados igualmente extraños!

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.