Как сохранить текущую вкладку сафари с помощью ScriptingBridge

Я пытаюсь использовать мост сценариев, чтобы сообщить 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.

Кто-нибудь может помочь?

Заранее спасибо.


person MildC    schedule 22.06.2012    source источник


Ответы (1)


Так что ни 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/

person ray    schedule 14.07.2012