1

UITextViewのコンテンツを PDFに変換しようとしています。は、テキストとイメージを含むUITextViewを使用します。NSAttributedString画像は のインスタンスですNSTextAttachment

関数から取得した を渡す方法UIPrintPageRendererを試しましたが、テキストに対しては完全に機能しますが、画像が表示されません。テキスト行の間に空のスペースが表示されるため、画像が実際にスペースを占有しているように見えますが、画像はレンダリングされていません。UIPrintFormatterUITextViewviewPrintFormatter()

フォーマッターのせいかもしれないと思うのですが、対処法がわかりません。どんな助けでも大歓迎です。

から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()
4

0 に答える 0