Д о б р о   п о ж а л о в а т ь   н а   W e b - с е р в е р   ж у р н а л а   М и р   Э т и к е т к и
Архив изданий
2001
Январь
Февраль
Март
Апрель
Май
Июнь
Июль
Август
Сентябрь
Октябрь
Ноябрь
Декабрь
2002
Январь
Февраль
Март
Апрель
Май
Июнь
Июль
Август
Сентябрь
Октябрь
Ноябрь
Декабрь
2003
Январь
Февраль
Март
Апрель
Май
Июнь
Июль
Август
Сентябрь
Октябрь
Ноябрь
Декабрь
 
2004
Январь
Февраль
Март
Апрель
Май
Июнь
Июль
Август
Сентябрь
Октябрь
Ноябрь
Декабрь
2005
Январь
Февраль
Март
Апрель
Май
Июнь
Июль
Август
Сентябрь
Октябрь
Ноябрь
Декабрь
2006
Январь
Февраль
Март
Апрель
Май
Июнь
Июль
Август
Сентябрь
Октябрь
Ноябрь
Декабрь
 
2007
Январь
Февраль
Март
Апрель
Май
Июнь
Июль
Август
Сентябрь
Октябрь
Ноябрь
Декабрь
2008
Январь
Февраль
Март
Апрель
Май
Июнь
Июль
Август
Сентябрь
Октябрь
Ноябрь
Декабрь
2009
Январь
Февраль
Март
Апрель
Май
Июнь
Июль
Август
Сентябрь
Октябрь
Ноябрь
Декабрь
 
2010
Январь
Февраль
Март
Апрель
Май
Июнь
Июль
Август
Сентябрь
Октябрь
Ноябрь
Декабрь
2011
Январь
Февраль
Март
Апрель
Май
Июнь
Июль
Август
Сентябрь
Октябрь
Ноябрь
Декабрь
2012
Январь
Февраль
Март
Апрель
Май
Июнь
Июль
Август
Сентябрь
Октябрь
Ноябрь
Декабрь
 

Мир этикетки №10'2007
Мир этикетки №10'2007
Разделы
О нас
Журнал
Реклама
Архив изданий
Архив изданий
Поиск в архиве изданий


.

Щебень высокого качества http://torf-grunt.com/kupit-sheben .

 

Автоматизация верстки этикеток

Сергей Адамов, компания «МастерПолиграф» (asergu@ya.ru)

База в Microsoft Excel

Как реализован алгоритм в CorelDRAW

 

При допечатной подготовке этикеток часто приходится иметь дело с повторяющимися макетами, содержащими разную информацию. Например, когда заказчик выпускает одежду разных наименований из различного по составу сырья, на печатном листе располагаются одинаковые или близкие по оформлению этикетки с разными текстовыми элементами. Основная сложность допечатной подготовки в этом случае — отслеживание и вычитка текста. Если наименований этикеток более 50, правильность набора отследить совсем не просто. Особенно это сложно при повторных заказах, когда нужно перетасовать этикетки в совершенно ином составе. В таких случаях целесообразно создать базу данных на все наименования продукции, которая содержала бы всю необходимую информацию. Сложность практической реализации такого решения — в отсутствии стандартных средств, тем более что этикетки могут существенно различаться как по тексту, так и наличием тех или иных графических элементов, привязанных к названию.

Одно из возможных решений проблемы — использование средств программирования в графическом пакете CorelDRAW. Это не самая лучшая программа для верстки, но с помощью соответствующих алгоритмов можно заставить ее делать спуски полос нужных нам наименований этикеток прямо из базы данных. При таком подходе решается проблема вычитки макетов и повторной печати, а также исключаются ошибки на этапе верстки.

 

Рис. 1

Рис. 1

 

Традиционный процесс приемки и обработки заказа в небольших типографиях включает следующие этапы (рис. 1):

  • заказчик предоставляет распечатки или образцы необходимых ему этикеток;
  • дизайнер-верстальщик набирает текст и верстает макеты;
  • корректор сравнивает сделанные дизайнером-верстальщиком макеты этикетки с образцами заказчика.

Если заказчик приносит готовую верстку этикеток в виде файлов, то это обычно только затрудняет допечатную подготовку, поскольку такие файлы все равно приходится переделывать под требования печатного процесса, после чего отдавать корректору на проверку. При этом часто возникают ошибки.

Написание макроса для CorelDRAW требует довольно больших первоначальных временных затрат, но позволяет значительно сэкономить на времени подготовки повторных заказов. При этом база данных в Microsoft Excel заполняется принимающим заказ менеджером или, что еще лучше, самим заказчиком. При больших объемах заказов заказчик сам, как правило, рад привести наименования на этикетках в удобочитаемый вид. Набранные данные проверяются корректором. При выполнении повторного заказа можно обойтись и без корректуры, взяв из базы ранее проверенную информацию. Целесообразно автоматизировать верстку, поскольку, если использовать базу данных и верстать вручную, ошибок все равно не избежать. Каждому спуску можно присвоить свой номер. Это поможет в дальнейшем при печати и поиске нужных печатных форм. Схема технологического процесса представлена на рис. 2.

 

Рис. 2

 

До внедрения описанной технологии на подготовку спусков 70 разных этикеток в нашей типографии тратилось 4-7 дней. Теперь такие спуски полос изготавливаются в течение 4-5 часов.

Рассмотрим конкретные шаги по автоматизации процесса. Итак, у нас имеется макет этикетки форматом 70 х 96 мм. Он может содержать следующую переменную информацию:

  • название;
  • артикул;
  • защитные свойства;
  • состав;
  • рост;
  • размер;
  • сорт;
  • ГОСТ;
  • РСТ (разные индексы или добровольная сертификация).

Оптимальное расположение этикетки на печатном листе 350 х 500 мм показано на рис. 3.

 

Рис. 3

База в Microsoft Excel

Создаем базу данных в Excel. Состоять она будет из трех листов. На первом из них (рис. 4) помещается собственно база, в которой принято следующее расположение данных:

  • первый столбец — артикул этикетки;
  • второй — наименование;
  • третий — текст;
  • четвертый — ГОСТ;
  • пятый — РСТ или ДС для добровольной сертификации.

На втором листе (рис. 5) находится список этикеток, попадающих на спуск из 24 штук. Уникальное имя для каждой этикетке соответствует данным поля «Артикул», которое становится идентификатором этикетки.

 

Рис. 4

 

Рис. 5

 

Третий лист (имя листа — Nonse) создается макросом на основе данных с первого и второго листов. Информация на втором листе используется для формирования на третьем листе текстового файла, который далее применяется для подстановки в программу CorelDRAW.

Следует обратить внимание на переносы слов внутри ячейки. Как сделан перенос — так он и будет воспроизведен в CorelDRAW. Ни в коем случае нельзя добиваться переноса слов вбиванием дополнительных пробелов, как это любят делать многие менеджеры. Перенос слова на следующую строку внутри одной ячейки следует делать, нажимая комбинацию клавиш Alt+Enter. В противном случае все, что находится внутри ячейки, на спуске получится одной длинной строкой. В файле на рис. 5 подобные переносы обозначены квадратиком — такова стандартная функция Excel.

Менеджер формирует список на спуск, заполняя первый столбец второго листа (светло-зеленое поле слева). Для указанных там артикулов в остальных столбцах прописаны соответствующие данные. Если какой-то артикул не существует в базе, то на его строчке будет помещено: #Н/Д. В этом случае необходимо уточнить данные у заказчика. Таким образом, менеджер сразу видит наименования, которых нет в базе.

После того как сформирован список данных для этикеток, создаем макрос:

 

Sub Formi()

a = 3

b = 2

Worksheets(“nonse”).Range(“a:a”).Clear ‘ очистка первого столбца

Worksheets(“nonse”).Cells(1, 1) = Worksheets(“Лист2”).Cells(1, 1)

While Worksheets(“Лист2”).Cells(a, 1) <> “”

Worksheets(“nonse”).Cells(b, 1) = “-----”

Worksheets(“nonse”).Cells(b + 1, 1) = Worksheets(“Лист2”).Cells(a, 2).Value

Worksheets(“nonse”).Cells(b + 2, 1) = “-----”

Worksheets(“nonse”).Cells(b + 3, 1) = Worksheets(“Лист2”).Cells(a, 3).Value

Worksheets(“nonse”).Cells(b + 4, 1) = “-----”

Worksheets(“nonse”).Cells(b + 5, 1) = Worksheets(“Лист2”).Cells(a, 4).Value

Worksheets(“nonse”).Cells(b + 6, 1) = “-----”

Worksheets(“nonse”).Cells(b + 7, 1) = Worksheets(“Лист2”).Cells(a, 5).Value

b = b + 10

a = a + 1

Wend

End Sub

 

Для написания макроса следует выбрать пункт меню Сервис->Макрос->Редактор Visual Basic (рис. 6) или нажать комбинацию клавиш Alt+F11. После этого выбираем в окне VBAProject (nones.xls) лист 1 и в пустом правом окне набираем текст макроса. Для его запуска следует нажать комбинацию клавиш Alt+F8 и выбрать из списка макрос Formi.

 

Рис. 6

 

Макрос копирует данные из 2-го листа с нужных позиций в лист Nonse. Копирование происходит до тех пор, пока в первом столбце второго листа не появится пустая клетка (задается командой While Worksheets(“Лист2”).Cells(a, 1) <> “” ). Строка, с которой начинается копирование, задана переменной a.

Макрос формирует текстовый файл, подготовленный для изготовления спуска в CorelDRAW. Такой текстовый файл выглядит следующим образом:

 

#5500_1_1053 10.05.07 АДАМОВ

-----

“ЖИЛЕТ СИГНАЛЬНЫЙ ТИП А”

-----

“Артикул: ВАН 311 Защитные свойства: Тн, Ву Состав: 100% хл Рост: Размер: Сорт: 1 Дата выпуска: ОТК:”

-----

ГОСТ 38677-92

-----

СЩ03

-----

“БРЮКИ МУЖСКИЕ РЕЗЕРВ ПАК””

-----

“Артикул: ВАН 311 Защитные свойства: Тн Состав: 100% пэ Рост: Размер: Сорт: 1 Дата выпуска: ОТК:”

-----

ГОСТ 38677-92

 

Разделители “----” нужны для распознавания разделения полей программными средствами CorelDRAW.

В начало В начало

Как реализован алгоритм в CorelDRAW

В CorelDRAW вначале необходимо нарисовать шаблон этикетки, учитывая все возможные изменения информации. В нашем случае меняются текст и знак сертификации (рис. 7).

 

Рис. 7

 

Рис. 8

 

Макрос будет копировать нарисованную нами этикетку, поэтому придется рисовать все ее возможные варианты (рис. 8). Обратите внимание, что в нижнем правом углу знак РСТ помещен в двух исполнениях, наложенных друг на друга. Это не ошибка, так как необходимо было расположить его именно там, где он будет в готовой этикетке. В зависимости от того, что прописано в базе данных, будет выбираться тот или иной вариант.

Кроме этикетки, на печатном листе расположены метки реза и краскосъемы. Чтобы различать эти и другие графические объекты, входящие в состав макета, присвоим им оригинальные имена. Зелеными стрелками на рис. 8 обозначены изменяемые объекты, оранжевыми — постоянные (неизменяемые).

Группа знаков РСТ названа следующим образом:

  • DSnorm — чистый знак РСТ, индекс к нему имеет имя rst;
  • DS — знак добровольной сертификации.

Для дополнительного удобства верстки этикетка расположена на слое Layer1, а все остальные элементы: метки реза, краскосъемы — на отдельном, заблокированном слое Layshablon.

Обратите внимание на расположение этикеток на рис. 4: часть из них придется поворачивать на 90°, что несколько усложнит программирование.

Макрос работает следующим образом:

  • копирует все объекты с именами sh1, sh2, sh3, sh4 (и далее, если будет другой шаблон) на текущее место в верстке;
  • выбирает нужный знак РСТ и его индекс;
  • вставляет в объекты необходимый текст tx1, tx2;
  • если текст слишком длинный и не помещается, уменьшает размеры букв;
  • повторяет это 10 раз, далее еще 14 раз, но уже с поворотом этикетки на 90°.

Макрос набивается таким же образом, как и в Excel, приемы программирования — те же, язык — Visual Basic. Основное отличие — адаптация Basic в CorelDRAW к графической среде: в нем много специализированных объектов и библиотек для рисования и изменения нарисованного, однако принципы работы те же самые.

 

Рис. 9

 

Рис. 10

Рис. 10

 

Редактор макросов вызывается по нажатию комбинации клавиш Alt+F11 (рис. 9). В редакторе Microsoft Visual Basic выбираем проект с текущим именем файла, где нарисована этикетка (в нашем случае это #5500-II_Shablon ). В подпапке Modules создаем нужные макросы.

Описание необходимых модулей:

  • макрос newEt(x, y, num, rotate As Long, t1, t2, t3, t4 As String) копирует заданную в шаблоне этикетку по координатам x, y и, если значение rotate больше 0, то поворачивает этикетку на 90°.
  • переменная num нужна, чтобы нумеровать создаваемые объекты для исключения путаницы (t1, t2, t3, t4 — тексты внутри этикетки);
  • Stay() — основной макрос, который выполняет верстку;
  • UserForm1 — диалог для задания путей файла данных (создается во вкладке Forms).

Все макросы написаны для CorelDRAW версии 13.0.0.667. Ниже приведены тексты с небольшими комментариями. Для работы макроса Stay() нужен заготовленный блок данных, который формируется в Excel.

 

Sub newEt(x, y, num, rotate As Long, t1, t2, t3, t4 As String)

ActiveDocument.Unit = cdrMillimeter ‘ единица измерений — мм

 

Dim s1 As Shape, nm As String

Dim ttx As TextFrame

Const deltaX = 2.258, deltaY = 93.893

‘ смещение для поворотной этикетки

 

Set s1 = ActiveLayer.Shapes(“tx1”).Duplicate(x, y)

s1.RotationCenterX = x

s1.RotationCenterY = y

If rotate > 0 Then

s1.rotate (90)

s1.Move deltaX, deltaY

End If

s1.Text.Story.Text = t1

s1.OrderToFront

s1.ObjectData(“Name”).Value = “Tx1_” & num

 

‘ проверяем длину, если длиннее 25 символов, уменьшается размер шрифта

If Len(t1) > 25 Then

s1.Text.Story.Size = 10

End If

If Len(t1) > 28 Then

s1.Text.Story.Size = 9

s1.Text.ConvertToArtistic

End If

 

Set s1 = ActiveLayer.Shapes(“tx2”).Duplicate(x, y)

s1.RotationCenterX = x ‘ задается центр поворота

 

s1.RotationCenterY = y

If rotate > 0 Then

s1.rotate (90)

s1.Move deltaX, deltaY

End If

s1.Text.Story.Text = t2

s1.OrderToFront

s1.ObjectData(“Name”).Value = “Tx2_” & num

‘ проверяем длину, если длиннее 24 символов, уменьшается размер шрифта

If Len(t2) > 24 Then

s1.Text.Story.Size = 10

End If

If Len(t2) > 26 Then

s1.Text.Story.Size = 9

End If

 

Set s1 = ActiveLayer.Shapes(“gost”).Duplicate(x, y)

s1.RotationCenterX = x

s1.RotationCenterY = y

If rotate > 0 Then

 

s1.rotate (90)

s1.Move deltaX, deltaY

End If

s1.Text.Story.Text = t3

s1.OrderToFront

s1.ObjectData(“Name”).Value = “Gost_” & num

‘ если две строки, то смещаем вверх на 3 мм

If InStr(t3, Chr(13)) <> 0 Then

s1.PositionY = s1.PositionY + 3

Else

‘ проверяем длину, если длиннее 19 символов, уменьшается размер шрифта

If Len(t3) > 19 Then

s1.Text.Story.Size = 8

End If

If Len(t3) > 25 Then

s1.Text.Story.Size = 6.7

 

End If

s1.Text.ConvertToArtistic

End If

 

‘ копирование повторяющихся четырех элементов с названиями

‘ shN, где N — номер объекта

For a = 1 To 4

nm = “sh” & a

Set s1 = ActiveLayer.Shapes(nm).Duplicate(x, y)

s1.RotationCenterX = x

s1.RotationCenterY = y

If rotate > 0 Then

s1.rotate (90)

s1.Move deltaX, deltaY

End If

 

s1.ObjectData(“Name”).Value = nm & “_” & num

Next a

 

‘если текст для РСТ менее 2 символов, значит добровольная

If Len(t4) <= 2 Then

Set s1 = ActiveLayer.Shapes(“DS”).Duplicate(x, y)

s1.RotationCenterX = x

s1.RotationCenterY = y

If rotate > 0 Then

s1.rotate (90)

s1.Move deltaX, deltaY

End If

 

s1.ObjectData(“Name”).Value = “DS_” & num

Else

Set s1 = ActiveLayer.Shapes(“DSnorm”).Duplicate(x, y)

s1.RotationCenterX = x

s1.RotationCenterY = y

If rotate > 0 Then

s1.rotate (90)

s1.Move deltaX, deltaY

End If

 

s1.ObjectData(“Name”).Value = “DSnorm_” & num

Set s1 = ActiveLayer.Shapes(“rst”).Duplicate(x, y)

s1.ObjectData(“Name”).Value = “rst_” & num

s1.RotationCenterX = x

s1.RotationCenterY = y

If rotate > 0 Then

s1.rotate (90)

s1.Move deltaX, deltaY

End If

 

s1.Text.Story.Text = t4

 

End If

End Sub

 

Sub stay()

Dim fs, stt

Dim zg, te1, te2, te3 As String

Dim nEt As Long

Dim xc(24), yc(24), rt(24) As Long

Const shagX = 68, shagY = 94, maxX = shagX * 3, maxY = shagY * 5 + shagY

Const smX = 93.893, smY = 0 ‘ смещение от нулевой точки

Const klw = 0 ‘ с какой этикетки начинать поворот

‘ формирование координат в массиве

 

For a = 1 To 5

xc(a) = 0

yc(a) = (a - 1) * shagY

xc(a + 5) = shagX

yc(a + 5) = (a - 1) * shagY

rt(a) = 0

rt(a + 5) = 0

Next a

For a = 11 To 17

xc(a) = 140

yc(a) = (a - 11) * shagX - 6

xc(a + 7) = 140 + shagY

yc(a + 7) = (a - 11) * shagX - 6

rt(a) = 1

rt(a + 7) = 1

Next a

 

‘ запрос — откуда брать исходные файлы данных

 

UserForm1.Show

Set fs = CreateObject(“Scripting.FileSystemObject”)

Set a = fs.openTextFile(UserForm1.Label2.Caption, 1)

xx = shagX

yy = shagY

nEt = 1

stt = a.readline ‘ считываем первую строку

 

Set s1 = ActiveLayer.Shapes(“nadpis”)

s1.Text.Story.Text = stt

stt = a.readline ‘ пропускаем первый “----”

 

While Not a.atendofstream

zg = “”

stt = a.readline

While InStr(stt, “--”) = 0

If InStr(stt, “--”) = 0 Then

If zg <> “” Then zg = zg & Chr(13)

zg = zg & stt

End If

stt = a.readline

Wend

stt = a.readline

 

‘ текст 1

te1 = “”

While InStr(stt, “--”) = 0

If InStr(stt, “--”) = 0 Then

If te1 <> “” Then te1 = te1 & Chr(13)

te1 = te1 & stt

End If

stt = a.readline

Wend

 

‘ текст 2 ГОСТ

te2 = “”

stt = a.readline

While InStr(stt, “--”) = 0

If InStr(stt, “--”) = 0 Then

If te2 <> “” Then te2 = te2 & Chr(13)

te2 = te2 & stt

End If

stt = a.readline

Wend

te3 = a.readline

While InStr(stt, “--”) = 0 And Not a.atendofstream

stt = a.readline

Wend

 

Call newEt(xc(nEt) + smX, yc(nEt) + smY, nEt, rt(nEt), zg, te1, te2, te3)

nEt = nEt + 1

If Not a.atendofstream Then stt = a.readline

While InStr(stt, “--”) = 0 And Not a.atendofstream

stt = a.readline

Wend

Wend

 

a.Close

‘fi = openfile()

‘readln

‘closefile

End Sub

 

Данный набор макросов ни в коей мере не претендует на роль идеального средства для решения указанной проблемы. Наверняка в нем можно что-то упростить и ускорить. Автор с удовольствием рассмотрит замечания, а также готов помочь в автоматизации вашей верстки.

В начало В начало

Мир Этикетки 10'2007