如何以编程方式从OSX上的任何文档生成PDF?

Den*_*ssy 18 pdf macos applescript objective-c automator

我正在为OSX开发一个项目,用户可以从中选择我需要生成PDF文档的文档集合(来自任何应用程序).标准的"Macintosh打印"对话框有一个PDF按钮,其中包含许多与PDF相关的命令,包括"另存为PDF ...".但是,我需要生成PDF文件而无需用户交互.理想情况下,我希望这适用于任何类型的文档.

这是我到目前为止探讨的选项:

  • Automator动作.有一个用于Automator的PDF库,但它提供了处理PDF文件的操作,而不是生成它们.有一个Finder操作可以打印任何文件,但只能打印到真正的打印机.
  • AppleScript的.某些应用程序能够生成PDF文件(例如,如果您将'save doc in"test.pdf"'发送到Pages,它将生成PDF(但这仅适用于Pages - 我需要支持任何类型的文档) .
  • 定制打印机.我可以创建一个虚拟打印机驱动程序,然后使用自动机操作,但我不喜欢在打印列表中将用户与额外的打印机混淆的想法.

我希望有一些方法可以与活动应用程序进行交互,就像用户执行以下步骤一样:

  1. 做Cmd-P(打开打印对话框)
  2. 单击"PDF"按钮
  3. 选择"另存为PDF ..."(菜单中的第二项)
  4. 在保存对话框中键入文件名
  5. 点击"保存"

如果这是最好的方法(是吗?)那么真正的问题是:如何将UI事件发送到外部应用程序(击键,鼠标事件,菜单选择)?

更新:只是澄清一点:我需要转换为PDF的文档是由其他应用程序创建的文档.例如,用户可能会选择Word文档或Numbers电子表格或OmniGraffle绘图或网页.常见的分母是这些文档中的每一个都有一个相关的应用程序,该应用程序知道如何打印它(OSX知道如何将打印输出呈现为PDF文件).

因此,Cocoa Dev Central的样本没有帮助,因为它们是关于从我的应用程序生成PDF .

Tim*_*our 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
Run Code Online (Sandbox Code Playgroud)

  • -1如果你在safari中打开文件,这似乎是一个很好的方法,但我确定你不想为每个可能的应用程序编写正确的代码 (2认同)