Swift转换为PDF但不停止

时间:2017-12-19 13:08:01

标签: swift pdf textview

我想在用户输入数据后从textview生成pdf。 textview包含段落和归属文本。 我跟着了 this procedure

我的代码是:

func createPdf() {
    createPDFNamed("test")         
}

func getPDFPath(_ name: String) -> String {
    let newPDFName = "\(name).pdf"
    let paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)
    let documentsDirectory = paths[0]
    let pdfPath: String = (documentsDirectory as String).appending(newPDFName);
    print(pdfPath)
    return pdfPath
}

func createPDFNamed(_ name: String) {
    let text = myTextView.text              
    let currentText: CFAttributedString = CFAttributedStringCreate(nil, (text as CFString?), nil)
    if currentText != nil {
        let framesetter: CTFramesetter = CTFramesetterCreateWithAttributedString(currentText)
        if framesetter != nil {
            let pdfFileName: String = getPDFPath(name)
            UIGraphicsBeginPDFContextToFile(pdfFileName, CGRect.zero, nil)
            var currentRange: CFRange! = CFRangeMake(0, 0)
            var currentPage: Int = 0
            var done = false
            repeat {
                UIGraphicsBeginPDFPageWithInfo(CGRect(x: 0, y: 0, width: 612, height: 792), nil)
                currentPage += 1
                drawPageNbr(currentPage)
                currentRange = renderPagewithTextRange(currentRange, andFramesetter: framesetter)
                if currentRange.location == CFAttributedStringGetLength((currentText as? CFAttributedString)) {
                    done = true
                }
            } while !done
            UIGraphicsEndPDFContext()
        }
        else {
            print("Could not create the framesetter needed to lay out the atrributed string.")
        }
    }
    else {
        print("Could not create the attributed string for the framesetter")
    }
}

func renderPagewithTextRange(_ currentRange: CFRange, andFramesetter framesetter: CTFramesetter) -> CFRange {
    var currentRange: CFRange! = CFRangeMake(0, 0)
    let currentContext: CGContext? = UIGraphicsGetCurrentContext()
    currentContext?.textMatrix = .identity
    let frameRect = CGRect(x: 72, y: 72, width: 468, height: 648)
    let framePath: CGMutablePath = CGMutablePath()
    framePath.addRect(frameRect, transform: .identity)

    let frameRef: CTFrame = CTFramesetterCreateFrame(framesetter, currentRange, framePath, nil)
    currentContext?.translateBy(x: 0, y: 792)
    currentContext?.scaleBy(x: 1.0, y: -1.0)
    CTFrameDraw(frameRef, currentContext!)
    currentRange = CTFrameGetVisibleStringRange(frameRef)
    currentRange.location += currentRange.length
    currentRange.length = 0 as? CFIndex ?? CFIndex()
    return currentRange
}

func drawPageNumber(_ pageNum: Int) {
    let pageString = "Page \(Int(pageNum))"
    let theFont = UIFont.systemFont(ofSize: 12)
    let pageStringSize: CGSize = pageString.size(withAttributes: [.font: UIFont.systemFont(ofSize: 17.0)])
    let stringRect = CGRect(x: ((612.0 - pageStringSize.width) / 2.0), y: 720.0 + ((72.0 - pageStringSize.height) / 2.0), width: pageStringSize.width, height: pageStringSize.height)
    let paragraphStyle = NSParagraphStyle.default.mutableCopy() as? NSMutableParagraphStyle
    paragraphStyle?.lineBreakMode = .byTruncatingTail
    paragraphStyle?.alignment = .right                
    let attributes = [NSAttributedStringKey.font: theFont, .paragraphStyle: paragraphStyle as Any] as [NSAttributedStringKey : Any]
    pageString.draw(in: stringRect, withAttributes: attributes)
}

pdf生成并且永远不会结束,即使它达到2Gb文件大小。但不是开放。你能否告诉我在完成pdf生成方面的错误?也是在pdf创建之后,想通过邮件发送 提前致谢

编辑: 如果我将代码更改为while done它会停止但只打印一页。如果我改为while !done,它会继续生成pdf。过去两天搜索并没有找到任何解决方案。此外,pdf仅打印黑色。我想将这些属性反映到pdf。任何建议。

if (currentRange.location == CFAttributedStringGetLength(currentText)){
                        done = true
                    }
                } while done
                    UIGraphicsEndPDFContext()
                }
                    else  {
                    print("Could not create the framesetter needed to lay out the atrributed string.")
                }
            }
                else  {
                print("Could not create the attributed string for the framesetter")
            }
            }

0 个答案:

没有答案