import UIKit
import PDFKit
extension UITextView {
func generatePDF(filePath: String, success: ()->(), failure: ()->()) {
// 创建 UIPrintPageRenderer
let printRenderer = UIPrintPageRenderer()
// 获取 UITextView 的打印格式化器
let textViewFormatter = viewPrintFormatter()
// 将打印格式化器添加到 UIPrintPageRenderer 中
printRenderer.addPrintFormatter(textViewFormatter, startingAtPageAt: 0)
// 定义 A4 纸尺寸(单位:点,1 英寸 = 72 点)
let a4Size = CGSize(width: 595.2, height: 841.8)
// 定义页边距
let margin: CGFloat = 10
let printableRect = CGRect(x: margin,
y: margin,
width: a4Size.width - 2 * margin,
height: a4Size.height - 2 * margin)
let paperRect = CGRect(origin:.zero, size: a4Size)
// 设置打印页面的尺寸和边距
printRenderer.setValue(NSValue(cgRect: paperRect), forKey: "paperRect")
printRenderer.setValue(NSValue(cgRect: printableRect), forKey: "printableRect")
// 创建一个可变数据对象,用于存储生成的 PDF 数据
let pdfData = NSMutableData()
UIGraphicsBeginPDFContextToData(pdfData, paperRect, nil)
for pageIndex in 0..<printRenderer.numberOfPages {
UIGraphicsBeginPDFPage()
printRenderer.drawPage(at: pageIndex, in: UIGraphicsGetPDFContextBounds())
}
UIGraphicsEndPDFContext()
guard let pdf = PDFDocument(data: pdfData as Data) else { return }
pdf.write(to: URL(fileURLWithPath: filePath))
if FileManager.default.fileExists(atPath: filePath) {
success()
} else {
print("Failed to convert text to PDF.")
failure()
}
}
}
使用:
let uiTextView = UITextView(frame: CGRect(x: 0, y: 0, width: 200, height: 300))
uiTextView.text = "Test"
view.addSubview(uiTextView)
let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
let filePath = documentsDirectory.appendingPathComponent("test.pdf").path
uiTextView.generatePDF(filePath: filePath) { [weak self] in
guard let `self` = self else { return }
} failure: {
}