سؤال

أنا أعمل على مشروع OSX حيث يمكن للمستخدم اختيار مجموعة من الوثائق (من أي تطبيق) التي لا تحتاج إلى إنشاء PDF من.ماكنتوش القياسية مربع الحوار "طباعة" لديه PDF الزر الذي يحتوي على عدد من PDF الأوامر ذات الصلة بما في ذلك "Save as PDF...".ومع ذلك ، لا تحتاج إلى إنشاء ملف PDF دون الحاجة إلى تفاعلات المستخدم.أنا من الناحية المثالية تريد أن تعمل مع أي نوع من الوثائق.

هنا الخيارات كنت استكشافها حتى الآن:

  • اتمتة الأعمال.هناك نسخة PDF مكتبة الأوتوماتيكية ولكنه يوفر إجراءات العمل مع ملفات PDF, لا تولد لهم.هناك الباحث عن عمل طباعة أي ملف ولكن فقط إلى طابعة حقيقية.
  • AppleScript.بعض التطبيقات لديها القدرة على توليد ملفات PDF (على سبيل المثال ، إذا قمت بإرسال 'حفظ دكتور في "اختبار.pdf" إلى صفحات فإنه سيتم إنشاء PDF (ولكن هذا يعمل فقط على صفحات أحتاج دعم أي نوع من الوثيقة).
  • مخصص الطابعة.لا يمكن إنشاء برنامج تشغيل الطابعة الافتراضية ثم استخدام اتمتة العمل ولكن أنا لا أحب فكرة مربكة للمستخدم إضافية الطابعة في طباعة القائمة.

أملي هو أن هناك طريقة للتفاعل مع التطبيق النشط كما لو كان المستخدم بتنفيذ الخطوات التالية:

  1. هل Cmd-P (فتح مربع الحوار "طباعة")
  2. انقر فوق "PDF" زر
  3. اختر "Save as PDF..." (البند الثاني في القائمة)
  4. اكتب اسم الملف في مربع الحوار حفظ
  5. انقر فوق "حفظ"

إذا كان هذا هو أفضل نهج ( ؟ ) ثم المشكلة الحقيقية هي:كيف يمكنني إرسال واجهة الأحداث إلى تطبيق خارجي (ضربات المفاتيح, الماوس الأحداث ، تحديدات القائمة) ?

تحديث: فقط لتوضيح نقطة واحدة:الوثائق تحتاج إلى تحويل إلى PDF هي المستندات التي يتم إنشاؤها من قبل التطبيقات الأخرى.على سبيل المثال, يمكن للمستخدم اختيار مستند Word أو جدول بيانات أو أرقام غير OmniGraffle الرسم أو صفحة ويب.القاسم المشترك هو أن كل من هذه الوثائق المرتبطة التطبيق هذا التطبيق يعرف كيفية طباعة (و OSX يعرف كيف تجعل إخراج الطباعة إلى ملف PDF).

لذا العينات في الكاكاو ديف المركزية لا تساعد لأنهم عن توليد PDF من طلبي.

هل كانت مفيدة؟

المحلول

أعتقد أنه يمكنك استخدام applescript لفتح مستند ثم استخدامه البرمجة النصية لواجهة مستخدم applescript لاستدعاء قائمة الطباعة.

على سبيل المثال :

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

هي الطابعة الافتراضية لنظام التشغيل العاشر الذي يفعل ما "Save As PDF" الأسلوب عند الطباعة من خلال جهاز طابعة عادية باستثناء كل مهمة الطباعة من خلاله النتائج في ملف pdf الناتج.

بمجرد تثبيته ثم يمكنك إنشاء قذيفة أو AppleScripts باستخدام lp الأوامر.

على سبيل المثال مرة واحدة في الطابعة الافتراضية هو الإعداد يمكنك طباعة test.txt ويكون ذلك تلقائيا حفظ كملف pdf.للقيام بذلك باستخدام AppleScript يمكنك استخدام التعليمات البرمجية التالية:

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

أكواب-PDF التطبيق يحفظ جميع إخراج /Users/Shared/أكواب-PDF.أنا لست متأكدا مما إذا كان يمكنك تغيير هذا المسار ولكن هل يمكن استرداد الملف في البرنامج النصي الخاص بك ونقله.

هناك بعض المحاذير على الرغم من.

أولا ، lp الأمر لا يمكن طباعة .ملفات doc.أعتقد أن هناك بعض تطبيقات الطرف الثالث والتي سوف تسمح لك أن تفعل هذا على الرغم من.

الثانية, كوب-PDF التطبيق يظهر في الطابعة جزء من نظام الأفضليات وجود واصلة في اسمها ولكن أكواب يظهر اسم قائمة الانتظار بعد تسطير.لذا على سطر الأوامر تحتاج إلى الرجوع إلى كوب اسم قائمة الانتظار التي CUPS_PDF مع تسطير.

حتى إذا كنت لا تجد أنه من المفيد جدا لبناء النصي عبر lp الأمر ولا تزال ترغب في إشراك واجهة البرمجة ثم وجود طابعة افتراضية يجب أن يوفر لك بعض الخطوات.

يمكنك استخدام أكواب مثل هذا

    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

لقد قمت بإنشاء اسم مستعار في باش لهذا:

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

لقد قمت بكتابة الكود أدناه بمساعدة Automator (تسجيل إجراء، ثم سحب الإجراء المحدد من نافذة "Watch Me Do" للحصول على Applescript).إذا كنت تريد طباعة ملف PDF من تطبيق آخر غير Safari، فقد يتعين عليك تنفيذ نفس العملية وتعديل 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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top