18

私はOSXのプロジェクトに取り組んでおり、ユーザーはPDFを生成するために必要なドキュメントのコレクションを(任意のアプリケーションから)選択できます。標準のMacintosh印刷ダイアログには、「PDFとして保存...」を含むPDF関連のコマンドが多数あるPDFボタンがあります。ただし、ユーザーの操作を必要とせずにPDFファイルを生成する必要があります。理想的には、これがあらゆるタイプのドキュメントで機能することを望んでいます。

これまでに調べたオプションは次のとおりです。

  • Automatorアクション。Automator用のPDFライブラリがありますが、PDFファイルを生成するのではなく、操作するためのアクションを提供します。任意のファイルを実際のプリンターにのみ印刷するためのFinderアクションがあります。
  • AppleScript。一部のアプリケーションにはPDFファイルを生成する機能があります(たとえば、「test.pdf」に「save doc」を送信すると、PDFが生成されます(ただし、これはPagesでのみ機能します-あらゆるタイプのドキュメントのサポートが必要です) 。
  • カスタムプリンター。仮想プリンタードライバーを作成してからオートマターアクションを使用することもできますが、ユーザーを印刷リスト内の追加のプリンターと混同するという考えは好きではありません。

私の希望は、ユーザーが次の手順を実行しているかのように、アクティブなアプリケーションと対話する方法があることです。

  1. Cmd-Pを実行します(印刷ダイアログを開きます)
  2. 「PDF」ボタンをクリックしてください
  3. 「PDFとして保存...」(メニューの2番目の項目)を選択します
  4. 保存ダイアログにファイル名を入力します
  5. 「保存」をクリックします

それが最善のアプローチである場合(そうですか?)、本当の問題は次のとおりです。UIイベントを外部アプリケーション(キーストローク、マウスイベント、メニュー選択)に送信するにはどうすればよいですか?

更新: 1つのポイントを明確にするために:PDFに変換する必要があるドキュメントは、他のアプリケーションによって作成されたドキュメントです。たとえば、ユーザーはWordドキュメント、Numbersスプレッドシート、OmniGraffle図面、またはWebページを選択できます。共通の分母は、これらのドキュメントのそれぞれに関連付けられたアプリケーションがあり、そのアプリケーションはそれを印刷する方法を知っている(そしてOSXは印刷出力をPDFファイルにレンダリングする方法を知っている)ということです。

したがって、Cocoa Dev Centralのサンプルは、私のアプリケーションからPDFを生成するためのものであるため、役に立ちません。

4

6 に答える 6

6

Applescript を使用してドキュメントを開き、 Applescript UI スクリプトを使用して印刷メニューを呼び出すことができると思います。

例えば ​​:

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
于 2008-11-10T03:40:18.763 に答える
3

CUPS-PDFというプログラムを見てみましょう

これは OS X 用の仮想プリンターであり、通常のプリンターで印刷するときに「PDF として保存」メソッドが行うことを行いますが、通過したすべての印刷ジョブが PDF 出力になります。

インストールしたら、lpコマンドを使用してシェルまたは AppleScript を作成できます。

たとえば、仮想プリンターがセットアップされたら、test.txt を印刷して、自動的に pdf として保存することができます。AppleScript を使用してこれを行うには、次のコードを使用します。

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

CUPS-PDF アプリは、すべての出力を /Users/Shared/CUPS-PDF に保存します。そのパスを変更できるかどうかはわかりませんが、スクリプトでファイルを取得して移動できます。

ただし、いくつかの注意事項があります。

まず、lpコマンドは .doc ファイルを印刷できません。ただし、これを可能にするサードパーティのアプリが他にもいくつかあると思います。

次に、システム環境設定のプリンター ペインに CUPS-PDF アプリの名前にハイフンが含まれていると表示されますが、CUPS ではキュー名にアンダースコアが含まれていると表示されます。そのため、コマンド ラインで CUPS_PDF という CUPS キュー名をアンダースコアで参照する必要があります。

lpコマンドを使用してスクリプトを作成するのがあまり便利ではなく、GUI スクリプトを使用したい場合でも、仮想プリンターを使用するといくつかの手順を節約できます。

于 2010-11-28T17:18:45.863 に答える
1

このために bash でエイリアスを作成しました。

convert2pdf() {
  /System/Library/Printers/Libraries/convert -f "$1" -o "$2" -j "application/pdf"
}
于 2012-07-20T08:48:29.900 に答える
1

このようなカップを使用できます

    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
于 2010-12-13T14:50:42.497 に答える
0

Automatorを使用して以下のコードを入力しました(アクションを記録し、Applescriptを取得するために特定のアクションを「WatchMeDo」ウィンドウからドラッグします)。Safari以外のアプリケーションからPDFを印刷する場合は、プログラムごとに異なる印刷GUIがある可能性があるため、同じプロセスを実行して、このApplescriptを[印刷]ダイアログで微調整する必要があります。

# 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
于 2010-05-25T19:35:53.793 に答える