我正在尝试使用脚本桥来告诉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框架
任何人都可以提供帮助吗?
提前致谢。
答案 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文件执行更多步骤。
您可以在此处找到wkpdf
:http://plessl.github.com/wkpdf/