2008-11-09 22 views
18

मैं ओएसएक्स के लिए एक परियोजना पर काम कर रहा हूं जहां उपयोगकर्ता दस्तावेजों का संग्रह (किसी भी आवेदन से) चुन सकता हूं जिसे मुझे पीडीएफ उत्पन्न करने की आवश्यकता है। मानक मैकिंतोश प्रिंट संवाद में एक पीडीएफ बटन है जिसमें कई पीडीएफ से संबंधित कमांड हैं जिनमें "पीडीएफ के रूप में सहेजें ..." शामिल है। हालांकि, मुझे यूजर इंटरैक्शन की आवश्यकता के बिना पीडीएफ फाइल जेनरेट करने की जरूरत है। मैं आदर्श रूप से किसी भी प्रकार के दस्तावेज़ के साथ काम करना चाहता हूं।ओएसएक्स पर किसी दस्तावेज़ से प्रोग्रामेटिक रूप से पीडीएफ कैसे उत्पन्न करें?

विकल्प यहां मैं अब तक का पता लगाया गया है:

  • स्वचालक कार्रवाई। ऑटोमेटर के लिए एक पीडीएफ लाइब्रेरी है लेकिन यह पीडीएफ फाइलों के साथ काम करने के लिए क्रियाएं प्रदान करती है, न कि उन्हें उत्पन्न करती है। किसी फ़ाइल को प्रिंट करने के लिए एक खोजक कार्रवाई है लेकिन केवल एक वास्तविक प्रिंटर के लिए।
  • ऐप्पलस्क्रिप्ट। कुछ अनुप्रयोगों में पीडीएफ फाइलें उत्पन्न करने की क्षमता होती है (उदाहरण के लिए, यदि आप पेजों में 'test.pdf' में 'सेव डॉक' भेजते हैं तो यह पीडीएफ उत्पन्न करेगा (लेकिन यह केवल पेजों के लिए काम करता है - मुझे किसी भी प्रकार के दस्तावेज़ के लिए समर्थन चाहिए) ।
  • कस्टम प्रिंटर। मैं एक आभासी प्रिंटर ड्राइवर बना सकते हैं और उसके बाद स्वचालक कार्रवाई का उपयोग, लेकिन मैं प्रिंट सूची में एक अतिरिक्त प्रिंटर के साथ उपयोगकर्ता को भ्रमित करने के विचार पसंद नहीं है।

मेरे आशा है कि सक्रिय अनुप्रयोग से बातचीत करने का कोई तरीका है जैसे कि उपयोगकर्ता निम्नलिखित चरणों का पालन कर रहा था:

  1. क्या सीएमडी-पी (प्रिंट संवाद खोलता है)
  2. "पीडीएफ" बटन
  3. चुनें "सहेजें पीडीएफ के रूप में ..." (मेनू में दूसरे मद)
  4. फ़ाइल नाम में टाइप बचाने संवाद
  5. क्लिक करें "सहेजें"

तो में क्लिक करें यह सबसे अच्छा तरीका है (है ना?) तो वास्तविक समस्या यह है: मैं बाहरी अनुप्रयोगों (कीस्ट्रोक, माउस इवेंट्स, मेनू चयन) में UI ईवेंट कैसे भेजूं?

अद्यतन: बस एक बिंदु स्पष्ट करने के लिए: दस्तावेजों मैं पीडीएफ कन्वर्ट करने के लिए की जरूरत दस्तावेजों अन्य अनुप्रयोगों द्वारा बनाई गई हैं कि कर रहे हैं। उदाहरण के लिए, उपयोगकर्ता वर्ड डॉक्यूमेंट या नंबर स्प्रैडशीट या ओमनीग्राफ ड्रॉइंग या वेब पेज चुन सकता है। आम संप्रदाय यह है कि इनमें से प्रत्येक दस्तावेज़ में एक संबद्ध अनुप्रयोग है और वह एप्लिकेशन जानता है कि इसे कैसे प्रिंट किया जाए (और ओएसएक्स जानता है कि पीडीएफ फ़ाइल में प्रिंट आउटपुट कैसे प्रस्तुत किया जाए)।

तो, कोको देव सेंट्रल के नमूने मदद नहीं करते हैं क्योंकि वे से मेरा पीडीएफ पीढ़ी बनाने के बारे में हैं

उत्तर

6

मुझे लगता है कि आप दस्तावेज़ खोलने के लिए सेबस्क्रिप्ट का उपयोग कर सकते हैं और फिर प्रिंट मेनू का आह्वान करने के लिए applescript UI scripting का उपयोग कर सकते हैं।

उदाहरण के लिए:

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

धन्यवाद! वह वही सूचक था जिसे मैं ढूंढ रहा था। –

+2

-1 यह एक अच्छा दृष्टिकोण जैसा प्रतीत होता है यदि आप सफारी में एक फ़ाइल खोलते हैं लेकिन मुझे यकीन है कि आप हर संभव ऐप – mcgrailm

0

मैं स्वचालक की सहायता से नीचे कोड ऊपर लिखा जाता है (एक कार्रवाई की रिकॉर्डिंग, और फिर से बाहर विशिष्ट कार्रवाई खींच "देखो मेरे करो" आदेश प्राप्त करने के लिए खिड़की applescript)। अगर आप सफारी के अलावा किसी अन्य एप्लिकेशन से पीडीएफ प्रिंट करना चाहते हैं, तो आपको एक ही प्रक्रिया के माध्यम से भागना पड़ सकता है और प्रिंट संवाद के आस-पास इस एप्पलस्क्रिप्ट को ट्विक करना पड़ सकता है, क्योंकि प्रत्येक प्रोग्राम में एक अलग प्रिंट 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 
2

नाम के एक कार्यक्रम पर एक नजर डालें CUPS-PDF

यह जो क्या "पीडीएफ के रूप में सहेजें" विधि करता है ओएस एक्स के लिए एक आभासी प्रिंटर है जब हर मुद्रण कार्य के माध्यम से पारित छोड़कर अपने सामान्य प्रिंटर के माध्यम से प्रिंट इसका परिणाम पीडीएफ आउटपुट में होता है।

एक बार जब आप इसे इंस्टॉल कर लेंगे तो आप एलपी कमांड का उपयोग करके खोल या ऐप्पलScripts बना सकते हैं।

उदाहरण के लिए, वर्चुअल प्रिंटर सेटअप होने के बाद आप test.txt प्रिंट कर सकते हैं और इसे स्वचालित रूप से पीडीएफ के रूप में सहेज सकते हैं। का उपयोग कर एक AppleScript आप निम्न कोड का प्रयोग करेंगे ऐसा करने के लिए:

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

कप-पीडीएफ एप्लिकेशन/उपयोगकर्ताओं/साझा/कप-पीडीएफ करने के लिए सभी उत्पादन बचाता है। मुझे यकीन नहीं है कि क्या आप उस पथ को बदल सकते हैं लेकिन आप अपनी स्क्रिप्ट में फ़ाइल पुनर्प्राप्त कर सकते हैं और इसे स्थानांतरित कर सकते हैं।

हालांकि कुछ चेतावनी हैं।

सबसे पहले, एलपी कमांड .doc फ़ाइलों को मुद्रित नहीं कर सकता है। मुझे लगता है कि कुछ अन्य तृतीय पक्ष ऐप्स हैं जो आपको ऐसा करने की अनुमति देंगे।

दूसरा, सीयूपीएस-पीडीएफ ऐप सिस्टम प्राथमिकताओं के प्रिंटर फलक में उसके नाम पर हाइफ़न होने के रूप में दिखाता है लेकिन सीयूपीएस कतार का नाम अंडरस्कोर के रूप में दिखाता है। तो, कमांड लाइन पर आपको CUPS कतार नाम का संदर्भ देना होगा जो एक अंडरस्कोर के साथ CUPS_PDF है।

यहां तक ​​कि अगर आप इसे बहुत ही उपयोगी एल.पी. आदेश के माध्यम से एक स्क्रिप्ट का निर्माण और अभी भी करने के लिए भी नहीं मिलता है तो जीयूआई पटकथा शामिल करने के लिए एक आभासी प्रिंटर आप कुछ कदम बचाने चाहिए होने चाहते हैं।

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 
1

मैं इसके लिए पार्टी में एक उपनाम बनाया है की तरह इस्तेमाल कर सकते हैं कप:

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

-bash:/सिस्टम/लाइब्रेरी/प्रिंटर/पुस्तकालय/कनवर्ट करने के लिए सही कोड नहीं चाहते हैं: ऐसा नहीं फ़ाइल या निर्देशिका –

संबंधित मुद्दे