Comment générer programmatiquement un PDF à partir d'un document sur OSX?
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 à partir. Le dialogue D'impression standard Macintosh est doté d'un bouton PDF qui comporte un certain nombre de commandes liées au format PDF, dont "Enregistrer sous format PDF"...". Cependant, je dois générer le fichier PDF sans avoir besoin d'interactions avec les utilisateurs. J'idéalement voulez que cela fonctionne avec n'importe quel type de document.
Voici les options que j'ai explorées loin:
- actions Automator. Il y a une bibliothèque PDF pour Automator mais elle fournit des actions pour travailler avec des fichiers PDF, pas les générer. Il y a une action Finder pour imprimer n'importe quel fichier, mais seulement sur une vraie imprimante.
- AppleScript. Certaines applications ont la capacité de générer des fichiers PDF (par exemple, si vous envoyez 'enregistrer le doc dans "essai.pdf "' aux Pages il va générer un PDF (mais cela ne fonctionne que pour les Pages - j'ai besoin de soutien pour tout type de document.)
- Imprimante Personnalisée. Je pourrais créer une imprimante virtuelle et ensuite utiliser l'action automator mais je n'aime pas l'idée de confusion de l'utilisateur avec un supplément de l'imprimante dans la liste d'impression.
J'espère qu'il y a un moyen d'interagir avec l'application active comme si l'utilisateur effectuait les étapes suivantes:
- Cmd-P (ouvre la boîte de dialogue imprimer)
- cliquez sur le bouton" PDF"
- Sélectionnez " Enregistrer sous format PDF..." (deuxième élément dans le menu)
- tapez le nom du fichier dans la boîte de dialogue Enregistrer
- Cliquez Sur "Enregistrer"
Si c'est la meilleure approche (est-il?) alors le vrai problème est: comment envoyer des événements UI à une application externe (frappes, événements souris, sélections de menu) ?
mise à Jour: juste pour clarifier un point: les documents que je dois convertir en PDF sont des documents qui sont créés par autres applications. Par exemple, l'utilisateur peut choisir un document Word ou une feuille de calcul numérique ou un dessin Omnigrafle 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 d'impression à un fichier PDF).
ainsi, les échantillons à Cocoa Dev Central n'aident pas parce qu'ils sont au sujet de générer un PDF à partir de ma demande.
5 réponses
je pense que vous pouvez utiliser applescript pour ouvrir un document, puis l'utiliser applescript INTERFACE de script 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
jetez un oeil à un programme appelé TASSES-PDF
il s'agit d'une imprimante virtuelle pour OS X qui fait ce que fait la méthode "Save As PDF" lorsqu'elle est imprimée par l'intermédiaire de votre imprimante normale, sauf que chaque tâche d'impression qui la traverse donne lieu à une sortie pdf.
Une fois que vous l'installez, vous pouvez créer shell ou AppleScripts en utilisant le lp la commande.
par exemple, une fois l'imprimante virtuelle configurée, vous pouvez imprimer test.txt et l'ont enregistrer automatiquement en pdf. Pour ce faire, vous devez utiliser 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 que vous puissiez changer ce chemin mais vous pouvez récupérer le fichier dans votre script et le déplacer.
Il y a cependant quelques mises en garde.
tout d'Abord, le lp commande ne peut pas imprimer .les fichiers doc. Je pense qu'il y a d'autres applications tierces qui vous permettra de faire de cette bien.
Deuxièmement, L'application CUPS-PDF montre dans le volet D'Imprimante Des Préférences Système comme ayant le trait d'Union dans son nom mais CUPS montre le nom de file comme ayant un underscore. 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 underscore.
même si vous ne trouvez pas très utile de construire un script via le lp commande et vous voulez toujours impliquer GUI scripting alors avoir une imprimante virtuelle devrait vous sauver un peu étape.
vous pouvez utiliser des tasses comme ceci
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 en bash pour ceci:
convert2pdf() {
/System/Library/Printers/Libraries/convert -f "" -o "" -j "application/pdf"
}
j'ai tapé le code ci-dessous avec L'aide D'Automator (enregistrement d'une action, puis déplacement de l'action spécifique de la fenêtre "Watch Me Do" afin d'obtenir le Applescript). Si vous voulez imprimer un PDF à partir d'une application autre que Safari, vous pourriez avoir à exécuter le même processus et à modifier ce Applescript autour du dialogue D'impression, puisque chaque programme pourrait avoir une interface graphique 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