IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> python2.7开发photoshop一些经验 -> 正文阅读

[Python知识库]python2.7开发photoshop一些经验

python2.7开发photoshop一些经验

  • 开发背景

原因:由于项目汇交的时候许多的成果需要转为pdf、tiff等,而且有严格的分辨率、压缩格式的要求,还要保证清晰度,因此许多的转换软件无法做到photoshop的效果,故而采用photoshop自动化输出。之前利用javascript开发photoshop,效果还不错,但是不能有创建文件夹,node.js也没能在photoshp中利用起来,折腾很久,最终放弃。

  • 注意事项

开发环境:python2.7 + comtypes+photoshop2020+ PyCharm
注意:comtypes包安装及代码中使用到的包正确安装;photoshop也要正确安装。

  • 案例

例子:

# -*- coding:utf-8 -*-
# @Time    : 2022/5/7 15:50
# @Author  : xys
# @Email   : 1815222521@qq.com
# @File    : PhotoShop.py
# @Software: PyCharm
# @Version : 1.0
import os
import sys
import shutil
import xlrd as xd
from ctypes import windll
import gc

reload(sys)

sys.setdefaultencoding('utf8')

from comtypes.client import CreateObject


class NJHelper:

    def __init__(self):
        self.jpgToTiff = CreateObject("Photoshop.Application")
    # 图片转Tiff
    def jpg_to_tiff(self, folder):
        pdfCreate = None
        try:
            listAllFile = []
            for root, dirs, files in os.walk(folder, topdown=False):
                for name in files:
                    if name.endswith(".jpg"):
                        print(os.path.join(root, name))
                        listAllFile.append(os.path.join(root, name))
            for pptfile in listAllFile:
                pdfPath = os.path.splitext(pptfile)[0]
                if pdfPath[-3:] != 'tiff':
                    pdfPath = pdfPath + ".tiff"
                tiffSaveOptions = CreateObject("Photoshop.TiffSaveOptions")
                tiffSaveOptions.embedColorProfile = True
                tiffSaveOptions.alphaChannels = True
                tiffSaveOptions.layers = True
                tiffSaveOptions.imageCompression = 2
                tiffSaveOptions.layerCompression = 1
                pdfCreate = self.jpgToTiff.Open(pptfile)
                pdfCreate.SaveAs(pdfPath, tiffSaveOptions)
                pdfCreate.Close()
                print ("seccess")
        except:
            print ("error")
            pdfCreate.Close()

    # 图片转Tiff
    def jpgtotiff(self, listAllFile, savepath):
        pdfCreate = None
        try:
            flg = 0
            for pptfile in listAllFile:
                flg += 1
                pdfPath = savepath + "_" + str(flg).zfill(2) + ".tiff"

                tiffSaveOptions = CreateObject("Photoshop.TiffSaveOptions")

                tiffSaveOptions.embedColorProfile = True

                tiffSaveOptions.alphaChannels = True

                tiffSaveOptions.layers = True

                tiffSaveOptions.imageCompression = 2

                tiffSaveOptions.layerCompression = 1

                pdfCreate = self.jpgToTiff.Open(pptfile)

                pdfCreate.SaveAs(pdfPath, tiffSaveOptions)

                pdfCreate.Close()
                seccess = u"jpg转tiff:" + pdfPath + u"成功!"
                print (seccess)
        except:
            err = u"jpg转tiff:" + pdfPath + u"失败!"
            print (err)
            pdfCreate.Close()

    # 输入需要合并Tiff文件进行合并
    def addAllTiff(self, listAllFile, SavePath):
        newDoc = None
        try:
            # 合并图片的最大宽度作为合并文档的宽度
            maxWidth = 0
            # 合并图片的高度和作为合并文档的高度
            totalHeight = 0
            # 遍历文件夹下所有的文件
            for pptfile in listAllFile:
                # filepath = os.path.join(folderPath, pptfile)
                doc = self.jpgToTiff.Open(pptfile)
                totalHeight += doc.height
                if doc.width > maxWidth:
                    maxWidth = doc.width
                doc.close()
            # 创建一个新的文档保存合并之后的图片
            newDoc = self.jpgToTiff.documents.add(maxWidth, totalHeight, 300, "mytiff")
            nextTop = 0
            for pptfile in listAllFile:
                doc1 = self.jpgToTiff.Open(pptfile)
                # 复制打开的图层
                doc1.activeLayer.copy()
                # 设置新建的文档作为激活文档
                self.jpgToTiff.activeDocument = newDoc
                # 粘贴刚才拷贝的图层到激活的文档
                self.jpgToTiff.activeDocument.paste()
                # 获取激活文档的图层边界
                bounds = self.jpgToTiff.activeDocument.activeLayer.bounds
                if (nextTop == 0):
                    self.jpgToTiff.activeDocument.activeLayer.translate(0, 0 - bounds[1])
                else:
                    self.jpgToTiff.activeDocument.activeLayer.translate(0, nextTop - bounds[1])
                nextTop += bounds[3] - bounds[1]
                doc1.close()
                if windll.user32.OpenClipboard(None):  # 打开剪切板
                    windll.user32.EmptyClipboard()  # 清空剪切板
                    windll.user32.CloseClipboard()
                    gc.collect()
            # 创建保存Tiff的属性对象
            tiffSaveoptions = CreateObject("Photoshop.TiffSaveOptions")
            tiffSaveoptions.embedColorProfile = True
            tiffSaveoptions.alphaChannels = True
            tiffSaveoptions.layers = True
            tiffSaveoptions.imageCompression = 2
            tiffSaveoptions.layerCompression = 1
            newDoc.SaveAs(SavePath, tiffSaveoptions)
            seccess = u"合并" + SavePath + u"成功!"
            print (seccess)
            newDoc.Close()
            del listAllFile
            gc.collect()
        except:
            err = u"合并" + SavePath + u"出错,原因内存不足,请手动合并!"
            print (err)
            newDoc.Close()
            gc.collect()

        # 合并Tiff文件

    # 检索目录下Tif的文件合并
    def addAllTiff1(self, folderPath, SavePath):
        newDoc = None
        try:
            # 合并图片的最大宽度作为合并文档的宽度
            maxWidth = 0
            # 合并图片的高度和作为合并文档的高度
            totalHeight = 0
            # 遍历文件夹下所有的文件
            listAllFile = []
            for root, dirs, files in os.walk(folderPath, topdown=False):
                for name in files:
                    if name.endswith(".tif"):
                        print(os.path.join(root, name))
                        listAllFile.append(os.path.join(root, name))
            for pptfile in listAllFile:
                # filepath = os.path.join(folderPath, pptfile)
                doc = self.jpgToTiff.Open(pptfile)
                totalHeight += doc.height
                if doc.width > maxWidth:
                    maxWidth = doc.width
                    doc.close()
            # 创建一个新的文档保存合并之后的图片
            newDoc = self.jpgToTiff.documents.add(maxWidth, totalHeight, 72, "mytiff")
            nextTop = 0
            for pptfile in listAllFile:
                doc1 = self.jpgToTiff.Open(pptfile)
                # 复制打开的图层
                doc1.activeLayer.copy()
                # 设置新建的文档作为激活文档
                self.jpgToTiff.activeDocument = newDoc
                # 粘贴刚才拷贝的图层到激活的文档
                self.jpgToTiff.activeDocument.paste()
                # 获取激活文档的图层边界
                bounds = self.jpgToTiff.activeDocument.activeLayer.bounds
                if (nextTop == 0):
                    self.jpgToTiff.activeDocument.activeLayer.translate(0, 0 - bounds[1])
                else:
                    self.jpgToTiff.activeDocument.activeLayer.translate(0, nextTop - bounds[1])
                nextTop += bounds[3] - bounds[1]
                doc1.close()
                if windll.user32.OpenClipboard(None):  # 打开剪切板
                    windll.user32.EmptyClipboard()  # 清空剪切板
                    windll.user32.CloseClipboard()
                    gc.collect()
            # 创建保存Tiff的属性对象
            tiffSaveoptions = CreateObject("Photoshop.TiffSaveOptions")
            tiffSaveoptions.embedColorProfile = True
            tiffSaveoptions.alphaChannels = True
            tiffSaveoptions.layers = True
            tiffSaveoptions.imageCompression = 2
            tiffSaveoptions.layerCompression = 1
            newDoc.SaveAs(SavePath, tiffSaveoptions)
            seccess = u"合并" + SavePath + u"成功!"
            print (seccess)
            newDoc.Close()
            del listAllFile
            gc.collect()
        except:
            err = u"合并" + SavePath + u"出错,原因内存不足,请手动合并!"
            print (err)
            newDoc.Close()
            gc.collect()

    # 根据承包方编码获取件号
    def getJHByCbfbm(self, listd, cbfbm):
        for i in listd:
            filtered = i[0]
            jh = filtered
            if (i[0] == cbfbm):
                jh = i[1]
                return jh

    # 模糊查找文件
    def getFilterFile(self, folder, find_file):
        allFile = []
        for parents, adds, filenames in os.walk(folder):
            for filename in filenames:
                if find_file in filename:
                    # print(parents + "\\" + filename)
                    allFile.append(parents + "\\" + filename)
        return allFile

    # 农经归档将jpg转tif创建标准归档目录并提取数据
    def nj(self, xiangzpath, savePath, xlspath, xq):
        # 获取xls中的数据
        data = xd.open_workbook(xlspath)  # 打开excel表所在路径
        sheet = data.sheet_by_name('Sheet1')  # 读取数据,以excel表名来打开
        listd = []
        for r in range(sheet.nrows):  # 将表中数据按行逐步添加到列表中,最后转换为list结构
            data1 = []
            for c in range(sheet.ncols):
                data1.append(sheet.cell_value(r, c))
            listd.append(list(data1))
        # 获取xls中的数据
        try:
            for dircun in os.listdir(xiangzpath):

                cun = os.path.join(xiangzpath, dircun)
                print(cun)

                for dirxz in os.listdir(cun):
                    xz = os.path.join(xiangzpath, dircun, dirxz)
                    print(xz)

                    for dirxz_cg_dyb in os.listdir(xz):
                        cg = os.path.join(xz, dirxz_cg_dyb)
                        print(cg)

                        if (cg.endswith("登记颁证成果")):
                            print("djdc")
                            # 确权登记颁证材料封面  确权登记颁证材料目录 权属来源证明材料 承包方调查表 承包方代表声明书 指界通知书(存根)地块调查表 归户表 公示无异议书 承包合同 承包方登记颁证申请书 登记簿 地块示意图
                            # 以承包方调查表为基准
                            for root_cbf, dirs_cbf, files_cbf in os.walk(cg + "\\承包方调查表", topdown=True):
                                for name in files_cbf:
                                    print (os.path.join(root_cbf, name))
                                    cbfbm = root_cbf[-18:]
                                    allFiles = []

                                    # 确权登记颁证材料封面
                                    fm = []
                                    fm = self.getFilterFile(cg + "\\确权登记颁证材料封面\\" + cbfbm, ".jpg")

                                    # 确权登记颁证材料目录
                                    ml = []
                                    ml = self.getFilterFile(cg + "\\确权登记颁证材料目录\\" + cbfbm, ".jpg")

                                    # 权属来源证明材料
                                    qslyzmcl = []
                                    qslyzmcl = self.getFilterFile(cg + "\\权属来源证明材料\\" + cbfbm, ".jpg")

                                    # 承包方调查表
                                    cbfdb = []
                                    cbfdb.append(os.path.join(root_cbf, name))

                                    # 承包方代表声明书
                                    cbfdbsms = []
                                    cbfdbsms = self.getFilterFile(cg + "\\承包方代表声明书\\" + cbfbm, ".jpg")

                                    # 指界通知书(存根)
                                    zjtzscg = []
                                    zjtzscg = self.getFilterFile(cg + "\\指界通知书(存根)\\" + cbfbm, ".jpg")

                                    # 地块调查表
                                    dkdcb = []
                                    dkdcb = self.getFilterFile(cg + "\\地块调查表\\" + cbfbm, ".jpg")

                                    # 归户表
                                    ghb = []
                                    ghb = self.getFilterFile(cg + "\\归户表\\" + cbfbm, ".jpg")

                                    # 公示无异议书
                                    gswyy = []
                                    gswyy = self.getFilterFile(cg + "\\公示无异议书\\" + cbfbm, ".jpg")

                                    # 承包合同
                                    cbht = []
                                    cbht = self.getFilterFile(cg + "\\承包合同\\" + cbfbm, ".jpg")

                                    # 承包方登记颁证申请书
                                    cbfdjsqs = []
                                    cbfdjsqs = self.getFilterFile(cg + "\\承包方登记颁证申请书\\" + cbfbm, ".jpg")

                                    # 登记簿
                                    djb = []
                                    djb = self.getFilterFile(cg + "\\登记簿\\" + cbfbm, ".jpg")

                                    # 地块示意图
                                    dksyt = []
                                    dksyt = self.getFilterFile(cg + "\\地块示意图\\" + cbfbm, ".jpg")

                                    # 创建保存目录及保存文件名称
                                    # 获取件号
                                    listpath = cg.split("\\")
                                    jh = self.getJHByCbfbm(listd, cbfbm)
                                    if jh.strip():
                                        lsjh = jh.split("-")
                                        # 新的文件名称
                                        pdfname = "0" + lsjh[0] + "-2019-永久-确权登记类-" + lsjh[1]
                                        # 保存路径
                                        newpath = os.path.join(savePath, listpath[1], listpath[2], listpath[3],
                                                               xq + "农经权档案数字化加工单页TIFF", "0" + lsjh[0], "2019", "永久",
                                                               "确权登记类",
                                                               lsjh[1])
                                        alltiffnewpath = os.path.join(savePath, listpath[1], listpath[2], listpath[3],
                                                                      xq + "农经权档案数字化加工多页TIFF", "0" + lsjh[0], "2019",
                                                                      "永久",
                                                                      "确权登记类", lsjh[1])
                                        # 新的保存文件
                                        newfile_path = os.path.join(newpath, pdfname)
                                        # 临翔区农经权档案数字化加工单页TIFF
                                        if (os.path.exists(newpath) == False):
                                            os.makedirs(newpath)
                                        # 临翔区农经权档案数字化加工多页TIFF
                                        if (os.path.exists(alltiffnewpath) == False):
                                            os.makedirs(alltiffnewpath)

                                    if len(fm) > 0 and len(ml) > 0 and len(qslyzmcl) > 0 and len(cbfdb) > 0 and len(
                                            cbfdbsms) > 0 and len(zjtzscg) > 0 and len(dkdcb) > 0 and len(
                                        ghb) > 0 and len(
                                        gswyy) > 0 and len(cbht) > 0 and len(cbfdjsqs) > 0 and len(djb) > 0 and len(
                                        dksyt) > 0:

                                        # jpg转换tiff
                                        allFiles.extend(fm)
                                        allFiles.extend(ml)
                                        allFiles.extend(qslyzmcl)
                                        allFiles.extend(cbfdb)
                                        allFiles.extend(cbfdbsms)
                                        allFiles.extend(zjtzscg)
                                        allFiles.extend(dkdcb)
                                        allFiles.extend(ghb)
                                        allFiles.extend(gswyy)
                                        allFiles.extend(cbht)
                                        allFiles.extend(cbfdjsqs)
                                        allFiles.extend(djb)
                                        allFiles.extend(dksyt)
                                        self.jpgtotiff(allFiles, newfile_path)

                                        # tiff合并
                                        # alltiffs=self.addAllTiff(allFiles,alltiffnewpath+"\\"+pdfname+".tif")

                                    else:
                                        print (cbfbm + u"的资料存在问题!")

                        elif (cg.endswith("打印包")):
                            lisDYpdf = self.getFilterFile(cg, u"完整包_1.pdf")

                            if (len(lisDYpdf) > 0):
                                for ls in lisDYpdf:
                                    lsfilename = os.path.split(ls)
                                    # 获取承包方编码
                                    filename = lsfilename[1][0:18]
                                    # 获取件号
                                    jh = self.getJHByCbfbm(listd, filename)
                                    if jh.strip():
                                        lsjh = jh.split("-")
                                        listpath = ls.split("\\")
                                        # 新的文件名称
                                        pdfname = "0" + lsjh[0] + "-2019-永久-确权登记类-" + lsjh[1]
                                        # 保存路径
                                        newpath = os.path.join(savePath, listpath[1], listpath[2], listpath[3],
                                                               xq + "农经权档案数字化加工多页PDF", "0" + lsjh[0], "2019", "永久",
                                                               "确权登记类",
                                                               lsjh[1])
                                        # 新的保存文件
                                        newfile_path = os.path.join(newpath, pdfname + ".pdf")

                                        if (os.path.exists(newpath) == False):
                                            os.makedirs(newpath)
                                        shutil.copyfile(ls, newfile_path)

                                    else:
                                        err = u"未能找到承包方编码为" + filename + u"的件号,请检查电子表格中的承包方和件号的数据是否正确!"
                                        print (err)
        except Exception as r:
            print('error %s' % r)


if __name__ == "__main__":
    njhelper = NJHelper()

    # 选择乡镇目录
    xiangz = ur"E:\**乡"
    saveRoot = ur"F:\**乡成果"
    xlspath = ur"E:\**乡\fc.xlsx"
    xq = ur"**区"

    # 复制完整打印包和转单个tif
    # njhelper.nj(xiangz, saveRoot, xlspath, xq)
    # 复制完整打印包和转单个tif

    # 合并多个tiff
    allcf = []
    allcfdic = []
    filelistq = njhelper.getFilterFile(saveRoot, ".tif")
    for allp in filelistq:
        allcf.append(os.path.dirname(allp))
    allcfdic = list(set(allcf))
    allcfdic.sort(key=allcf.index)
    del allcf, filelistq
    gc.collect()
    if len(allcfdic) > 0:
        for allcfdicdir in allcfdic:
            listtiff = njhelper.getFilterFile(allcfdicdir, ".tif")
            savetiffpath = allcfdicdir.replace("**区农经权档案数字化加工单页TIFF", "**区农经权档案数字化加工多页TIFF")
            filenamelis = savetiffpath.encode('utf-8').split('\\')
            filename = filenamelis[-5] + "-" + filenamelis[-4] + "-" + filenamelis[-3] + "-" + filenamelis[-2] + "-" + \
                       filenamelis[-1] + ".tif"
            if (os.path.exists(savetiffpath) == False):
                os.makedirs(savetiffpath)
            njhelper.addAllTiff(listtiff, os.path.join(savetiffpath, filename))
    # 合并多个tiff

  • 参考

参考API:https://theiviaxx.github.io/photoshop-docs/Photoshop/;
https://www.indesignjs.de/extendscriptAPI/photoshop2015.5/#ActionDescriptor.html;
https://github.com/loonghao/photoshop-python-api。

  • 不足

不足:由于使用python2.7官方不在支持,本次采用py2exe打包为可执行的exe,虽然打包成功,但是无法运行,只能利用PyCharm调试运行,得到最终的成果,很是遗憾!

  • 技术支持
    如需获取相关包及源代码请加qq:1815222521。
  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章           查看所有文章
加:2022-05-18 17:35:34  更:2022-05-18 17:38:20 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/18 15:02:24-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码