문제

사용자가 PDF에서 생성 해야하는 문서 모음 (모든 응용 프로그램에서)을 선택할 수있는 OSX 프로젝트를 진행하고 있습니다. 표준 Macintosh 인쇄 대화 상자에는 PDF 버튼이 있으며 "PDF로 저장 ..."를 포함하여 여러 PDF 관련 명령이 있습니다. 그러나 사용자 상호 작용없이 PDF 파일을 생성해야합니다. 이상적으로는 이것이 모든 유형의 문서와 함께 작동하기를 원합니다.

지금까지 내가 탐색 한 옵션은 다음과 같습니다.

  • 자동화기 행동. Automator 용 PDF 라이브러리가 있지만 PDF 파일을 생성하지 않고 PDF 파일로 작업하는 작업을 제공합니다. 파일을 인쇄하기위한 파인더 동작이 있지만 실제 프린터에만 인쇄합니다.
  • 사과 스크립트. 일부 응용 프로그램은 PDF 파일을 생성 할 수있는 기능이 있습니다 (예 : 'Test.pdf'에서 'Save Doc'을 페이지에 보내면 PDF가 생성됩니다 (그러나 페이지에만 작동합니다. 모든 유형의 문서에 대한 지원이 필요합니다). .
  • 맞춤형 프린터. 가상 프린터 드라이버를 생성 한 다음 Automator 동작을 사용할 수는 있지만 인쇄 목록에 추가 프린터와 사용자를 혼동한다는 아이디어가 마음에 들지 않습니다.

내 희망은 사용자가 다음 단계를 수행하는 것처럼 활성 응용 프로그램과 상호 작용할 수있는 방법이 있기를 바랍니다.

  1. CMD-P 수행 (인쇄 대화 상자 열기)
  2. "PDF"버튼을 클릭하십시오
  3. "PDF로 저장 ..."(메뉴의 두 번째 항목)를 선택하십시오.
  4. 저장 대화 상자에 파일 이름을 입력하십시오
  5. "저장"을 클릭하십시오.

그것이 최선의 접근법이라면 (입니까?) 실제 문제는 다음과 같습니다. UI 이벤트를 외부 응용 프로그램 (키 스트로크, 마우스 이벤트, 메뉴 선택)으로 어떻게 보내나요?

업데이트: 한 가지 요점을 명확히하기 위해 : PDF로 변환 해야하는 문서는 다른 응용 프로그램. 예를 들어, 사용자는 Word 문서 나 숫자 스프레드 시트 또는 Omnigraffle Drawing 또는 웹 페이지를 선택할 수 있습니다. 공통 분모는 이러한 각 문서에 관련 응용 프로그램이 있으며 응용 프로그램은 인쇄 방법을 알고 있다는 것입니다 (OSX는 PDF 파일로 인쇄 출력을 렌더링하는 방법을 알고 있습니다).

따라서 Cocoa Dev Central의 샘플은 PDF를 생성하기 때문에 도움이되지 않습니다. 내 응용 프로그램.

도움이 되었습니까?

해결책

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

다른 팁

라는 프로그램을 살펴보십시오 컵 -PDF

OS X의 가상 프린터로서 "PDF로 저장"메소드가 일반 프린터를 통해 인쇄 할 때 모든 인쇄 작업을 통과하는 것을 제외하고 PDF 출력이 발생합니다.

설치하면 LP 명령.

예를 들어, 가상 프린터가 설정되면 TEXT.TXT를 인쇄하고 PDF로 자동 저장할 수 있습니다. 사과 스크립트를 사용하여이를 수행하려면 다음 코드를 사용합니다.

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

CUPS-PDF 앱은 모든 출력을/사용자/공유/컵 -PDF에 저장합니다. 그 경로를 변경할 수 있는지 확실하지 않지만 스크립트에서 파일을 검색하여 이동할 수 있습니다.

그래도 몇 가지 경고가 있습니다.

먼저 LP 명령은 .doc 파일을 인쇄 할 수 없습니다. 그래도이 작업을 수행 할 수있는 다른 타사 앱이 있다고 생각합니다.

둘째, Cups-PDF 앱은 프린터 창에서 시스템 환경 설정의 이름에 하이픈이있는 것으로 표시되지만 컵은 큐 이름이 밑줄이있는 것으로 표시됩니다. 따라서 명령 줄에서 밑줄이있는 cups_pdf 인 컵 큐 이름을 참조해야합니다.

당신이 찾지 못하더라도 LP 명령하고 여전히 GUI 스크립팅을 포함시키고 싶고 가상 프린터가 있으면 몇 단계를 저장해야합니다.

이런 컵을 사용할 수 있습니다

    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

나는 이것을 위해 bash에 별명을 만들었습니다.

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

Automator의 도움으로 아래 코드를 입력했습니다 (동작 기록을 녹음 한 다음 사과 스크립트를 얻기 위해 "Watch Me Do"창에서 특정 작업을 드래그). Safari 이외의 응용 프로그램에서 PDF를 인쇄하려면 각 프로그램마다 다른 인쇄 GUI를 가질 수 있으므로 동일한 프로세스를 실행하고 인쇄 대화 에서이 사과 스크립트를 조정해야 할 수도 있습니다.

# 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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top