User talk:Y scherbak
Автоматизация процесса изготовления этикетки (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)