SWIFTUI:在 PDF 上绘图
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
它只是有点hacky,但它直接将图纸记录为PDF 注释,可以与PDF 一起保存。不得为了更改 PDF 对其进行保护。
PencilKit 非常适合低延迟绘图和 built-in 功能集。您可以将绘图单独保存为 PKDrawing
,这非常方便。 PKDrawing
不允许您存储位图(例如文本框中的文本)。
用 QLPreviewViewController 注释 pdf 可能更好。首先,我还使用了 PencilKit,但由于 Apple 的文件预览功能,这不是必需的。
我在 post 中解释了如何实施这种方法:
所以我现在正在构建一个应用程序,我想在 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
它只是有点hacky,但它直接将图纸记录为PDF 注释,可以与PDF 一起保存。不得为了更改 PDF 对其进行保护。
PencilKit 非常适合低延迟绘图和 built-in 功能集。您可以将绘图单独保存为 PKDrawing
,这非常方便。 PKDrawing
不允许您存储位图(例如文本框中的文本)。
用 QLPreviewViewController 注释 pdf 可能更好。首先,我还使用了 PencilKit,但由于 Apple 的文件预览功能,这不是必需的。 我在 post 中解释了如何实施这种方法: