Question

Je travaille sur un projet pour OSX dans lequel l'utilisateur peut choisir une collection de documents (à partir de n'importe quelle application) dont je dois générer des fichiers PDF. La boîte de dialogue d'impression standard Macintosh comporte un bouton PDF contenant un certain nombre de commandes associées à PDF, notamment "Enregistrer en tant que PDF ...". Cependant, je dois générer le fichier PDF sans nécessiter d'interactions utilisateur. Je souhaite idéalement que cela fonctionne avec tout type de document.

Voici les options que j'ai explorées jusqu'à présent:

  • Actions Automator. Il existe une bibliothèque PDF pour Automator, mais celle-ci fournit des actions pour travailler avec les fichiers PDF sans les générer. Il existe une action du Finder pour imprimer n’importe quel fichier mais uniquement sur une imprimante réelle.
  • AppleScript. Certaines applications ont la possibilité de générer des fichiers PDF (par exemple, si vous envoyez "enregistrer le document dans" test.pdf "dans Pages), un fichier PDF sera généré (mais cela ne fonctionne que pour Pages. J'ai besoin de l'assistance pour tout type de document. ).
  • Imprimante personnalisée. Je pourrais créer un pilote d’imprimante virtuelle, puis utiliser l’action Automator, mais je n’aime pas l’idée de confondre l’utilisateur avec une imprimante supplémentaire dans la liste d’impression.

J'espère qu'il est possible d'interagir avec l'application active comme si l'utilisateur exécutait les étapes suivantes:

  1. Do Cmd-P (ouvre la boîte de dialogue d'impression)
  2. Cliquez sur le lien "PDF". bouton
  3. Sélectionnez "Enregistrer en tant que PDF ...". (deuxième élément du menu)
  4. Saisissez le nom du fichier dans la boîte de dialogue de sauvegarde
  5. Cliquez sur "Enregistrer"
  6. .

Si c’est la meilleure approche (est-ce que c’est le cas?), le vrai problème est de savoir comment envoyer des événements d'interface utilisateur à une application externe (frappes au clavier, événements de souris, sélections de menu)?

Mise à jour: Juste pour clarifier un point: les documents que je dois convertir en PDF sont des documents créés par d'autres applications . Par exemple, l'utilisateur peut choisir un document Word, une feuille de calcul Numbers, un dessin OmniGraffle ou une page Web. Le dénominateur commun est que chacun de ces documents a une application associée et que cette application sait comment l’imprimer (et OSX sait comment rendre la sortie imprimée dans un fichier PDF).

Ainsi, les exemples de Cocoa Dev Central ne vous aident pas, car ils ont pour objectif de générer un fichier PDF à partir de mon application .

Était-ce utile?

La solution

Je pense que vous pouvez utiliser applescript pour ouvrir un document, puis Scripting UI applescript pour appeler le menu Imprimer.

Par exemple:

tell application "System Events"
        tell window of process "Safari"
            set foremost to true
            keystroke "p" using {command down}
            delay 3
            click menu button "PDF" of sheet 2
            click menu item "Save as PDF…" of menu 1 of menu button "PDF" of sheet 2
            keystroke "my_test.file"
            keystroke return
            delay 10
        end tell

    end tell

Autres conseils

Jetez un coup d'œil sur un programme appelé CUPS-PDF

Il s’agit d’une imprimante virtuelle pour OS X qui fait ce que l ’" Enreg. au format PDF ". Cette méthode s’applique lors de l’impression sur votre imprimante normale, à l’exception de chaque travail d’impression transmis. Elle produit une sortie PDF.

Une fois que vous l'avez installé, vous pouvez créer un shell ou des scripts AppleScript à l'aide de la commande lp .

Par exemple, une fois l’imprimante virtuelle configurée, vous pouvez imprimer le fichier test.txt et l’enregistrer automatiquement au format PDF. Pour ce faire, utilisez un AppleScript, utilisez le code suivant:

do shell script "lp -d CUPS_PDF test.txt"

L'application CUPS-PDF enregistre toutes les sorties dans / Utilisateurs / Partagé / CUPS-PDF. Je ne sais pas si vous pouvez changer ce chemin, mais vous pouvez récupérer le fichier dans votre script et le déplacer.

Il y a cependant quelques réserves.

Tout d'abord, la commande lp ne peut pas imprimer de fichiers .doc. Je pense qu’il existe d’autres applications tierces qui vous permettront de le faire.

Deuxièmement, l'application CUPS-PDF indique dans la sous-fenêtre Imprimante des Préférences Système le nom d'un trait d'union, mais CUPS indique le nom de la file d'attente comme un trait de soulignement. Donc, sur la ligne de commande, vous devez faire référence au nom de la file d’attente CUPS, qui est CUPS_PDF avec un trait de soulignement.

Même si vous ne trouvez pas très utile de créer un script via la commande lp et que vous souhaitez toujours utiliser des scripts graphiques, le fait d’avoir une imprimante virtuelle devrait vous éviter quelques étapes.

vous pouvez utiliser des tasses comme celle-ci

    on open afile
        set filename to name of (info for afile)
        tell application "Finder"
            set filepath to (container of (afile as alias)) as alias
        end tell
        set filepath to quoted form of POSIX path of filepath
        set tid to AppleScript's text item delimiters
        set AppleScript's text item delimiters to "."
        set filename to text item 1 of filename
        set AppleScript's text item delimiters to tid
        set afile to quoted form of POSIX path of afile
        do shell script "cupsfilter " & afile & " > " & filepath & filename & ".pdf"
    end open

J'ai créé un alias dans bash pour cela:

convert2pdf() {
  /System/Library/Printers/Libraries/convert -f "$1" -o "$2" -j "application/pdf"
}

J'ai saisi le code ci-dessous avec l'aide d'Automator (enregistrement d'une action, puis déplacement de l'action spécifique en dehors de la fenêtre "Watch Me Do" afin d'obtenir le script Applescript). Si vous souhaitez imprimer un fichier PDF à partir d'une application autre que Safari, vous devrez peut-être suivre le même processus et ajuster ce script avec la boîte de dialogue Imprimer, car chaque programme peut avoir une interface graphique d'impression différente.

# Convert the current Safari window to a PDF
# by Sebastain Gallese

# props to the following for helping me get frontmost window
# http://stackoverflow.com/questions/480866/get-the-title-of-the-current-active-window-            document-in-mac-os-x

global window_name

# This script works with Safari, you might have
# to tweak it to work with other applications 
set myApplication to "Safari"

# You can name the PDF whatever you want
# Just make sure to delete it or move it or rename it
# Before running the script again
set myPDFName to "mynewpdfile"

tell application myApplication
    activate
    if the (count of windows) is not 0 then
        set window_name to name of front window
    end if
end tell

set timeoutSeconds to 2.0
set uiScript to "keystroke \"p\" using command down"
my doWithTimeout(uiScript, timeoutSeconds)
set uiScript to "click menu button \"PDF\" of sheet 1 of window \"" & window_name & "\" of application process \"" & myApplication & "\""
my doWithTimeout(uiScript, timeoutSeconds)
set uiScript to "click menu item 2 of menu 1 of menu button \"PDF\" of sheet 1 of window \"" & window_name & "\" of application process \"" & myApplication & "\""
my doWithTimeout(uiScript, timeoutSeconds)
set uiScript to "keystroke \"" & myPDFName & "\""
my doWithTimeout(uiScript, timeoutSeconds)
set uiScript to "keystroke return"
my doWithTimeout(uiScript, timeoutSeconds)

on doWithTimeout(uiScript, timeoutSeconds)
    set endDate to (current date) + timeoutSeconds
    repeat
        try
            run script "tell application \"System Events\"
" & uiScript & "
end tell"
            exit repeat
        on error errorMessage
            if ((current date) > endDate) then
                error "Can not " & uiScript
            end if
        end try
    end repeat
end doWithTimeout
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top