Автоматизация верстки этикетокКак реализован алгоритм в CorelDRAW
При допечатной подготовке этикеток часто приходится иметь дело с повторяющимися макетами, содержащими разную информацию. Например, когда заказчик выпускает одежду разных наименований из различного по составу сырья, на печатном листе располагаются одинаковые или близкие по оформлению этикетки с разными текстовыми элементами. Основная сложность допечатной подготовки в этом случае — отслеживание и вычитка текста. Если наименований этикеток более 50, правильность набора отследить совсем не просто. Особенно это сложно при повторных заказах, когда нужно перетасовать этикетки в совершенно ином составе. В таких случаях целесообразно создать базу данных на все наименования продукции, которая содержала бы всю необходимую информацию. Сложность практической реализации такого решения — в отсутствии стандартных средств, тем более что этикетки могут существенно различаться как по тексту, так и наличием тех или иных графических элементов, привязанных к названию. Одно из возможных решений проблемы — использование средств программирования в графическом пакете CorelDRAW. Это не самая лучшая программа для верстки, но с помощью соответствующих алгоритмов можно заставить ее делать спуски полос нужных нам наименований этикеток прямо из базы данных. При таком подходе решается проблема вычитки макетов и повторной печати, а также исключаются ошибки на этапе верстки.
Рис. 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 обозначены изменяемые объекты, оранжевыми — постоянные (неизменяемые). Группа знаков РСТ названа следующим образом:
Для дополнительного удобства верстки этикетка расположена на слое Layer1, а все остальные элементы: метки реза, краскосъемы — на отдельном, заблокированном слое Layshablon. Обратите внимание на расположение этикеток на рис. 4: часть из них придется поворачивать на 90°, что несколько усложнит программирование. Макрос работает следующим образом:
Макрос набивается таким же образом, как и в Excel, приемы программирования — те же, язык — Visual Basic. Основное отличие — адаптация Basic в CorelDRAW к графической среде: в нем много специализированных объектов и библиотек для рисования и изменения нарисованного, однако принципы работы те же самые.
Рис. 9
Рис. 10
Редактор макросов вызывается по нажатию комбинации клавиш Alt+F11 (рис. 9). В редакторе Microsoft Visual Basic выбираем проект с текущим именем файла, где нарисована этикетка (в нашем случае это #5500-II_Shablon ). В подпапке Modules создаем нужные макросы. Описание необходимых модулей:
Все макросы написаны для 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
Данный набор макросов ни в коей мере не претендует на роль идеального средства для решения указанной проблемы. Наверняка в нем можно что-то упростить и ускорить. Автор с удовольствием рассмотрит замечания, а также готов помочь в автоматизации вашей верстки. |