Автоматизируйте Photoshop для вставки текста из файла - PullRequest
7 голосов
/ 31 марта 2009

У меня многоязычный веб-сайт, и мне нужно автоматизировать процесс обновления текстовых слоев в psd-файлах из csv-источника.

Я знаю, что в psp могут быть сбои из-за изменения ширины, но в любом случае очень помогло бы поместить текст в документы.

Какие у меня варианты?

EDIT:

У Murmelschlurmel есть рабочее решение. Вот ссылка на документацию Adobe.

http://livedocs.adobe.com/en_US/Photoshop/10.0/help.html?content=WSfd1234e1c4b69f30ea53e41001031ab64-740d.html

Формат csv-файла не так хорош: вам нужен столбец для каждой переменной. Я ожидал бы строку для каждой переменной.

Работает с Umlaut (ä, ö и т. Д.)

РЕДАКТИРОВАТЬ 1:

Другое решение - использовать com для автоматизации Photoshop. Это хорошо, если у вас есть несколько шаблонов (кнопок), которые требуют изменения текста. Вот мой скрипт на python, который может дать вам старт.

Вам нужен файл Excel со столбцами: TemplateFileName, TargetFileName, TargetFormat, Text (т.е. template.psd, button1, gif, NiceButton). Первый ряд листа не используется. Шаблон psp должен иметь только 1 текстовый слой и не может иметь группы слоев.

import win32com.client
import xlrd 
spreadsheet = xlrd.open_workbook("text_buttons.xls")
sheet = spreadsheet.sheet_by_index(0)

psApp = win32com.client.Dispatch("Photoshop.Application")  
jpgSaveOptions = win32com.client.Dispatch("Photoshop.JPEGSaveOptions")  
jpgSaveOptions.EmbedColorProfile = True
jpgSaveOptions.FormatOptions = 1
jpgSaveOptions.Matte = 1
jpgSaveOptions.Quality = 1

gifSaveOptions = win32com.client.Dispatch("Photoshop.GIFSaveOptions")



for rowIndex in range(sheet.nrows):
    if(rowIndex > 0):
        template =  sheet.row(rowIndex)[0].value
        targetFile = sheet.row(rowIndex)[1].value
        targetFileFormat = sheet.row(rowIndex)[2].value
        textTranslated = sheet.row(rowIndex)[3].value
        psApp.Open(r"D:\Design\Produktion\%s" % template ) 
        doc = psApp.Application.ActiveDocument

        for layer in doc.Layers:  
            if (layer.Kind == 2):
                layer.TextItem.Contents = textTranslated
                if(targetFileFormat == "gif"):
                    doc.SaveAs(r"D:\Design\Produktion\de\%s" % targetFile, gifSaveOptions,  True, 2)
                if(targetFileFormat == "jpg"):
                    doc.SaveAs(r"D:\Design\Produktion\de\%s" % targetFile, jpgSaveOptions,  True, 2)

Ответы [ 2 ]

22 голосов
/ 21 апреля 2009

Вы можете использовать «Data Driven Design» для этого. В компьютерной науке также существует концепция управляемого данными , но, насколько я понимаю, это не связано с использованием этого слова в Photoshop.

Вот как это сделать:

Загрузите ваше изображение в Photoshop и определите свои переменные с помощью Изображение> Переменная> Определить .

Затем конвертируйте CSV в формат, который может прочитать Photoshop. У меня был лучший опыт работы с текстом с разделителями табуляции .

Наконец загрузите текстовый файл в Photoshop с помощью Изображения> Переменные> Набор данных и позвольте Photoshop сохранить все итерации.

Когда я попробовал это в первый раз, я обнаружил, что в файле справки Photoshop недостаточно подробностей. Я искал в Интернете photoshop "набор данных" и нашел несколько хороших учебных пособий, например, этот от digitaltutors .

1 голос
/ 31 марта 2009

Это может быть немного слишком много, но я использовал сервер Adobe AlterCast / Grphics для решения точно такой же проблемы.

Также, если это просто текстовое изображение в формате GIF / JPG, вы можете использовать Python + PIL (Python Imaging Library). Вот пример кода (работает в ОС Windows с установленными шрифтами Arial и Osaka.)

#!/usr/bin/python
# -*- coding: utf-8 -*-
import ImageFont, ImageDraw, Image
#font = ImageFont.truetype("/usr/share/fonts/bitstream-vera/Vera.ttf", 24)
#font = ImageFont.truetype("futuratm.ttf", 18)
font = ImageFont.truetype("arial.ttf", 18)
im = Image.new("RGB", (365,20), "#fff")
draw = ImageDraw.Draw(im)
draw.text((0, 0), "Test Images", font=font, fill="#000")
im.save("TestImg_EN.gif", "GIF")


font = ImageFont.truetype("osaka.ttf", 18)
im = Image.new("RGB", (365,20), "#fff")
draw = ImageDraw.Draw(im)
draw.text((0, 0), u"テストイメージ", font=font, fill="#000")
im.save("TestImg_JP.gif", "GIF")
...