2008-11-09 14 views
18

Tôi đang làm việc trên một dự án cho OSX, nơi người dùng có thể chọn một bộ sưu tập các tài liệu (từ bất kỳ ứng dụng nào) mà tôi cần để tạo PDF từ đó. Hộp thoại Macintosh Print chuẩn có nút PDF có một số lệnh liên quan đến PDF bao gồm "Lưu dưới dạng PDF ...". Tuy nhiên, tôi cần tạo tệp PDF mà không yêu cầu tương tác của người dùng. Tôi lý tưởng muốn điều này để làm việc với bất kỳ loại tài liệu.Làm thế nào để lập trình tạo PDF từ bất kỳ tài liệu nào trên OSX?

Dưới đây là các tùy chọn Tôi đã khám phá cho đến nay:

  • hành động Automator. Có một thư viện PDF cho Automator nhưng nó cung cấp các hành động để làm việc với các tệp PDF, không tạo ra chúng. Có một hành động tìm kiếm để in bất kỳ tệp nào mà chỉ cho một máy in thực.
  • AppleScript. Một số ứng dụng có khả năng tạo tệp PDF (ví dụ: nếu bạn gửi 'lưu tài liệu trong "test.pdf"' vào Trang, nó sẽ tạo tệp PDF (nhưng điều này chỉ hoạt động cho Trang - Tôi cần hỗ trợ cho bất kỳ loại tài liệu nào) .
  • Tuỳ chỉnh máy in. tôi có thể tạo ra một trình điều khiển máy in ảo và sau đó sử dụng các công cụ tự động hành động nhưng tôi không thích ý tưởng về bối rối cho người dùng một máy in thêm trong danh sách in.

Hy vọng của tôi là có một số cách để tương tác với ứng dụng đang hoạt động như thể người dùng đang thực hiện các bước sau:

  1. Làm Cmd-P (mở hộp thoại in)
  2. Nhấp vào nút "PDF"
  3. Chọn "Save as PDF ..." (mục thứ hai trong menu)
  4. Gõ vào tên tập tin trong tiết kiệm thoại
  5. Bấm "Save"

Nếu đó là cách tiếp cận tốt nhất (phải không?) thì vấn đề thực sự là: làm cách nào để gửi sự kiện giao diện người dùng đến ứng dụng bên ngoài (tổ hợp phím, sự kiện chuột, lựa chọn menu)?

Cập nhật: Chỉ cần làm rõ một điểm: tài liệu tôi cần chuyển đổi sang PDF là tài liệu được tạo bởi các ứng dụng khác. Ví dụ: người dùng có thể chọn tài liệu Word hoặc bảng tính Số hoặc bản vẽ OmniGraffle hoặc Trang Web. Mẫu số chung là mỗi tài liệu này có một ứng dụng liên quan và ứng dụng đó biết cách in nó (và OSX biết cách render kết xuất in ra tệp PDF).

Vì vậy, các mẫu tại Cocoa Dev Central không giúp đỡ vì chúng đang tạo PDF từ đơn đăng ký của tôi.

Trả lời

6

Tôi nghĩ bạn có thể sử dụng bản ghi chép để mở tài liệu và sau đó sử dụng applescript UI scripting để gọi trình đơn in.

Ví dụ:

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

Cảm ơn! Đó chính là con trỏ tôi đang tìm kiếm. –

+2

-1 Điều này có vẻ giống như một cách tiếp cận tốt nếu bạn mở một tệp trong safari nhưng tôi chắc chắn bạn không muốn mã đúng cho mọi ứng dụng có thể – mcgrailm

0

Tôi gõ lên đoạn code dưới đây với sự hỗ trợ của Automator (ghi một hành động, và sau đó kéo các hành động cụ thể ra khỏi "Watch Me Do" cửa sổ để có được Bản tóm tắt). Nếu bạn muốn in một tệp PDF từ một ứng dụng khác ngoài Safari, bạn có thể phải chạy qua cùng một quy trình và chỉnh sửa Bản tóm tắt này xung quanh đối thoại In, vì mỗi chương trình có thể có Giao diện In khác nhau.

# 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

Hãy xem một chương trình gọi là CUPS-PDF

Nó là một máy in ảo cho OS X mà làm những gì "Save As PDF" phương pháp thực hiện khi in qua máy in bình thường của bạn ngoại trừ mỗi việc in qua nó cho kết quả đầu ra pdf.

Sau khi bạn cài đặt, bạn có thể tạo vỏ hoặc AppleScripts bằng cách sử dụng lệnh lp.

Ví dụ: khi máy in ảo được thiết lập, bạn có thể in test.txt và tự động lưu dưới dạng pdf. Để thực hiện việc này bằng cách sử dụng AppleScript, bạn sẽ sử dụng mã sau:

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

Ứng dụng CUPS-PDF lưu tất cả đầu ra vào/Users/Shared/CUPS-PDF. Tôi không chắc chắn nếu bạn có thể thay đổi đường dẫn đó nhưng bạn có thể lấy tập tin trong kịch bản của bạn và di chuyển nó.

Mặc dù vậy, có một số điều cần lưu ý.

Đầu tiên, lệnh lp không thể in tệp .doc. Tôi nghĩ rằng có một số ứng dụng của bên thứ ba khác mà sẽ cho phép bạn làm điều này mặc dù.

Thứ hai, ứng dụng CUPS-PDF hiển thị trong ngăn Máy in của Tùy chọn Hệ thống dưới dạng dấu gạch nối trong tên nhưng CUPS hiển thị tên hàng đợi có dấu gạch dưới. Vì vậy, trên dòng lệnh, bạn cần tham khảo tên hàng đợi CUPS là CUPS_PDF với dấu gạch dưới.

Thậm chí nếu bạn không thấy nó rất hữu ích để xây dựng tập lệnh thông qua lệnh lp lệnh và vẫn muốn liên quan đến GUI script thì có một máy in ảo sẽ giúp bạn lưu một số bước.

1

bạn có thể sử dụng cốc như thế này

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

Tôi đã tạo ra một bí danh trong bash cho việc này:

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

-bash:/System/Library/Printers/Libraries/convert: Không tệp hoặc thư mục –