¿Cómo puedo rotar todas las páginas en un PDF mediante programación utilizando las herramientas nativas de macOS?

4

Dada una ruta de archivo, necesito rotar todas las páginas en un PDF en esa ruta de archivo sin usar nada que no esté incluido con macOS. El envoltorio para esto será AppleScript, por lo que también tengo acceso a la línea de comandos y, por lo tanto, todos los lenguajes de scripts instalados de forma predeterminada con macOS, pero nada que requiera brew o, por ejemplo, pip de Python.

    
pregunta Chuck 20.10.2017 - 00:58

1 respuesta

1

Que yo sepa macOS no tiene ningún ejecutable de Unix de línea de comando nativo que pueda rotar todas las páginas en un PDF (manteniendo los basados en texto basados en texto). sip puede rotar una sola página PDF sin embargo, el PDF resultante es una imagen encapsulada , no texto si fue la base de texto para empezar. Además, no estoy seguro de si hay una forma con solo simple AppleScript , aparte de UI Scripting predeterminado < strong> Vista previa de la aplicación, sin ir a AppleScriptObjC ( Cocoa-AppleScript ) o Python , etc.

El uso de utilidades de línea de comando de terceros es probablemente la más fácil, pero usted dijo que se debe hacer solo usando lo que es una parte predeterminada de macOS . Por lo tanto, ofreceré una solución AppleScript que utiliza UI Scripting la predeterminada Vista previa , que se puede usar en el caso de que no haya otra forma con AppleScriptObjC o sin utilidades de terceros , etc.

Esta solución, tal como se ofrece (y codificada), asume que Vista previa es la aplicación predeterminada para documentos PDF y la usa para rotar todas las páginas en el PDF documento. También se configura como un Automator workflow . (Aunque hay otras formas de incorporar el código de AppleScript que se muestra a continuación.)

Primero, en Finder , haga una copia de los documentos PDF de destino y trabaje con ellos.

En Automator , crea un nuevo documento workflow , agregando las siguientes acciones :

  • Obtener elementos del buscador especificados
    • Agregue el documento PDF de destino copiado a esta acción .
  • Ejecutar script de AppleScript
    • Reemplace el código predeterminado con el código a continuación:

AppleScript code:

on run {input}
    set thisLong to 0.25 -- # The value of 'thisLong' is decimal seconds delay between keystrokes, adjust as necessary.
    set theRotation to "r" -- # Valid values are 'l' or 'r' for Rotate Left or Rotate Right.
    set theViewMenuCheckedList to {}
    set theMenuItemChecked to missing value
    repeat with thisItem in input
        tell application "Finder" to open file thisItem -- # By default, in this use case, the PDF file will open in Preview.
        delay 1 --  # Adjust as necessary. This is the only 'delay' not defined by the value of 'thisLong'.
        tell application "System Events"
            perform action "AXRaise" of window 1 of application process "Preview" -- # Just to make sure 'window 1' is front-most.
            delay thisLong
            --  # Ascertain which of the first six 'View' menu items is checked.
            set theViewMenuCheckedList to (value of attribute "AXMenuItemMarkChar" of menu items 1 thru 6 of menu 1 of menu bar item 5 of menu bar 1 of application process "Preview")
            repeat with i from 1 to 6
                if item i in theViewMenuCheckedList is not missing value then
                    set theMenuItemChecked to i as integer
                    exit repeat
                end if
            end repeat
            --  # Process keystrokes based on which 'View' menu item is checked.
            --  # This is being done so the subsequent keystroke ⌘A 'Select All' 
            --  # occurs on the 'Thumbnails', not the body of the document.
            if theMenuItemChecked is not 2 then
                repeat with thisKey in {"2", "1", "2"}
                    keystroke thisKey using {option down, command down}
                    delay thisLong
                end repeat
            else
                repeat with thisKey in {"1", "2"}
                    keystroke thisKey using {option down, command down}
                    delay thisLong
                end repeat
            end if
            repeat with thisKey in {"a", theRotation as text, "s"} -- # {Select All, Rotate Direction, Save}
                keystroke thisKey using {command down}
                delay thisLong
            end repeat
            keystroke theMenuItemChecked as text using {option down, command down} -- # Resets the 'View' menu to the original view.
            delay thisLong
            keystroke "w" using {command down} -- # Close Window.
        end tell
    end repeat
end run

Notas :

  • Como este script utiliza UI Scripting , cuando se ejecuta desde Automator (o Script Editor ), el la aplicación se debe agregar a Preferencias del sistema > Seguridad & Privacidad > Accesibilidad para ejecutar correctamente. Guardado como una aplicación , la aplicación guardada debería agregarse.
  • También con UI Scripting , es posible que el valor de los comandos delay deba cambiarse para usarlo en su sistema (y / o adicional delay comandos agregados según corresponda, aunque en el caso de que no se necesiten delay comandos ). No debería decir que, sin embargo, pruebe esto en un conjunto de unos pocos documentos primero para asegurarse de que el valor establecido para thisLong funciona en su sistema. En mi sistema esto funcionó como codificado.
  • Al utilizar UI Scripting de esta manera, una vez que la tarea ha comenzado, uno debe dejar el sistema solo y dejar que termine de procesar los archivos. Tratar de realizar múltiples tareas solo establecerá el enfoque lejos de la tarea en cuestión y hará que falle.
  • Si necesita rotar más de una vez, agregue theRotation as text, adicional a:

      repeat with thisKey in {"a", theRotation as text, "s"} -- # {Select All, Rotate Direction, Save}
    

    Ejemplo:

      repeat with thisKey in {"a", theRotation as text, theRotation as text, "s"}
    
respondido por el user3439894 20.10.2017 - 20:46

Lea otras preguntas en las etiquetas