如何在预览中自动执行多个打开文件的另存为命令

如何在预览中自动执行多个打开文件的另存为命令

我使用 Mac OS 运行一个日常业务实用程序,它将创建十一 (11) 份打印为 PDF 的报告,并在 Mac Preview 中打开这些文件。这些文件使用通用文件名创建,例如“Constant.pdf”或“Estimate.pdf”。我有一个包含空白 PDF 文件的文件夹,我将其用作“模板”,以适当的文件名保存这些文件。每个空白 PDF 文件都有我想要用于每个打开的 PDF 报告的文件名。我手动执行此操作,方法是打开第一个打开的 PDF,按Cmd+ Option+ Shift+ S(访问“另存为”命令),在 Finder 窗口中突出显示我想要“另存为”的文件,单击“保存”,单击“替换”,然后关闭 PDF 文件。我对其余 10 个文件重复此步骤。

我希望有一种方法可以自动执行这些步骤。幸运的是,PDF 文件是按特定顺序打印/创建的,预览会按该顺序打开文件,并且它们会按我手动另存为并关闭文件的顺序显示。因此,自动程序需要知道按顺序为每个 PDF 分配哪些文件名。

有什么建议么?

答案1

创建一个文件夹,永久存放您的 11 个 PDF 模板。在文件名前加上01-, 02-, ... , 10-,以指示已处理 PDF 的保存顺序(模板 1-9前面11-必须有前导)。0

在下面的脚本中,更改属性的值templatesFolder(第 1 行)以反映可找到 PDF 模板的文件夹的路径。

要使用该脚本,请允许处理所有 11 个 PDF 以在预览,然后运行该脚本。您可以将该脚本合并到自动机 服务,并为其分配键盘快捷键。如何创建系统范围的服务自动机可以在该链接中找到。

运行时,脚本将打开一个文件系统对话框,允许您选择要保存处理后的 PDF 的文件夹。 Cancel将中止脚本。单击Choose,PDF 文件将按照打开的顺序保存,使用模板 PDF 的文件名(但不带前缀)。然后关闭每个 PDF,预览关闭,保存的 PDF 将显示在发现者

剧本:

property templatesFolder : "~/Documents/PDFs/Templates"

set saveFolder to POSIX path of ¬
    (choose folder with prompt ("Select a folder to save PDFs") ¬
        default location path to documents folder)

tell application "System Events" to set pdfTemplates to the ¬
    name of the files in folder templatesFolder ¬
    whose name extension is "pdf"

set filenames to sort(the result)

repeat with D in my getPreviewDocumentsInOrder()
    set filename to text 4 thru -1 of item 1 of filenames
    set fp to POSIX file ([saveFolder, filename] as text)
    tell application "Preview"
        save D in fp
        close D
    end tell
    set filenames to rest of filenames
    if filenames = {} then exit repeat
end repeat

quit application "Preview"

tell application "Finder"
    open POSIX file saveFolder
    activate
end tell
--------------------------------------------------------------------------------
###HANDLERS
#
#
to getPreviewDocumentsInOrder()
    script
        use P : application "Preview"
        property idx : sort(id of P's windows)

        on docList(IDs)
            local IDs

            if IDs = {} then return {}
            script
                property L : IDs
            end script

            tell the result to set [d0, dN] to [first item, rest] of its L
            tell P to return {document of window id (d0)} & my docList(dN)
        end docList
    end script

    tell the result to return the docList(its idx)
end getPreviewDocumentsInOrder

to sort(L as list)
    local L

    if L = {} then return {}
    if L's length = 1 then return L

    script
        property Array : L

        on minimum(L as list)
            local L

            if L is {} then return {}
            if L's length = 1 then return L's first item

            script
                property Array : L
            end script

            set [x0, xN] to [first item, rest] of the result's Array
            set min to minimum(xN)
            if x0 < min then return x0
            return min
        end minimum

        on lastIndexOf(x, L as list)
            local x, L

            if x is not in L then return {}
            if L = {} then return

            script
                property Array : L
            end script

            tell the result
                set [x0, xN] to [last item, reverse of rest of reverse] of its Array
                if x0 = x then return (xN's length) + 1
                return lastIndexOf(x, xN)
            end tell
        end lastIndexOf

        to swap(L as list, i as integer, j as integer)
            local i, j, L

            set x to item i of L
            set item i of L to item j of L
            set item j of L to x
        end swap
    end script

    tell the result
        set i to lastIndexOf(minimum(its Array), its Array)
        if i ≠ 1 then swap(its Array, 1, i)
        set [x0, xN] to [first item, rest] of its Array
        return [x0] & sort(xN)
    end tell
end sort

相关内容