如何使用ScriptingBridge保存当前的safari选项卡

时间:2012-06-22 04:47:45

标签: objective-c safari scripting-bridge

我正在尝试使用脚本桥来告诉Safari将当前页面保存为PDF

在" Safari.h"头文件存在一个SafariItem类的保存方法:

- (void) saveAs:(NSString *)as in:(NSURL *)in_;

所以我用过它,但它不起作用:

[safariCurrentTab saveAs:@".PDF" in:filePath];

后来我注意到保存为PDF是在Safari.app的打印选项中,所以我尝试使用此功能

- (void) print:(NSURL *)x printDialog:(BOOL)printDialog withProperties:(SafariPrintSettings *)withProperties;

但是,当我尝试初始化SafariPrintSettings对象时,它导致编译错误:

Undefined symbols for architecture x86_64:
"_OBJC_CLASS_$_SafariPrintSettings", referenced from:
  objc-class-ref in AppDelegate.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

似乎编译器没有找到该类,但我确实包含了头文件并添加了ScriptingBridge框架

任何人都可以提供帮助吗?

提前致谢。

1 个答案:

答案 0 :(得分:2)

因此saveAs:SafariPrintSettings都不起作用。

Safari应用程序中的“另存为...”功能仅提供HTML,而Scripting Bridge仅为您提供这些选项。这是要记住的事情:Scripting Bridge是一种自动执行界面操作的方法。

“打印到PDF”除外。没有用于生成PDF的打印机对象。 OS X调用一个(或许多,很难说)实用程序将HTML转换为PDF。

使用NSTask

的可能解决方案

/System/Libary/Printers/Libraries/中你会发现convert(不要与系统范围的ImageMagick转换混淆......它们不一样!)。如果你想走这条路,你必须首先将页面保存为HTML文件,然后你可以使用NSTask来运行convert命令,就像这样:

NSTask *convert = [[NSTask alloc] init];
[convert setLaunchPath:@"/System/Libary/Printers/Libraries/convert"];
[convert setArguments:[NSArray arrayWithObjects:@"-f",@"fileYouSaved.html",@"-o","foo.pdf",nil]];
//set output and so on...
[convert launch];
//this runs the command as if it were "convert -f fileYouSaved.html -o foo.pdf"

但它看起来很脆弱;在我试过的一些更广泛的网站上,有些元素被悬挂在“可打印”页面上。

最简单的解决方案

有一个第三方命令行应用程序/ Ruby gem可能会删除大量名为wkpdf的工作。你只需执行:

wkpdf --source http://www.apple.com --output apple.pdf

它将在线抓取页面并执行您需要的操作。或者,一旦您在系统上安装了它,您也可以使用NSTask在您的应用中调用它,如果您需要使用PDF文件执行更多步骤。

您可以在此处找到wkpdfhttp://plessl.github.com/wkpdf/