[PHP] classe code barre [Résolu/Fermé]

Signaler
Messages postés
46
Date d'inscription
mercredi 21 mai 2008
Statut
Membre
Dernière intervention
9 janvier 2009
-
 titou38 -
Bonjour,

J'ai besoin de générer un pdf contenant des images de codes barre. Pour cela j'utilise fpdf et une classe trouvée sur pitoo.com: http://pit.free.fr/code_php.php
Très bien faite et parfaitement fonctionnelle, j'ai alors tester cette classe dans un fichier et comme cela est écrit sur leur site il suffit de faire:
echo "<img src=pi_barcode.php?type=EAN&code=".$_POST['codebarre12']."&height=50&readable=Y alt='aucune image'></img>";

pour avoir une image dans notre page.
$_POST['codebarre12']
étant un code à 12 chiffres car la classe crée automatiquement le bit de control.

Mais pour l'inserer dans le pdf je voit pas comment faire. j'ai essayer:
$file = "./CodeBarre/$codebarre.png";					
/*création de l'image*/
$image=imagepng("pi_barcode.php?type=EAN&code=124578569854&height=$hcode&readable=Y");

/*enregistre l'image dans le répertoire courant*/
imagepng($image, $file);
/*on insère l'image dans le pdf*/
$x=$pdf->getX();
$y=$pdf->getY();
$pdf->SetFillColor(255,187,255);
$pdf->Cell(100,$hcode+10,"codebarre",1,0,'C',$pdf->Image($file,$x,$y,0,$hcode,'PNG'));


Et donc pour le premier imagepng j'ai l'erreur suivante:
Warning: imagepng(): supplied argument is not a valid Image resource in c:\program files\easyphp1-8\www\toutpack\format_pdf.php on line 169

Et pour le $pdf->Image($file... j'ai:
Warning: fopen(./CodeBarre/.png): failed to open stream: No such file or directory in c:\program files\easyphp1-8\www\toutpack\classfpdf\fpdf.php on line 1522
FPDF error: Can't open image file: ./CodeBarre/.png


J'imagine bien que la deuxième est forcément du à l'echec de création de la première.
J'espère que quelqu'un saura me répondre.
Merci de votre aide.

3 réponses

Messages postés
46
Date d'inscription
mercredi 21 mai 2008
Statut
Membre
Dernière intervention
9 janvier 2009
2
Re,

J'ai un peu modifier mon code. Pur créer l'image j'utilise cette fois:
$im = imagecreatefrompng("pi_barcode.php?type=EAN&code=124578569854&height=$hcode&readable=Y");
imagepng($im,$file);


imagecreatefrompng créer l'image a partir d'une source, soit le fichier contenant la classe. Puis imagepng l'enregistre dans un repertoire.
Mais j'ai les même problème qu'avant:

Warning: imagecreatefrompng(pi_barcode.php?type=EAN&code=124578569854&height=12): failed to open stream: Invalid argument in c:\program files\easyphp1-8\www\toutpack\format_pdf.php on line 171

Warning: imagepng(): supplied argument is not a valid Image resource in c:\program files\easyphp1-8\www\toutpack\format_pdf.php on line 172

Warning: fopen(./CodeBarre/.png): failed to open stream: No such file or directory in c:\program files\easyphp1-8\www\toutpack\classfpdf\fpdf.php on line 1522
FPDF error: Can't open image file: ./CodeBarre/.png


Merci de votre aide
Messages postés
46
Date d'inscription
mercredi 21 mai 2008
Statut
Membre
Dernière intervention
9 janvier 2009
2
Bonjour,

désormais j'arrive à enregistrer mon code barre dans un fichier .png temporaire. Pour cela j'ai un peu suivi ce topic:
https://www.developpez.net/forums/d546949/php/bibliotheques-frameworks/fpdf-fpdf-generateur-code-barres/#post3255401

Il faut reprendre ce qui ce strouve en dessous de la classe dans pi_barcode, et l'incorporer à une méthode du pdf dans le fichier php qui creer le pdf:
<?php
include('pdf.php');
class PDF extends FPDF{
...
//génère le code barre
function genCode($type, $code, $height, $readable, $width, $showtype){
	include('pi_barcode.php');
	$type = strtoupper($type);
	switch( $type ) {
		case "C128C" :
			if (preg_match("/^[0-9]{2,48}$/", $code)){
				$tmp = strlen("$code");
				if(($tmp%2)!=0) $code = "0$code";
				} else {
				  $type = "ERR";
				  $code = "CODE 128C REQUIRES DIGITS ONLY";
				}
				
			case "C128" :
				
				$carok = true;
				for($i=0;$i<strlen($code);$i++) {
					$tmp = ord(substr($code,$i,1)) ;
					if($tmp < 32 OR $tmp > 126) $carok = false;
				}
				if( !$carok ) {
				  $type = "ERR";
				  $code = "UNAUTHORIZED CHARS IN 128 CODE";
				}

			  break;
			case "UPC" :

				$code = "0$code";
				
			case "EAN" :

				$long = strlen( $code ) ;
				$factor = 3;
				$sum = 0;
				
				if (preg_match("/^[0-9]{8}$/", $code) OR preg_match("/^[0-9]{13}$/", $code)){
			//        if ($long==13){
			   
					for ($index = ($long - 1); $index > 0; $index--) {
						$sum += substr( $code, $index - 1, 1 ) * $factor ;
						$factor = 4 - $factor ;
					}
					$cc = ( ( 1000 - $sum ) % 10 ) ;

					if ( substr( $code, -1, 1) != $cc ) {
						$type = "ERR";
						$code = "CHECKSUM ERROR IN EAN/UPC CODE";
					}
			   
				} elseif (preg_match("/^[0-9]{7}$/", $code) OR preg_match("/^[0-9]{12}$/", $code)){
			//        } elseif ($long==12){
			   
					for ($index = ($long ); $index > 0; $index--) {
						$sum += substr( $code, $index - 1, 1 ) * $factor ;
						$factor = 4 - $factor ;
					}
					$cc = ( ( 1000 - $sum ) % 10 ) ;

					$code .= "$cc" ;
			   
				} else {
				  $type = "ERR";
				  $code = "THIS CODE IS NOT EAN/UPC TYPE";
				}

			  break;
			case "C25I" :

				$tmp = strlen("$code");
				if(($tmp%2)==0) { $code = "0$code"; $tmp++; }

			case "C25" :

				if (preg_match("/^[0-9]{1,48}$/", $code)){
					$checksum = 0;
					$factor = 3;
					$tmp = strlen("$code");
					for($i=$tmp-1; $i>=0; $i--) {
						$checksum += (intval(substr($code,$i,1))*$factor);
						$factor = 4-$factor;
					}
					$checksum = 10-($checksum%10);
					if($checksum==10) $checksum = 0;
					$code .= "$checksum";
				} else {
				  $type = "ERR";
				  $code = "CODE C25 REQUIRES DIGITS ONLY";
				}
				
			  break;
			case "C39" :
				
				if(preg_match("/^[0-9A-Z\-\.\$\/+% ]{1,48}$/i", $code)) {
				  $code = "*$code*";
				} else {
				  $type = "ERR";
				  $code = "UNAUTHORIZED CHARS IN CODE 39";
				}
				
			  break;
			case "CODABAR" :

				if(!preg_match("/^(A|B|C|D)[0-9\-\$:\/\.\+]{1,48}(A|B|C|D)$/i", $code)) {
				  $type = "ERR";
				  $code = "CODABAR START/STOP : ABCD";
				}
				
			  break;
			case "MSI" :

				if (preg_match("/^[0-9]{1,48}$/", $code)){
					$checksum = 0;
					$factor = 1;
					$tmp = strlen("$code");
					for($i=0; $i<$tmp; $i++) {
						$checksum += (intval(substr($code,$i,1))*$factor);
						$factor++;
						if($factor > 10) $factor = 1; 
					}
					$checksum = (1000-$checksum)%10;
					$code .= "$checksum";
				} else {
				  $type = "ERR";
				  $code = "CODE MSI REQUIRES DIGITS ONLY";
				}
				
			  break;
			case "C11" :

				if (preg_match("/^[0-9\-]{1,48}$/", $code)){
					$checksum = 0;
					$factor = 1;
					$tmp = strlen("$code");
					for($i=$tmp-1; $i>=0; $i--) {
						$tmp = substr($code,$i,1);
						if($tmp == "-") $tmp=10;
						else $tmp = intval($tmp);
						$checksum += ($tmp*$factor);
						$factor++; 
						if($factor>10) $factor=1;
					}
					$checksum = $checksum%11;
					if($checksum==10) $code .= $checksum . "-";
					else $code .= "$checksum";
				} else {
				  $type = "ERR";
				  $code = "UNAUTHORIZED CHARS IN CODE 11";
				}
				
			  break;
			case "POSTNET" :

				if (preg_match("/^[0-9]{5}$/", $code) OR preg_match("/^[0-9]{9}$/", $code) OR preg_match("/^[0-9]{11}$/", $code)){
					$checksum = 0;
					$tmp = strlen("$code");
					for($i=$tmp-1; $i>=0; $i--) {
						$checksum += intval(substr($code,$i,1));
					}
					$checksum = 10-($checksum%10);
					if($checksum==10) $checksum=0;
					$code .= "$checksum";
				} else {
				  $type = "ERR";
				  $code = "POSTNET MUST BE 5/9/11 DIGITS";
				}
				
			  break;
			case "KIX" :

				if (preg_match("/^[A-Z0-9]{1,50}$/", $code)){
			// ***** LE CODE KIX n'a pas de checksum (correction V2.02)
			//			$checksum = 0;
			//			$tmp = strlen("$code");
			//			for($i=$tmp-1; $i>=0; $i--) {
			//			    $checksum += intval(substr($code,$i,1));
			//			}
			//			$checksum = 10-($checksum%10);
			//			if($checksum==10) $checksum=0;
			//			$code .= "$checksum";
				} else {
				  $type = "ERR";
				  $code = "UNAUTHORIZED CHARS IN KIX CODE";
				}
				
			  break;
			case "CMC7" :

				if(!preg_match("/^[0-9A-E]{1,48}$/", $code)) {
				  $type = "ERR";
				  $code = "CMC7 MUST BE NUMERIC or ABCDE";
				}
				
			  break;
			default :

				$type = "ERR";
				$code = "UNKWOWN BARCODE TYPE";
				
			  break;
			}

		// ***** Largeur par défaut
		if( isset( $width ) && ( $width >= 10 ) ) { $hw = $width ; }
		else { $hw = 10 ; }

		// ***** Hauteur par défaut
		if( isset( $height ) && ( $height > 0 ) ) { $hh = $height ; } 
		else { $hh = 10 ; }

		// ***** Autres valeurs par défaut
		if( isset( $readable ) && ( $readable == "Y" ) ) { $hr = "Y" ; }
		else{ $hr = "N" ; }
		if( !isset( $showtype ) ) { $showtype = "N" ; }

		// ***** Création de l'objet
		$objCode = new pi_barcode( $type, $code, $hh, $hr, $hw, $showtype ) ;
		$objCode -> makeImage() ;
	}
}
?>


Puis je l'appelle au moment ou je désire le mettre dans le pdf:
/*choix d'afficher ou non les chiffres*/
	if(isset($_POST['chiffre'])){
		$pdf->genCode('EAN',$codebarre12, $hcode, 'Y', '', '');
	}else{
		$pdf->genCode('EAN',$codebarre12, $hcode, '', '', '');
	}
					
	/*on insère l'image dans le pdf*/
	$file="codebarre.png";
	$x=$pdf->setX(30);
	$y=$pdf->getY();
	$pdf->SetFillColor(255,187,255);				$pdf->Cell(100,$hcode+10,"codebarre",1,0,'C',$pdf->Image($file,$x,$y,0,$hcode,'PNG'));


De plus il à donc fallu modifie la méthode makeImage dans la classe pi_barcode comme suit:
//Header( "Content-type: image/png"); 
/*il affiche l'image
imagepng($img);*/
//il enregistre l'image
imagepng($img,"codebarre.png"); 
//il la détruit
imagedestroy($img); 
}//fin méthode makeImage()

Je met le header en commentaire car il pause problème autrement et l'image étant tout de même générer je le trouve alors inutile.

Le problème maintenant est le fait que je n'ai rien qui apparait dans le pdf généré. Puis depuis peu il me fait en plus l'erreur suivante:
Notice: Undefined property: HR in c:\program files\easyphp1-8\www\toutpack\pi_barcode.php on line 469

je ne comprend pas pourquoi elle n'est pas définie alors que cela marchait auparavant.

Sur ce si quelqu'un a une solution à mon problème merci de m'aider, autrement j'espère que cela servira à d'autres dans le même cas que moi.

Messages postés
46
Date d'inscription
mercredi 21 mai 2008
Statut
Membre
Dernière intervention
9 janvier 2009
2
Je commence et termine alors se topic! lol

Donc pour l'erreur HR j'ai mi les paramètre readable à Y, comme cela il affiche toujours le code barre (les chiffres + les lignes).
Pour ce qui est de l'image, j'ai ajouter un paramètre dans makeImage avec le nom du fichier de detination. Comme cela chaque code à un fichier. Or auparavant c'était un fichier commun que je pensait pouvoir utiliser directement en l'insérant dans le pdf. Le problème c'est que le pdf semble être généré à la fin de l'execution de la page lorsqu'on fait le output. Du coup à ce moment la il n'avait plus que la dernière image.

a+
Dans ton code php tu met apret avoir créer ton code fpdf
$pdf->Image("barcode.png", Axe_des_x, Axe_des_y);