SWIFTUI: Draw on a PDF



所以我现在正在构建一个应用程序,我想在其中绘制PDF,就像签名一样。

该应用程序是在Swift中构建的,我使用SwiftU、PencilKit、PDFKit和WebKit。我已经可以显示PDF并在视图中绘制了。如果我使用我的PDFView作为我的PencilKitCanvas的背景,我基本上可以在PDF上绘制,但我不认为这是可行的。此外,我无法以这种方式保存新的PDF。

ZStack {
Image("background")
.resizable()
.edgesIgnoringSafeArea(.all)
VisualEffectView(effect: UIBlurEffect(style: .light))
.edgesIgnoringSafeArea(.all)
VStack {

if isPDFLoading == true {
ActivityIndicator().frame(width: 150, height: 150)
} else {

PKCanvasRepresentation().background(PDFView(request: PDFPath)).edgesIgnoringSafeArea(.bottom)
}
}

}

这是我的观点,这些是我的PDF和PencilKitCanvasViews:

struct PDFView: UIViewRepresentable {
let request: URLRequest
func makeUIView(context: Context) -> WKWebView {
return WKWebView()
}
func updateUIView(_ uiView: WKWebView, context: Context) {
uiView.load(self.request)
}
}
...
func setupDrawing() {
let canvasView = PKCanvasView(frame: self.view.bounds)
guard let window = view.window, let toolPicker = PKToolPicker.shared(for: window) else {
return
}
toolPicker.setVisible(true, forFirstResponder: canvasView)
toolPicker.addObserver(canvasView)
canvasView.backgroundColor = .clear
canvasView.becomeFirstResponder()
view.addSubview(canvasView)
}
}
/// Converts ViewController into a view for SwiftUI
struct PKCanvasRepresentation: UIViewControllerRepresentable {
func makeUIViewController(context: Context) -> PKCanvasViewController {
return PKCanvasViewController()
}
func updateUIViewController(_ uiViewController: PKCanvasViewController, context: Context) {
}
typealias UIViewControllerType = PKCanvasViewController
}

那么,我如何准确地绘制PDF并保存它呢?我是否必须将其全部保存为UIImage并将其转换为PDF?

谢谢,原谅我英语不好。

看看本教程:https://medium.com/better-programming/ios-pdfkit-ink-annotations-tutorial-4ba19b474dce

它只是有点麻烦,但它直接将图形记录为PDF注释,可以与PDF一起保存。PDF不能为了更改它而被保护。

PencilKit非常适合低延迟绘图和内置功能。您可以将图形单独保存为PKDrawing,这非常方便。PKDrawing不允许存储位图(例如,文本框中的文本(。

最好使用QLPreviewViewController对pdf进行注释。首先,我也使用了PencilKit,但由于苹果的文件预览,所以没有必要。我在这篇文章中解释了如何实施这种方法:https://stackoverflow.com/a/68743098/12035498

最新更新