PhotoShop也可以轻松些
脚本编写(JavaScript)
现在把主要的工作分成: 擦除需要修改的区域和填写对应的文本到擦除区域, 于是写了这两个这样的函数// 当前选中的文档var doc = app.activeDocument;// 白色var white = new SolidColor();white.rgb.red = 255;white.rgb.green = 255;white.rgb.blue = 255;// 文本颜色var textColor = new SolidColor();textColor.rgb.red = 47;textColor.rgb.green = 48;textColor.rgb.blue = 48;// 擦除某个区域var erase = function(pos){ doc.selection.select(pos); //选择文档的某个区, 分别为左上, 右上, 右下, 左下四个点的(x, y)坐标 doc.selection.fill(white); //填充为白色 doc.selection.deselect(); //取消选择}// 填充文本var text = function(pos, font, color, size, contents){ var eraseLayer = doc.artLayers.add(); // 添加图层 eraseLayer.kind = LayerKind.TEXT; // 设置图层为文本类型 var textItem = eraseLayer.textItem; textItem.font = font; // 字体, 如 "SimSun"(宋体) textItem.color = color; textItem.size = size; // 字体大小(points) textItem.contents = contents; // 文本内容 textItem.position = pos; // 文本位置 doc.mergeVisibleLayers(); // 合并文档所有可见的图层}// 假如我们要修改某个区域, 则可以定义一个函数var patchPayDate = function(){ erase(Array(Array(930, 125), Array(1400, 125), Array(1400, 175), Array(930, 175))); text(Array(940, 170), "SimSun", textColor, 11, payDate);}patchPayDate(); 1. 中文支持: 必须设置字体, 否则中文乱码textItem.font="SimSum"
2. 执行下次操作前合并图层doc.mergeVisibleLayers(), 否则不能继续进行。
3. PS中的矩阵区域表示为: Array(Array(930, 125), Array(1400, 125), Array(1400, 175), Array(930, 175))
4. 文本区域和擦除区域不太吻合: 按理擦除区域即为之后的填充区域, 但实际会有像素偏差, 需要调整。
处理Excel为JSON
# 主要代码import sysimport xlrd, jsonimport math, randomfrom xlrd import xldate_as_tupledef openExcel(file="file.xls"): try: return xlrd.open_workbook(file) except Exception, e: print str(e) """ read a sheet of xls to json """ def read2json(file="file.xls", sheetIndex=0, headerIndex=0, startRow=1): excel = openExcel(file); sheet = excel.sheets()[sheetIndex]; nrows = sheet.nrows colnames = sheet.row_values(headerIndex); facets = [] for rownum in range(startRow, nrows): row = sheet.row_values(rownum) if row: facet = {} for i in range(len(colnames)): facet[colnames[i]] = row[i] facets.append(facet) return json.dumps(facets, ensure_ascii=False, indent=2) 1. 日期处理: 读取excel时, 读取日期类型后为浮点数, 需要引入xldate_as_tuple进行处理
# 第二个参数表示起始时间: 0: 1900; 1: 1904# 返回(年, 月, 日, 时, 分, 秒)dateTuple = xldate_as_tuple(date, 0);year = dateTuple[0]month = dateTuple[1] 2. 默认Python使用Ascii进行IO解码, 需要运行时设置
reload(sys)sys.setdefaultencoding('utf-8') 3. json dump时, 会将中文编码为Ascii, 也需要设置参数json.dumps(facets, ensure_ascii=False, indent=2)
完善JavaScript脚本
// excel数据var bills = [{ "payNo": "14009052048", "businessCategory": "...", "clerkNo": "00023", "payerBank": "...", "payDate": "2014年09月09日", "tradeCode": "52110", "payNote": "...", "printDate": "2014年02月05日", "payAmount1": "壹万壹仟伍佰贰拾元", "payAmount2": "11,520.00元", "printCode": "4N1HTDSPVX2", "payerNo": "...", "payerName": "..."},...];var doc = app.activeDocument;// 修复类var Patch = function(){ var that = {}; var white = new SolidColor(); white.rgb.red = 255; white.rgb.green = 255; white.rgb.blue = 255; var textColor = new SolidColor(); textColor.rgb.red = 47; textColor.rgb.green = 48; textColor.rgb.blue = 48; var erase = function(pos){ doc.selection.select(pos); doc.selection.fill(white); doc.selection.deselect(); } var text = function(pos, font, color, size, contents){ var eraseLayer = doc.artLayers.add(); eraseLayer.kind = LayerKind.TEXT; var textItem = eraseLayer.textItem; textItem.font = font; textItem.color = color; textItem.size = size; textItem.contents = contents; textItem.position = pos; doc.mergeVisibleLayers(); } // 修复日期 var patchPayDate = function(payDate){ erase(Array(Array(930, 125), Array(1400, 125), Array(1400, 175), Array(930, 175))); text(Array(940, 170), "SimSun", textColor, 11, payDate); } // ...其他修复功能 var patch = function(b){ if (!b) return; if (b.payDate) patchPayDate(b.payDate); // ...其他修复操作 } that.patch = patch; return that;}();// 图片保存var Saver = function(){ var that = {}; // 图片质量 var jpegOptions = new JPEGSaveOptions(); jpegOptions.quality = 8; var saveAs = function(path){ doc.saveAs(new File(path), jpegOptions); } that.saveAs = saveAs; return that;}();// gofor (var i = 0; i<bills.length; i++){ Patch.patch(bills[i]); Saver.saveAs("~/temp/" + bills[i].payerName + ".jpg");} 脚本执行
打开PhotoShop及其对应的图片文档, 选择执行的脚本即可
这样基本不需要操作就能完成PS了, 具体可参考文档