Создание PDF-файла с разбивкой по страницам-Mac OS X

Я делаю приложение для Mac (в Swift 3 с помощью Xcode 8, Beta 5), с помощью которого пользователь может сделать длинную заметку и экспортировать ее в PDF.

чтобы создать этот PDF, я использую Cocoa dataWithPDF: метод со следующим кодом:

do {
   // define bounds of PDF as the note text view
   let rect: NSRect = self.noteTextView.bounds
   // create the file path for the PDF
   if let dir = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.allDomainsMask, true).first {
        // add the note title to path
        let path = NSURL(fileURLWithPath: dir).appendingPathComponent("ExportedNote.pdf")
        // Create a PDF of the noteTextView and write it to the created filepath
        try self.noteTextView.dataWithPDF(inside: rect).write(to: path!)  
   } else {
        print("Path format incorrect.") // never happens to me
   }

} catch _ {
    print("something went wrong.") // never happens to me
}

это полностью работает, но есть одна проблема: PDF идет только на одной странице, что означает, что страница становится очень длинной, когда в заметке много текста. Как я могу заставить PDF перейти на столько страниц размером с букву, сколько ему нужно в то время как мое приложение экспортирует в PDF или сразу после?

1 ответов


после нескольких недель разочарования я придумал окончательный способ создания разбитого на страницы PDF в приложении Swift. И это не так сложно, как кажется (следующее основано на Swift 2):


Примечание: прежде чем читать дальше, вы должны знать, что я сделал простой инструмент на Github, чтобы вы могли сделать это за гораздо меньшее количество шагов (и в Swift 3, который больше не нуждается в какой-либо цели-C). проверить вот!--47-->.


Шаг 1: правильно настройте приложение для песочницы. Каждое представленное приложение Mac требует приложения песочницы правильно, поэтому лучше всего взять 30 секунд, чтобы настроить его прямо сейчас. Если он еще не включен, перейдите в настройки цели, а затем в заголовок возможностей. Включите приложение Sandboxing, вверху. Вы должны увидеть много под-возможностей, включить любой из этих ваших потребностей приложения, и убедитесь, что User Selected File набор в Read/Write.

Шаг 2: добавьте эту функцию в свой код, который создаст невидимый webview и добавит в него ваш текст.

func createPDF(fromHTMLString: String) {
            self.webView.mainFrame.loadHTMLString(htmlString, baseURL: nil)
            self.delay(1) {
            MyCreatePDFFile(self.webView)
    }
}

Шаг 3: создать delay() функция, позволяющая Xcode ждать секунду, пока HTML будет загружен в веб-представление.

 func delay(delay:Double, closure:()->()) {
    dispatch_after(
        dispatch_time(
            DISPATCH_TIME_NOW,
            Int64(delay * Double(NSEC_PER_SEC))
        ),
        dispatch_get_main_queue(), closure)
}

(Примечание: Для версии Swift 3 этой функции, иди сюда.)

Шаг 4: Добавить объявление наших WebView над функцией, добавленной на Шаге 2.

var webView = WebView()

Шаг 5: вы можете заметить, что мы не создали еще. Оказывается, нет способа преобразовать этот WebView в PDF с помощью Swift, поэтому нам придется обратиться к Objective-C (стон). Да, вам придется запустить Objective-C в вашем приложении Swift.

Шаг 6: создать .m файл, перейдя в File ->New -> File (или нажать CMD + N) затем дважды щелкните по Objective-C File. Назовите его CreatePDF.m и оставьте его как пустой файл.

Шаг 7: при добавлении .m файл, вы должны получить приглашение добавить заголовок моста:

enter image description here

клик Yes.

если вы не увидели приглашение или случайно удалили заголовок моста, добавьте новый .h файл к вашему проекту и имя оно <#YourProjectName#>-Bridging-Header.h

в некоторых ситуациях, особенно при работе с фреймворками ObjC, вы явно не добавляете класс Objective-C, и Xcode не может найти компоновщик. В этом случае создайте свой заголовок моста .h файл с именем, указанным выше, затем убедитесь, что вы связываете его путь в настройках проекта вашей цели следующим образом:

enter image description here

Шаг 8: создать .h файл, перейдя в File ->New ->File (или наезд CMD + N) затем дважды щелкните по Header File. Назовите его CreatePDF.h.

Шаг 9: в своем CreatePDF.h файл, добавьте следующий код, который импортирует Cocoa и WebKit и настраивает для вашей функции создания PDF:

#ifndef CreatePDF_h
#define CreatePDF_h

#import <Cocoa/Cocoa.h>
#import <WebKit/WebKit.h>

@interface Thing : NSObject

void MyCreatePDFFile(WebView *thewebview);

@end


#endif /* CreatePDF_h */

Шаг 10: время установки .m файл для функции создания PDF. Начните с добавления этого в пустое :

#import "CreatePDF.h"
#import <Cocoa/Cocoa.h>
#import <WebKit/WebKit.h>

@implementation Thing

void MyCreatePDFFile(WebView *thewebview) {

}
@end

Шаг 11: теперь вы можете добавить код