Печать содержимого веб-представления с помощью статического заголовка

Примечание. Я работаю с Swift 4 для macOS.

У меня есть NSTableView, который может быть заполнен данными и сохранен в Core Data. Я хотел бы отображать значения TableView с "дизайном".

Я понял это так:

  • создал шаблон html
  • получить html-код в виде строки и заменить "html placeholders" на мои значения tableview
  • показать измененную строку html через веб-представление

введите описание изображения здесь

Работает хорошо! И это "решение" автоматически выполнит разрывы страницы:)

Вот немного моего кода

// Example with statics values
func createHTML() {
        let pathToHTMLTemplate = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0].appendingPathComponent("basic.html")
        let pathToNoticeHTMLTemplate = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0].appendingPathComponent("notice.html")
        do {
            htmlString = try String(contentsOf: pathToInvoiceHTMLTemplate)
            for _ in 0 ..< 40 {
                var itemHTMLContent = try String(contentsOf: pathToNoticeHTMLTemplate)
                itemHTMLContent = itemHTMLContent.replacingOccurrences(of: "#NOTICE_NAME#", with: "My notice")
                htmlPositionen += itemHTMLContent
            }
            htmlString = htmlString.replacingOccurrences(of: "#NOTICE#", with: htmlPositionen)
            let totalCount = 20 //Fix value as example
            htmlString = htmlString.replacingOccurrences(of: "#TOTAL_COUNT#", with: "\(totalCount)")
            myWebView.mainFrame.loadHTMLString(htmlString, baseURL: nil)
        } catch {}
    }

И я могу напечатать это:

func webView(_ sender: WebView!, didFinishLoadFor frame: WebFrame!) {

        let fileURL = try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false).appendingPathComponent("test.pdf")

        let printInfo = NSPrintInfo.shared
        printInfo.paperSize = NSMakeSize(595.22, 841.85)
        printInfo.isHorizontallyCentered = true
        printInfo.isVerticallyCentered = true
        printInfo.orientation = .portrait
        printInfo.topMargin = 50
        printInfo.rightMargin = 0
        printInfo.bottomMargin = 50
        printInfo.leftMargin = 0
        printInfo.verticalPagination = .autoPagination

        let printOp = NSPrintOperation(view: sender.mainFrame.frameView.documentView, printInfo: printInfo)

        printOp.showsProgressPanel = false
        printOp.showsPrintPanel = false
        printOp.run()
        printOp.cleanUp()
    } 

Но есть проблема:  - Я хотел бы иметь красный заголовок уведомления после того, как каждая страница снова сломается в верхней части

Есть ли у кого-нибудь идея, как я могу это понять?

UPDATE

Возможно, могут помочь эти методы веб-просмотра?

func webView(_ sender: WebView!, drawFooterIn rect: NSRect) {
   // DO SOMETHING
}

func webView(_ sender: WebView!, drawHeaderIn rect: NSRect) {
   // DO SOMETHING
}

Ответ 1

Из того, что я вижу, вы не указали, что используете заголовок для страниц, но вы просто показываете уведомление один раз.

Возможно, вы захотите установить атрибут nsprintinfo.headerandfooter для определения того, что заголовок должен быть напечатан, а затем переместить текст текста/текста заголовка (УВЕДОМЛЕНИЕ и т.д.) в этот раздел.

Не уверен, что NSView будет полезен для вас здесь... там хороший раздел для печати здесь: Руководство по программированию печати для Mac