Come posso ruotare tutte le pagine di un PDF a livello di programmazione usando strumenti macOS nativi?

4

Dato un percorso di file, ho bisogno di ruotare tutte le pagine in un PDF su quel percorso di file usando nulla che non sia incluso in macOS. Il wrapper per questo sarà AppleScript, quindi ho anche accesso alla riga di comando e quindi tutti i linguaggi di scripting installati di default con macOS, ma nulla che richiederebbe brew o, per esempio, pip di Python.

    
posta Chuck 20.10.2017 - 00:58
fonte

2 risposte

1

A mia conoscenza macOS non ha nessun eseguibile nativo Unix a riga di comando che può ruotare tutte le pagine in un PDF (mantenendo basati i testi basati sul testo). sip può ruotare una singola pagina PDF tuttavia il PDF risultante è un'immagine incapsulata , non testo se era una base di testo per cominciare. Inoltre, non sono sicuro che ci sia un modo con solo semplice AppleScript , poi tramite UI Scripting il predefinito < strong> Anteprima , senza andare a AppleScriptObjC ( Cocoa-AppleScript ) e o Python , ecc.

Utilizzare le utilità della riga di comando di terze parti è probabilmente la più semplice, ma hai detto che deve essere fatto solo usando ciò che è una parte predefinita di macOS . Pertanto, offrirò una soluzione AppleScript che utilizza UI Scripting l'applicazione predefinita Anteprima , che può essere utilizzata nel caso in cui non ci sia un altro modo con AppleScriptObjC o senza utilità di terze parti , ecc.

Questa soluzione, come offerta (e codificata), presuppone che Anteprima sia l'applicazione predefinita per i documenti PDF e la usi per ruota tutte le pagine nel documento PDF . È anche configurato come un Automator . (Sebbene ci siano altri modi per incorporare il codice di AppleScript mostrato sotto.)

Innanzitutto, in Finder , crea una copia dei documenti PDF di destinazione e lavora con quelli.

In Automator , crea un nuovo documento workflow , aggiungendo le seguenti azioni :

  • Trova elementi del Finder specificati
    • Aggiungi il documento di destinazione PDF copiato a questa azione .
  • Esegui script AppleScript
    • Sostituisci il codice predefinito con il codice sotto:

codice AppleScript :

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

Note:

  • Poiché questo script utilizza UI Scripting , quando viene eseguito da Automator (o Script Editor ), l'esecuzione l'app deve essere aggiunta a Preferenze di sistema > Sicurezza & Privacy > Accessibilità per eseguire correttamente. Salvato come applicazione , l'applicazione salvata dovrebbe essere aggiunta.
  • Anche con UI Scripting , potrebbe essere necessario modificare il valore dei comandi delay per l'uso sul tuo sistema (eo%% aggiuntivo% comandi aggiunti come appropriato, sebbene nel caso non siano necessari ulteriori delay comandi ). Dovrebbe essere ovvio, tuttavia, prima prova questo su un set di alcuni documenti per assicurarti che il valore impostato per delay funzioni sul tuo sistema. Sul mio sistema questo ha funzionato come codificato.
  • Quando si utilizza UI Scripting in questo modo, una volta avviato l'attività, è necessario lasciare il sistema da solo e lasciare terminare l'elaborazione dei file. Se provi a eseguire più task, imposterai l'attenzione solo sull'attività in corso e causerà il fallimento.
  • Se devi ruotare più di una volta, aggiungi thisLong aggiuntivo a:

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

    Esempio:

      repeat with thisKey in {"a", theRotation as text, theRotation as text, "s"}
    
risposta data 20.10.2017 - 20:46
fonte
1

Questo script python ruoterà di 90 ° in senso orario su tutte le pagine di tutti i PDF dati come argomenti, salvando il risultato in un nuovo file con "+90" aggiunto al nome file.

#!/usr/bin/python
# coding=utf-8
# Produces new PDF file with all pages rotated by 90 degrees.

import sys
import os
from Quartz import PDFDocument
from CoreFoundation import NSURL

if __name__ == '__main__':

    for filename in sys.argv[1:]:
        filename = filename.decode('utf-8')
        shortName = os.path.splitext(filename)[0]
        outFilename = shortName + "+90.pdf"
        pdfURL = NSURL.fileURLWithPath_(filename)
        pdfDoc = PDFDocument.alloc().initWithURL_(pdfURL)
        if pdfDoc:
            pages = pdfDoc.pageCount()
            for p in range(0, pages):
                page = pdfDoc.pageAtIndex_(p)
                existingRotation = page.rotation()
                newRotation = existingRotation + 90
                page.setRotation_(newRotation)

            pdfDoc.writeToFile_(outFilename)
    
risposta data 04.01.2019 - 13:41
fonte

Leggi altre domande sui tag