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 中解释了如何实施这种方法: