Como automatizar o comando Salvar como para vários arquivos abertos na visualização

0

Eu uso o Mac OS para executar um utilitário de negócios diário que criará onze (11) relatórios impressos em PDF e os arquivos abertos no Mac Preview. Os arquivos são criados com nomes de arquivos genéricos, como "Constant.pdf" ou "Estimate.pdf". Eu tenho uma pasta com arquivos PDF em branco que eu uso como um "modelo" para salvar esses arquivos com os nomes de arquivo apropriados. Cada arquivo PDF em branco tem o nome do arquivo que eu quero usar para cada um dos relatórios PDF abertos. Eu faço isso manualmente, pegando o primeiro PDF aberto, pressionando Cmd + Opção + Deslocamento + S (para acessar o comando Salvar como), destaque o arquivo que eu quero para "Salvar para" na janela do Finder, clique em "Salvar", clique em "Substituir", depois fecho o arquivo PDF. Repito esse passo com os 10 arquivos restantes.

Espero que haja uma maneira de automatizar essas etapas. Felizmente, os arquivos PDF são impressos / criados em uma sequência específica e a Visualização abre os arquivos nessa sequência e eles aparecem na mesma sequência em que eu Salvar manualmente como e fecho os arquivos. Assim, o automador precisaria saber quais nomes de arquivos atribuir a cada PDF em ordem.

Alguma sugestão?

    
por davec0864 27.07.2018 / 01:20

1 resposta

0

Crie uma pasta onde seus 11 modelos PDF possam residir permanentemente. Prefixe os nomes dos arquivos com 01- , 02- , ..., 10- , 11- para indicar a ordem na qual os PDFs processados serão salvos (é importante que os modelos de 1 a 9 tenham um 0 principal frente).

No script abaixo, altere o valor da propriedade templatesFolder (linha 1) para refletir o caminho para a pasta onde os modelos PDF podem ser encontrados.

Para usar o script, permita que todos os 11 PDFs sejam processados para abrir em Preview e, em seguida, execute o script. Você pode incorporar o script em um Automator serviço e atribuir um atalho de teclado a ele. Instruções sobre como fazer um serviço de todo o sistema com Automator pode ser encontrado nesse link.

Quando executado, o script abrirá uma caixa de diálogo do sistema de arquivos que permitirá selecionar uma pasta onde você deseja salvar os PDFs processados. Cancel cancelará o script. Depois de clicar em Choose , os arquivos PDF serão salvos na ordem em que foram abertos, usando os nomes de arquivos dos PDFs de modelo (mas sem o prefixo). Cada PDF é fechado, o Preview é fechado e os PDFs salvos são revelados no Finder .

O script:

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
    
por 08.08.2018 / 04:49