User talk:Y scherbak

From Inkscape Wiki
Jump to navigation Jump to search

Автоматизация процесса изготовления этикетки (inkscape + php + bat)

Возникла задача создать этикетки для 134 типоразмеров изделий. Все этикетки изготавливались по шаблону. Захотелось упростить на будущее повтор процедуры и внесение изменений, а так же избежать механических ошибок. Посему было решено использовать скрипт, который на основе шаблона оформления и базы данных с вариантами надписей сгенерирует векторные файлы, а из них eps. Быстрее всего я пишу на PHP, потому скрипт на этом языке. О настройку и утановке PHP в заметке я писать не буду, так как об этом в сети полно материала.

Данные решено было положить в csv, а в шаблоне оформления (template.svg) вместо текста написать специальные метки, которые потом будет заменять скрипт. Метки вида: #name, #d1.

Inkscape умеет работать с командной строкой, в частности, экспортировать файлы:

EPS:
inkscape -f file.svg -E file.eps
PDF:
inkscape -f file.svg -A file.pdf
PNG:
inkscape -f file.svg -e file.png

Значит, можно сгенерировать bat-фал, который преобразует необходимое число векторных файлов в eps, например.

Создаем файл template.svg с метками #name, #d1, #d2, #pn

Создаем файл eticetca.csv с полями name, d1, d2, pn:

...
"11с31п",15,15,40
"11с31п",20,20,40
"11с31п",25,20,40
"11с31п",32,25,40
"11с31п",40,32,40
"11с31п",50,40,40
...

помещаем эти файлы в директорию на веб-сервере

в этой же директории создаем папки svg/ и eps/ для хранения результатов.

в эту же директорию, где лежат template.svg, eticetca.csv помещаем файл index.php:

<?php
	/*
	*	script for automatic lables generation from svg template to eps
	*	version 1.0
	*	date 2010-12-23
	*	author Yuriu "zip" Scherbak
	*	email webdesigner@meta.ua
	*	
	*	inkscape > 0.47 required
	*	php > 5.1 required
	*	
	*/

	// export command is:
	//inkscape.exe -E c:\eps\1.eps c:\svg\113115015025.svg 
	
	header("Content-Type: text/html; charset=utf-8");

	/*
	*  configuration section
	*/
	//path to inkscape binary
	$inkscape_path = "C:\\Program Files\\Inkscape\\inkscape.exe";
	//variable name for msw batch file
	$inkscape_var = "%INKSCAPE%";
	// path to script dir
	$script_path = "C:\\Program Files\\Apache Software Foundation\\Apache2.2\\htdocs\\lable\\";
	//csv filename
	$csv_filename = "eticetca.csv";
	//1st csv-field
	$name = "#name";
	//2nd csv-field
	$d1 = "#d1";
	//3d csv-field
	$d2 = "#d2";
	//4s csv-field
	$pn = "#pn";
	//svg template (must contain lables #name, #d1 etc which you wont to replace)
	$svg_template = "template.svg";
	//msw bat file name
	$batch_filename = "svg2eps.bat";
	//msw bat headers and vars declaration
	$batch_headers = "@echo on\n" . "set INKSCAPE=" . "\"" . $inkscape_path . "\"" . "\n\n";
	
	$svgdir = "svg";
	$epsdir = "eps";
	
	// loading svg-template to str $svg_contents
  $svg_handle = fopen($svg_template, "r");
  $svg_contents = fread($svg_handle, filesize($svg_template));
  fclose($svg_handle); 
	
	// prepare bat file to generate
	if(file_exists($batch_filename))
	{
		unlink($batch_filename);
	}
	$batch_handle = fopen($batch_filename, "w+");
	
	// writting batch headers
	if (fwrite($batch_handle, $batch_headers) === false)
	{
		echo "Cannot write to $batch_filename file. <br />\n";          
  }
	
	
	if($csv_handler = fopen($csv_filename, "r"))
	{
		print("<p>");
		while(!feof($csv_handler))
		{
			//parsing svg template and making array
			$myField = fgetcsv($csv_handler, 1024);
			$fieldCount = count($myField);
			
			// making pathes
			$file_to = eregi_replace("(с|п)","",$myField[0]) . $myField[1] . $myField[2] . $myField[3];
			$file_svg_to = $file_to . ".svg";
			$file_eps_to = $file_to . ".eps";
			$path_svg_to = $svgdir . "/" . $file_svg_to;
			
			// replacing textlables from tempalte
			$new_text =(str_replace($name,$myField[0],$svg_contents));
			$new_text =(str_replace($d1,$myField[1],$new_text));
			$new_text =(str_replace($d2,$myField[2],$new_text));
			$new_text =(str_replace($pn,$myField[3],$new_text));
			print ($file_svg_to);
			print("<br>");
			print ($file_eps_to);
			print("<br>");
			
			//writting new-generated svg
			$handle = fopen($path_svg_to, "w+");
			$writestring = $new_text;
			if (fwrite($handle, $writestring) === false)
			{
        echo "Cannot write to $path_svg_to file. <br />";          
      }
			fclose($handle);
			
			// writting data to batch
			$batch_string = $inkscape_var . " -E " . "\"" .
                                        $script_path . $epsdir . "\\"  . 
                                        $file_eps_to . "\"" . " " . "\"" . 
                                        $script_path . $svgdir . "\\"  . 
                                        $file_svg_to . "\"" . "\n";
			if (fwrite($batch_handle, $batch_string) === false)
			{
        echo "Cannot write to $batch_filename file. <br />";          
      }			
		}
		
		fclose($csv_handler);
		fclose($batch_handle);
		print("</p>");
		
		unlink($svgdir . "/" . ".svg");
	} else {
		print ("runtime error");
	}

?>

запускаем скрипт в броузере и получаем в той же директории файл svg2eps.bat, а в директории svg 134 этикетки (на это ушло 15-20 секунд)

запускаем svg2eps.bat и через 1-2 минуты молучаем 134 этикетки, готовых к печати. --Y scherbak 11:53, 23 December 2010 (UTC)