2008-11-09 5 views
18

Je travaille sur un projet pour OSX où l'utilisateur peut choisir une collection de documents (à partir de n'importe quelle application) dont j'ai besoin pour générer des PDF. La boîte de dialogue standard d'impression Macintosh comporte un bouton PDF contenant un certain nombre de commandes liées au PDF, notamment "Enregistrer en PDF ...". Cependant, j'ai besoin de générer le fichier PDF sans nécessiter d'interactions de l'utilisateur. Je veux idéalement que cela fonctionne avec n'importe quel type de document.Comment générer par programme un PDF à partir de n'importe quel document sous OSX?

Voici les options que je l'ai exploré jusqu'à présent:

  • actions Automator. Il existe une bibliothèque PDF pour Automator mais elle fournit des actions pour travailler avec des fichiers PDF, sans les générer. Il y a une action Finder pour imprimer n'importe quel fichier mais seulement pour une vraie imprimante.
  • AppleScript. Certaines applications ont la capacité de générer des fichiers PDF (par exemple, si vous envoyez 'save doc in "test.pdf"' Pages, cela générera un PDF (mais cela ne fonctionne que pour Pages - J'ai besoin de support pour tout type de document) .
  • imprimante personnalisée. Je pourrais créer un pilote d'imprimante virtuelle, puis utilisez 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.

Mon espoir est qu'il ya un moyen 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 bouton "PDF"
  3. Sélectionnez "Enregistrer au format PDF ..." (deuxième élément dans le menu)
  4. Tapez le nom de fichier dans boîte de dialogue Enregistrer
  5. Cliquez sur "Enregistrer"

Si c'est la meilleure approche (est-ce?) alors le vrai problème est: comment envoyer des événements d'IU à une application externe (frappes, événements de souris, sélections de menu)?

Mise à jour: Juste pour clarifier un point: les documents que je dois convertir au format PDF sont des documents qui sont créés par d'autres applications . Par exemple, l'utilisateur peut choisir un document Word ou une feuille de calcul Numbers ou 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). Par conséquent, les échantillons de Cocoa Dev Central n'aident pas car ils génèrent un PDF de à mon application.

Répondre

6

Je pense que vous pouvez utiliser applescript pour ouvrir un document, puis utiliser applescript UI scripting pour appeler le menu d'impression.

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 
+0

Merci! C'était exactement le pointeur que je cherchais. –

+2

-1 Cela semble être une bonne approche si vous ouvrez un fichier dans un safari mais je suis sûr que vous ne voulez pas le bon code pour toutes les applications possibles – mcgrailm

0

Je tapé le code ci-dessous avec l'aide d'Automator (enregistrement d'une action, puis en faisant glisser l'action spécifique de la « Watch Me Do » fenêtre pour obtenir le Applescript). Si vous souhaitez imprimer un fichier PDF à partir d'une application autre que Safari, vous devrez peut-être exécuter le même processus et modifier Applescript dans 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 
2

Jetez un oeil à un programme appelé CUPS-PDF

Il est une imprimante virtuelle pour OS X qui fait ce que la méthode « Enregistrer au format PDF » fait quand impression par imprimante normale, sauf chaque travail d'impression passé par il en résulte une sortie pdf.

Une fois installé, vous pouvez créer ou shell AppleScript en utilisant la commande lp. Par exemple, une fois l'imprimante virtuelle configurée, vous pouvez imprimer test.txt et l'enregistrer automatiquement en format pdf. Pour ce faire, en utilisant un AppleScript vous utiliseriez le code suivant:

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

L'application CUPS-PDF enregistre toutes les sorties vers/Users/Shared/CUPS-PDF. Je ne suis pas sûr si vous pouvez changer ce chemin, mais vous pouvez récupérer le fichier dans votre script et le déplacer.

Il existe cependant quelques réserves.

D'abord, la commande lp ne peut pas imprimer les fichiers .doc. Je pense qu'il existe d'autres applications tierces qui vous permettront de faire cela. Deuxièmement, l'application CUPS-PDF affiche dans le volet Imprimante des Préférences Système le trait d'union dans son nom, mais CUPS affiche le nom de la file d'attente comme ayant un trait de soulignement. Donc, sur la ligne de commande, vous devez vous référer 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 construire un script via le lp commande et veulent toujours impliquer les scripts GUI puis d'avoir une imprimante virtuelle devrait vous faire économiser quelques étapes.

1

vous pouvez utiliser des tasses comme ce

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 
1

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

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

-bash:/System/Bibliothèque/Printers/Libraries/convert: No such fichier ou répertoire –