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)