iOS распечатать NSAttributedString с изображениями в виде NSTextAttachement в PDF - PullRequest
0 голосов
/ 09 февраля 2019

Я пытаюсь преобразовать содержимое UITextView в PDF.UITextView использует NSAttributedString, который содержит текст и изображения.Изображения являются экземплярами NSTextAttachment.

. Я прошел путь UIPrintPageRenderer, передавая UIPrintFormatter, который я получаю от UITextView через функцию viewPrintFormatter(), и он отлично работает для текста, ноЯ не вижу ни одного изображения.Похоже, изображения на самом деле занимают место, так как я вижу пустое пространство между строками текста, но изображение не отображается.

Я подозреваю, что это может быть средство форматирования, но я не знаю, как обойти это.Любая помощь очень ценится.

Код, который я использую для создания PDF из NSAttributedString, следующий:

public func createPDF(text: NSAttributedString, documentPath: URL, customPrintFormatter: UIPrintFormatter? = nil) {
    let printFormatter = customPrintFormatter == nil ? UISimpleTextPrintFormatter(attributedText: text) : customPrintFormatter!

    let renderer = UIPrintPageRenderer()
    renderer.addPrintFormatter(printFormatter, startingAtPageAt: 0)

    // A4 size
    let pageSize = CGSize(width: 595.2, height: 841.8)

    // create some sensible margins
    let pageMargins = UIEdgeInsets(top: 72, left: 72, bottom: 72, right: 72)

    // calculate the printable rect from the above two
    let printableRect = CGRect(x: pageMargins.left, y: pageMargins.top, width: pageSize.width - pageMargins.left - pageMargins.right, height: pageSize.height - pageMargins.top - pageMargins.bottom)

    // and here's the overall paper rectangle
    let paperRect = CGRect(x: 0, y: 0, width: pageSize.width, height: pageSize.height)

    renderer.setValue(NSValue(cgRect: paperRect), forKey: "paperRect")
    renderer.setValue(NSValue(cgRect: printableRect), forKey: "printableRect")

    let pdfData = NSMutableData()

    UIGraphicsBeginPDFContextToData(pdfData, paperRect, nil)
    renderer.prepare(forDrawingPages: NSMakeRange(0, renderer.numberOfPages))

    let bounds = UIGraphicsGetPDFContextBounds()

    for i in 0  ..< renderer.numberOfPages {
        UIGraphicsBeginPDFPage()

        renderer.drawPage(at: i, in: bounds)
    }

    UIGraphicsEndPDFContext()

    do {
        try pdfData.write(to: documentPath)
    } catch {
        print(error.localizedDescription)
    }
}

Ниже приведен код, который создает NSTextAttachment

        let attachment = NSTextAttachment()
        attachment.image = UIImage.init(named: "1.png")
        attachment.bounds = CGRect.init(x: 0, y: 0, width: 200, height: 100)
        let img = NSMutableAttributedString.init(attachment: attachment)

        let imgRange = NSRange.init(location: match.range(at: 0).location + match.range(at: 0).length, length: img.length)
        self.beginEditing()
        backingStore.insert(img, at: match.range(at: 0).location + match.range(at: 0).length)
        let r = NSMakeRange(match.range(at: 0).location + match.range(at: 0).length, img.length)
        self.edited([.editedCharacters, .editedAttributes], range: range, changeInLength: img.length)
        self.endEditing()
...