Я использую Mac OS для запуска ежедневной бизнес-утилиты, которая будет создавать одиннадцать (11) отчетов, напечатанных в PDF, и файлы, открытые в Mac Preview. Файлы создаются с общими именами файлов, такими как «Constant.pdf» или «Estimate.pdf». У меня есть папка с пустыми файлами PDF, которую я использую в качестве "шаблона" для сохранения этих файлов с соответствующими именами файлов. У каждого пустого файла PDF есть имя файла, которое я хочу использовать для каждого из открытых отчетов PDF. Я делаю это вручную, беря первый открытый PDF, нажимая Cmd+Option+Shift+S (чтобы получить доступ к команде "Сохранить как"), выделяя файл, который я хочу "Сохранить в", в окне Finder, нажимаю "Сохранить", нажимаю » Заменить », затем я закрываю файл PDF. Я повторяю этот шаг с остальными 10 файлами.

Я надеюсь, что есть способ автоматизировать эти шаги. К счастью, файлы PDF печатаются / создаются в определенной последовательности, и в режиме предварительного просмотра файлы открываются в этой последовательности, и они отображаются в той же последовательности, что и я, вручную сохраняющий как и закрывающие файлы. Таким образом, автоматизатор должен знать, какие имена файлов назначать каждому PDF по порядку.

Какие-либо предложения?

1 ответ1

0

Создайте папку, где ваши 11 шаблонов PDF могут постоянно находиться. Поставьте перед именами файлов имена файлов 01- , 02- , ..., 10- , 11- чтобы указать порядок сохранения обработанных PDF-файлов (важно, чтобы шаблоны 1-9 имели начальный 0 впереди).

В приведенном ниже сценарии измените значение свойства templatesFolder (строка 1), чтобы отразить путь к папке, в которой можно найти шаблоны PDF.

Чтобы использовать сценарий, разрешите открывать все 11 PDF-файлов в Preview, затем запустите сценарий. Вы можете включить скрипт в сервис Automator и назначить ему сочетание клавиш. Инструкции о том, как сделать общесистемный сервис с Automator, можно найти по этой ссылке.

При запуске сценарий откроет диалоговое окно файловой системы, которое позволит вам выбрать папку, в которую вы хотите сохранить обработанные PDF-файлы. Cancel прервет сценарий. После того, как вы нажмете « Choose, файлы PDF будут сохранены в том порядке, в котором они были открыты, используя имена файлов шаблонов PDF (но без префикса). Затем каждый PDF-файл закрывается, предварительный просмотр закрывается, а сохраненные PDF-файлы отображаются в Finder.

Сценарий:

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .