Frage

Ich arbeite an einem Projekt für OSX denen der Benutzer auswählen kann eine Sammlung von Dokumenten (von jeder Anwendung), die ich brauche, um zu generieren Sie PDF-Dateien aus.Die standard-Macintosh-Dialogfeld Drucken verfügt über einen PDF-button, der eine Reihe von PDF-zugehörige Befehle, darunter "als PDF Speichern...".Allerdings brauche ich zum generieren der PDF-Datei, ohne die Benutzer-Interaktionen.Ich im Idealfall wollen, dass diese zu arbeiten, mit jeder Art von Dokument.

Hier sind die Optionen, die ich erforscht habe, so weit:

  • Automator-Aktionen.Es ist eine PDF-Bibliothek für Automator, aber es bietet Aktionen für die Arbeit mit PDF-Dateien, die nicht für die Erzeugung.Es gibt ein Finder-Aktion für das drucken eine Datei, sondern nur um einen realen Drucker.
  • AppleScript.Einige Anwendungen verfügen über die Möglichkeit zur Erstellung von PDF-Dateien (zum Beispiel, wenn Sie senden Sie auf 'speichern doc in "test.pdf"' auf Seiten, die es generiert eine PDF-Datei (dies funktioniert aber nur für Seiten, die ich brauche Unterstützung für jede Art von Dokument).
  • Benutzerdefinierte Drucker.Ich könnte erstellen Sie einen virtuellen Drucker Treiber und klicken Sie dann verwenden Sie die automator-Aktion, aber ich mag die Idee, verwirren Sie den user mit einem zusätzlichen Drucker in der Liste drucken.

Meine Hoffnung ist, dass es einige Weg, um die Interaktion mit der aktiven Anwendung, wie wenn der Benutzer die Durchführung der folgenden Schritte:

  1. Do Cmd-P (öffnet den drucken-dialog)
  2. Klicken Sie auf die "PDF" - button
  3. Wählen Sie "als PDF Sichern..." (zweite Position im Menü)
  4. Geben Sie den Dateinamen im Dialogfeld "speichern"
  5. Klicken Sie Auf "Speichern"

Wenn das der beste Ansatz (ist es?) dann das eigentliche problem ist:wie kann ich senden UI-Ereignisse, um eine externe Anwendung (Tastatureingaben, Maus-events, Menü-Auswahlen) ?

Update: Nur um zu verdeutlichen einen Punkt:die Dokumente, die ich brauchen, um zu konvertieren, um PDF-Dokumente erstellt von andere Anwendungen.Für Beispiel, Benutzer könnte wählen Sie ein Word-Dokument oder Numbers-Tabellenkalkulation oder eine OmniGraffle drawing-oder einer Web-Seite.Der gemeinsame Nenner ist, dass jedes dieser Dokumente hat in einer verknüpften Anwendung, und die Anwendung weiß, wie es zu drucken (und OSX weiß, wie zu Rendern Druckausgabe in eine PDF-Datei).

So, die Proben bei Cocoa Dev Mittel helfen nicht, weil Sie über eine PDF-Datei generieren von meine Bewerbung.

War es hilfreich?

Lösung

Ich glaube, Sie Applescript verwenden könnte ein Dokument zu öffnen und verwenden Sie dann Apple UI Scripting Druckmenü aufzurufen.

Zum Beispiel:

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

Andere Tipps

Schauen Sie sich auf ein Programm namens CUPS-PDF

Es ist ein virtueller Drucker für OS X, das tut, was die „Speicher unter PDF“ Methode funktioniert, wenn Druck durch Ihren normalen Drucker außer jeden Druckauftrag durchgeleitet in einer PDF-Ausgabe zur Folge hat.

Wenn Sie es dann installieren Sie Shell oder Applescripts erstellen könnte die lp Befehl.

Zum Beispiel, wenn die virtuellen Drucker-Setup Sie test.txt drucken konnten und haben es automatisch als PDF zu speichern. Um dies zu tun mit einem Apple würden Sie den folgenden Code verwenden:

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

Die CUPS-PDF App speichert alle Ausgabe / Users / Shared / CUPS-PDF. Ich bin nicht sicher, ob Sie diesen Weg ändern, aber man könnte die Datei in Ihrem Skript abrufen und verschieben.

Es gibt allerdings ein paar Einschränkungen.

Zunächst wird die lp Befehl kann nicht .doc-Dateien drucken. Ich denke, es gibt einige andere Anwendungen von Drittanbietern, die Ihnen erlaubt, dies aber zu tun.

Zweitens zeigt der CUPS-PDF-App im Druckerfenster der Systemeinstellungen wie den Bindestrich im Namen hat, aber CUP zeigt den Namen die Warteschlange als einen Unterstrich ist. Also, auf der Kommandozeile müssen Sie die CUP Warteschlangennamen beziehen, die CUPS_PDF mit einem Unterstrich ist.

Auch wenn Sie nicht finden es sehr nützlich, um ein Skript über den lp Befehl zu bauen und immer noch wollen, GUI-Scripting einzubinden dann ein virtueller Drucker zur Verfügung, sollten Sie einige Schritte speichern.

könnten Sie Tassen wie folgt verwenden

    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

Ich habe erstellt einen alias in bash für diese:

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

Ich tippte den Code mit Hilfe von Automator up (eine Aktion aufzeichnen und dann die spezifische Aktion zieht aus dem „Watch Me Do“ Fenstern, um das Applescript zu bekommen). Wenn Sie eine PDF aus einer anderen Anwendung als Safari drucken möchten, können Sie durch den gleichen Prozess ausführen und optimieren dieses Applescript um den Print Dialog, da jedes Programm möglicherweise eine andere Print GUI haben.

# 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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top