Pagina 1 di 2

PDF catalog

Inviato: 30/08/2007, 23:04
da teohell
ho scaricato e installato la contribution in oggetto
purtroppo ho notato che la gestione delle immagini sul pdf generato è molto carente, così ho apportato un paio di modifiche al codice per utilizzare meglio le GD

nel file admin/pdf_catalogue.pdf, cercate la funzione "ShowImage" alla riga 170, e sostituite l'intera funzione con questa:

Codice: Seleziona tutto

 function ShowImage(&$width,&$height,$link,$path)
 {
    //$width=min($width,MAX_IMAGE_WIDTH);
    //$height=min($height,MAX_IMAGE_HEIGHT);

    $width = MAX_IMAGE_WIDTH;
    $height= MAX_IMAGE_HEIGHT;


    if(RESIZE_IMAGES) {
	$destination =DIR_FS_CATALOG."catalogues/";
	if(substr(strtolower($path), (strlen($path)-4),4)==".jpg" || substr(strtolower($path), (strlen($path)-5),5)==".jpeg") {
            $src=imagecreatefromjpeg($path);
   	} else if (substr(strtolower($path), (strlen($path)-4),4)==".png") {
      	    $src=imagecreatefrompng($path);
   	} else {
      	    echo "Only PNG and JPEG";
            exit();
   	}
   
   	$array=explode("/", $path);
   	$last=sizeof($array);
        $size = getimagesize($path);
   	if($size[0] > $size[1]) {
     	    $im=imagecreatetruecolor($width/PDF_TO_MM_FACTOR, $height/PDF_TO_MM_FACTOR);
            imagecopyresampled($im, $src, 0, 0, 0, 0,$width/PDF_TO_MM_FACTOR, $height/PDF_TO_MM_FACTOR, $size[0], $size[1]);
   	} else {
     	    $im=imagecreatetruecolor($height/PDF_TO_MM_FACTOR,$width/PDF_TO_MM_FACTOR);
            imagecopyresampled($im, $src, 0, 0, 0, 0, $height/PDF_TO_MM_FACTOR, $width/PDF_TO_MM_FACTOR, $size[0], $size[1]);
  	}
  	if(!imagejpeg($im, $destination.$array[$last-1])) {
    	    exit();
    	}

        $path=$destination.$array[$last-1];
        $this->SetLineWidth(1);  
	$this->Cell($width+3,$height,"",1,0);
	$this->SetLineWidth(0.2);
	$this->Image($path,($this->GetX()-$width), $this->GetY(), $width, $height,'',$link);
	$this->SetFont('Arial','',8);
	unlink($path);
    } else {
	$this->SetLineWidth(1);
	// NH $this->Cell($width,$height,"",1,0);
	$this->Cell($width+3,$height,"",SIZE_BORDER_IMAGE,0);
	$this->SetLineWidth(0.2);
	//NH $this->Image($path,($this->GetX()-$width), $this->GetY(), $width, $height,'',$link);
	$this->Image($path,($this->GetX()-$width), $this->GetY(),$width ,'' ,'',$link);
	$this->SetFont('Arial','',8);
    }
 }
a questo punto le immagini potranno essere visualizzate molto meglio nel pdf generato; attivate inoltre la seguente impostazione nel file admin/pdf_config.php:

Codice: Seleziona tutto

	define('RESIZE_IMAGES',1);
e modificate queste impostazioni per decidere la dimensione esatta della immagini nel catalogo pdf (fate un pò di prove per vedere quale vada meglio prima!)

Codice: Seleziona tutto

	//Width max in mm
	define('MAX_IMAGE_WIDTH',50);

	//Height max in mm
	define('MAX_IMAGE_HEIGHT',50);
Spero sia utile a qualcuno! :wink:

un'ultima cosa: ho notato che se sono presenti i evcchi cataloghi, lo script non li sovrascrive! quindi quando generate un nuovo catalogo dovete cancellare i vecchi files
questo penso sia dovuto al parametro "safe_mode=on" del php.ini, magari su server diversi dal mio è settato off e il problema non sussiste...
Se avete linux come server usate un .htaccess e settate il parametro off (però poi diventa pericoloso magari con altri script!)
se non potete o non volete settare parametri del php.ini, bisogna modificare la classe di FPDF:

nel file pdf_fpdf.php, aggiungete sotto la riga 1062:

Codice: Seleziona tutto

if (file_exists($name)) {
    unlink($name);
}
spero di essere stato utile, e se ho sbagliato qualcosa correggetemi pure :D

ciao, teo

Interessante ma...

Inviato: 26/06/2008, 16:27
da SpyroTSK
Ciao,
la tua modifica è eccezzionale, infatti l'ho usata subito e ha già migliorato la definizione dell'immagine, volevo applicargli delle modifiche per renderlo un pò più dettagliato sulle opzioni solo che non sono molto bravo in php.

Volevo fargli ridimensionare le immagini in base ad una percentuale, esempio: immagine da 100x200, nel file di configurazione dico: max altezza 50 max larghezza 100, lui piglia il lato + lungo e ridimensiona il lato corto in base a quanto in % ha dovuto ridimensionare il lato + lungo. (in sostanza mantiene le proporzioni dell'immagine)

Poi volevo sapere come e se è possibile aumentare la definizione (o diminuire la compressione che dir si voglia) delle immagini sullo script che hai modificato.

ps: Scusate se uppo un post vecchio ma è importante :P

Grazie! :D

Inviato: 27/06/2008, 10:03
da teohell
ciao, sono felice che ti sia stata utile, era una modifica fatta in un'oretta giusto perchè avevo un attimo di tempo, ma era una cosa buttata lì comunque, ci si può lavorare sopra parecchio :wink:

la funzione di ridimensionamento che mantenga le proporzioni è già dentro nelle GD, al momento non ho sottomano il reference manual ma sicuramente si può inserire nella routine di ridimensionamento senza cambiarla troppo, probabilmente basta settare una flag

la definizione/compressione l'ho già aumentata io rispetto alla versione originaria della contrib; purtroppo con le routine scritte in qs modo, non c'è molto di più che si possa fare, siamo già a limite, bisognerebbe riscrivere completamente le routine grafiche...
comunque tieni conto che stai ridimensionando delle immagini più grosse in formato più piccolo, quindi la perdita di qualità c'è... l'unico consiglio che ti posso dare è di non esagerare con la differenza di dimensioni, cioè non passare per dire da immagini 1024x1024 a immagini 50x50 perchè la perdita di qualità è eccessiva... se puoi, non dovresti ridimensionare per più del 50-60% per avere una qualità finale accettabile

ciao, teo

Inviato: 27/06/2008, 10:19
da teohell
per il ridimensionamento proporzionale, ho aggiunto una modifica che era nei file di esempio alle GD

prova così:

Codice: Seleziona tutto

 function ShowImage(&$width,&$height,$link,$path)
 {
    //$width=min($width,MAX_IMAGE_WIDTH);
    //$height=min($height,MAX_IMAGE_HEIGHT);

    $width = MAX_IMAGE_WIDTH;
    $height= MAX_IMAGE_HEIGHT;


    if(RESIZE_IMAGES) {
	$destination =DIR_FS_CATALOG."catalogues/";
	if(substr(strtolower($path), (strlen($path)-4),4)==".jpg" || substr(strtolower($path), (strlen($path)-5),5)==".jpeg") {
            $src=imagecreatefromjpeg($path);
   	} else if (substr(strtolower($path), (strlen($path)-4),4)==".png") {
      	    $src=imagecreatefrompng($path);
   	} else {
      	    echo "Only PNG and JPEG";
            exit();
   	}
   
   	$array=explode("/", $path);
   	$last=sizeof($array);
        $size = getimagesize($path);

        $ratio_orig = $size[0]/$size[1];
        if ($width/$height > $ratio_orig) {
            $width = $height*$ratio_orig;
        } else {
            $height = $width/$ratio_orig;
       }

   	if($size[0] > $size[1]) {
     	    $im=imagecreatetruecolor($width/PDF_TO_MM_FACTOR, $height/PDF_TO_MM_FACTOR);
            imagecopyresampled($im, $src, 0, 0, 0, 0,$width/PDF_TO_MM_FACTOR, $height/PDF_TO_MM_FACTOR, $size[0], $size[1]);
   	} else {
     	    $im=imagecreatetruecolor($height/PDF_TO_MM_FACTOR,$width/PDF_TO_MM_FACTOR);
            imagecopyresampled($im, $src, 0, 0, 0, 0, $height/PDF_TO_MM_FACTOR, $width/PDF_TO_MM_FACTOR, $size[0], $size[1]);
  	}
  	if(!imagejpeg($im, $destination.$array[$last-1])) {
    	    exit();
    	}

        $path=$destination.$array[$last-1];
        $this->SetLineWidth(1);  
	$this->Cell($width+3,$height,"",1,0);
	$this->SetLineWidth(0.2);
	$this->Image($path,($this->GetX()-$width), $this->GetY(), $width, $height,'',$link);
	$this->SetFont('Arial','',8);
	unlink($path);
    } else {
	$this->SetLineWidth(1);
	// NH $this->Cell($width,$height,"",1,0);
	$this->Cell($width+3,$height,"",SIZE_BORDER_IMAGE,0);
	$this->SetLineWidth(0.2);
	//NH $this->Image($path,($this->GetX()-$width), $this->GetY(), $width, $height,'',$link);
	$this->Image($path,($this->GetX()-$width), $this->GetY(),$width ,'' ,'',$link);
	$this->SetFont('Arial','',8);
    }
 }
prova e fammi sapere se va (dovrebbe)

ciao, teo

Inviato: 27/06/2008, 10:43
da teohell
va bhe visto che al lavoro oggi non combino nulla, ho risolto anche il tuo secondo problema :P

all'inizio del file admin/pdf_catalogue.php, prima di ogni altra funzione, inserisci questo codice:

Codice: Seleziona tutto

function fastimagecopyresampled (&$dst_image, $src_image, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h, $quality = 3) {
  // Plug-and-Play fastimagecopyresampled function replaces much slower imagecopyresampled.
  // Just include this function and change all "imagecopyresampled" references to "fastimagecopyresampled".
  // Typically from 30 to 60 times faster when reducing high resolution images down to thumbnail size using the default quality setting.
  // Author: Tim Eckel - Date: 09/07/07 - Version: 1.1 - Project: FreeRingers.net - Freely distributable - These comments must remain.
  //
  // Optional "quality" parameter (defaults is 3). Fractional values are allowed, for example 1.5. Must be greater than zero.
  // Between 0 and 1 = Fast, but mosaic results, closer to 0 increases the mosaic effect.
  // 1 = Up to 350 times faster. Poor results, looks very similar to imagecopyresized.
  // 2 = Up to 95 times faster.  Images appear a little sharp, some prefer this over a quality of 3.
  // 3 = Up to 60 times faster.  Will give high quality smooth results very close to imagecopyresampled, just faster.
  // 4 = Up to 25 times faster.  Almost identical to imagecopyresampled for most images.
  // 5 = No speedup. Just uses imagecopyresampled, no advantage over imagecopyresampled.

  if (empty($src_image) || empty($dst_image) || $quality <= 0) { return false; }
  if ($quality < 5 && (($dst_w * $quality) < $src_w || ($dst_h * $quality) < $src_h)) {
    $temp = imagecreatetruecolor ($dst_w * $quality + 1, $dst_h * $quality + 1);
    imagecopyresized ($temp, $src_image, 0, 0, $src_x, $src_y, $dst_w * $quality + 1, $dst_h * $quality + 1, $src_w, $src_h);
    imagecopyresampled ($dst_image, $temp, $dst_x, $dst_y, 0, 0, $dst_w, $dst_h, $dst_w * $quality, $dst_h * $quality);
    imagedestroy ($temp);
  } else imagecopyresampled ($dst_image, $src_image, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h);
  return true;
}
e la funzione di cui al post precedente diventa:

Codice: Seleziona tutto

function ShowImage(&$width,&$height,$link,$path)
 {
    //$width=min($width,MAX_IMAGE_WIDTH);
    //$height=min($height,MAX_IMAGE_HEIGHT);

    $width = MAX_IMAGE_WIDTH;
    $height= MAX_IMAGE_HEIGHT;


    if(RESIZE_IMAGES) {
   $destination =DIR_FS_CATALOG."catalogues/";
   if(substr(strtolower($path), (strlen($path)-4),4)==".jpg" || substr(strtolower($path), (strlen($path)-5),5)==".jpeg") {
            $src=imagecreatefromjpeg($path);
      } else if (substr(strtolower($path), (strlen($path)-4),4)==".png") {
             $src=imagecreatefrompng($path);
      } else {
             echo "Only PNG and JPEG";
            exit();
      }
   
      $array=explode("/", $path);
      $last=sizeof($array);
        $size = getimagesize($path);

        $ratio_orig = $size[0]/$size[1];
        if ($width/$height > $ratio_orig) {
            $width = $height*$ratio_orig;
        } else {
            $height = $width/$ratio_orig;
       }

      if($size[0] > $size[1]) {
            $im=imagecreatetruecolor($width/PDF_TO_MM_FACTOR, $height/PDF_TO_MM_FACTOR);
            fastimagecopyresampled($im, $src, 0, 0, 0, 0,$width/PDF_TO_MM_FACTOR, $height/PDF_TO_MM_FACTOR, $size[0], $size[1]);
      } else {
            $im=imagecreatetruecolor($height/PDF_TO_MM_FACTOR,$width/PDF_TO_MM_FACTOR);
            fastimagecopyresampled($im, $src, 0, 0, 0, 0, $height/PDF_TO_MM_FACTOR, $width/PDF_TO_MM_FACTOR, $size[0], $size[1]);
     }
     if(!imagejpeg($im, $destination.$array[$last-1])) {
           exit();
       }

        $path=$destination.$array[$last-1];
        $this->SetLineWidth(1); 
   $this->Cell($width+3,$height,"",1,0);
   $this->SetLineWidth(0.2);
   $this->Image($path,($this->GetX()-$width), $this->GetY(), $width, $height,'',$link);
   $this->SetFont('Arial','',8);
   unlink($path);
    } else {
   $this->SetLineWidth(1);
   // NH $this->Cell($width,$height,"",1,0);
   $this->Cell($width+3,$height,"",SIZE_BORDER_IMAGE,0);
   $this->SetLineWidth(0.2);
   //NH $this->Image($path,($this->GetX()-$width), $this->GetY(), $width, $height,'',$link);
   $this->Image($path,($this->GetX()-$width), $this->GetY(),$width ,'' ,'',$link);
   $this->SetFont('Arial','',8);
    }
 }
prova e dimmi come va
nei commenti alla prima function trovi i settaggi per la qualità :wink:

ciao, teo

Inviato: 02/07/2008, 15:21
da SpyroTSK
Sei un dio!!!
Io ci avrei messo mesi per farlo!!!

Grazie, ora provo e poi ti fo sapere!!!

Inviato: 02/07/2008, 15:34
da SpyroTSK
SpyroTSK ha scritto:Sei un dio!!!
Io ci avrei messo mesi per farlo!!!

Grazie, ora provo e poi ti fo sapere!!!
ciao, allora il problema è questo:

Codice: Seleziona tutto

Fatal error: Call to undefined function fastimagecopyresampled() in /var/www/catalog/admin/pdf_catalogue.php on line 233
ti incollo il link su nopaste con il codice php completo del file /admin/pdf_catalogue.php in modo da tenere la pagina + pulita possibile!

http://rafb.net/p/kYHACo55.html

Inviato: 02/07/2008, 15:37
da SpyroTSK
SpyroTSK ha scritto:
SpyroTSK ha scritto:Sei un dio!!!
Io ci avrei messo mesi per farlo!!!

Grazie, ora provo e poi ti fo sapere!!!
ciao, allora il problema è questo:

Codice: Seleziona tutto

Fatal error: Call to undefined function fastimagecopyresampled() in /var/www/catalog/admin/pdf_catalogue.php on line 233
ti incollo il link su nopaste con il codice php completo del file /admin/pdf_catalogue.php in modo da tenere la pagina + pulita possibile!

http://rafb.net/p/kYHACo55.html
risolto, non và come prima function, ma come ultima!!

edit: non trovo la possibilità di rimuovere il bordo nero dalle immagini!
è tutto il giorno che sto guardando sta cosa :P

Inviato: 02/07/2008, 16:07
da teohell
SpyroTSK ha scritto: risolto, non và come prima function, ma come ultima!!
eh già non ho seguito il program flow, non ricordavo bene dove la function modificata, sono andato a memoria... evidentemente mi ricordavo male :P

cmq vedo che hai già risolto :)

per il bordo nero devo andare a vedere le classi di FPDF
adesso vado e ti dico :)

ciao, teo

EDIT:
allora, non so a quale bordino preciso ti riferisci, perchè in realtà ce ne sono due
uno è nella solita function ShowImage; alla riga 407 su nopaste c'è questo codice:

Codice: Seleziona tutto

$this->Cell($width+3,$height,"",1,0);
sostituisci con

Codice: Seleziona tutto

$this->Cell($width+3,$height,"",0,0);
così togli il bordino alla cella nel pdf

poi però c'è anche un settaggio SIZE_BORDER_IMAGE nel file di configurazione di PDF CATALOGUE, ovvero nel file admin/pdf_config.php
se modifichi quello toglie il bordo all'immagine vera e propria

ariciao, teo

Inviato: 02/07/2008, 16:40
da SpyroTSK
SIZE_BORDER_IMAGE è già a 0

l'altra variabile mi è sfuggita!!!

ora provo con la tua soluzione e vedo, dovrebbe essere quello cmq :P

grazie :)


edit: Era proprio quello!!!
funziona alla grande come volevo io! :D

Grazie infinite!

ps: ti consiglio di sistemare le variabili es: la qualità e il check se si vuole o no il fatto delle proporzioni delle immagini sul file pdf_config.php e postarlo su oscommerce.org come nuovo aggiornamento in modo che sia visibile a tutti e visto che ci sei linkare questo post sulla descrizione! :)

Inviato: 02/07/2008, 16:45
da teohell
trovato l'arcano del perchè non ti funzionava come prima function, avevo ragione, va come prima function, ma al di fuori della classe!

in pratica quella function dovresti metterla alla riga 66 del codice su nopaste

ciao, teo

ps: cmq alla fine ho aperto ftp e mi sono uppato pure io la versione modificata :lol:
ma la qualità ti soddisfa? a me sinceramente fa un pò pietà :?

Inviato: 02/07/2008, 17:01
da SpyroTSK
Ti dirò, ho visto immagini migliori!
però sinceramente meglio della versione originale del pdf catalogue!!!

Inviato: 03/07/2008, 8:13
da teohell
ps: ti consiglio di sistemare le variabili es: la qualità e il check se si vuole o no il fatto delle proporzioni delle immagini sul file pdf_config.php e postarlo su oscommerce.org come nuovo aggiornamento in modo che sia visibile a tutti e visto che ci sei linkare questo post sulla descrizione! Smile
appena ho 5 minuti prometto che lo faccio :P

anche se a dirti la verità avrò sviluppato decine di modifiche ai vari OsC che ho installato, e pure al mio e-shop, ma pulire bene il tutto e presentare una release richiede del tempo che purtroppo no ho :cry:

ciao, teo

aiuto pdf catalog

Inviato: 03/07/2008, 10:38
da willys82
ragazzi che verisone avete di pdf catalog se mi passate il link provo pure io grazie

Inviato: 03/07/2008, 11:14
da teohell
PDF Catalogs v.2.0.1 for osCommerce v.2.2 MS2