Конвертируйте UIimage (библиотеку фотографий или камеру) в PDF в iPhone файлах - PullRequest
1 голос
/ 25 апреля 2020
  1. Я включаю VNDocumentCameraViewControllerDelegate в моем классе

  2. Чтобы "отсканировать документ", я использовал этот код:

    @IBAction func scanButton(_ sender: UIButton) {
        let scannerViewController = VNDocumentCameraViewController()
        scannerViewController.delegate = self
        present(scannerViewController, animated: true)

    }
В viewDidLoad я включаю PDFView
    override func viewDidLoad() {
        super.viewDidLoad()

        pdfView = PDFView()

        pdfView.translatesAutoresizingMaskIntoConstraints = false
        self.view.addSubview(pdfView)

        pdfView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor).isActive = true
        pdfView.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor).isActive = true
        pdfView.topAnchor.constraint(equalTo: startOutlet.bottomAnchor).isActive = true
        pdfView.bottomAnchor.constraint(equalTo: PDFOutlet.topAnchor).isActive = true

        PDFOutlet.isHidden = true }
Я добавляю documentCameraViewController функции
    func documentCameraViewController(_ controller: VNDocumentCameraViewController, didFinishWith scan: VNDocumentCameraScan) {
        guard scan.pageCount >= 1 else {
            controller.dismiss(animated: true)
            return
        }

        DispatchQueue.main.async {

            let pdfDocument = PDFDocument()

            for i in 0 ..< scan.pageCount {
                if let image = scan.imageOfPage(at: i).resize(toWidth: 250) {
                    print("image size is \(image.size.width), \(image.size.height)")
                    // Create a PDF page instance from your image
                    let pdfPage = PDFPage(image: image)
                    // Insert the PDF page into your document
                    pdfDocument.insert(pdfPage!, at: i)
                }
            }

            // Retrieve raw data of your PDF document
            let data = pdfDocument.dataRepresentation()

            let documentDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
            let docURL = documentDirectory.appendingPathComponent("Scanned-Docs.pdf")

            do {
            try data?.write(to: docURL)
            }
            catch(let error)
            {
                print("error is \(error.localizedDescription)")
            }

        }
        controller.dismiss(animated: true)
        PDFOutlet.isHidden = false

    }

    func documentCameraViewController(_ controller: VNDocumentCameraViewController, didFailWithError error: Error) {
        print(error)
        controller.dismiss(animated: true)
    }

    func documentCameraViewControllerDidCancel(_ controller: VNDocumentCameraViewController) {
        controller.dismiss(animated: true)
    }

    }

    extension SnapToPDF: UINavigationControllerDelegate {
      // Not used, but necessary for compilation
    }

    extension UIImage {
        func resize(toWidth width: CGFloat) -> UIImage? {
            let canvas = CGSize(width: width, height: CGFloat(ceil(width/size.width * size.height)))
            return UIGraphicsImageRenderer(size: canvas, format: imageRendererFormat).image {
                _ in draw(in: CGRect(origin: .zero, size: canvas))
            }
        }
Я хочу, чтобы у пользователей была кнопка для сохранения выбранного PDF-файла, но эта часть кода не работает. Все остальное выше работает, и в приложении я могу сделать фотографию и изменить ее размер, или выбрать из библиотеки фотографий. В идеале хотел показать опции для пользователя, чтобы сохранить PDF в свои файлы в iPhone, но это не работает. Кнопка ничего не делает. Пожалуйста, помогите!
    @IBAction func viewPDFButton(_ sender: UIButton) {
        let fileManager = FileManager.default

            let documentDirectory = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first!
            let docURL = documentDirectory.appendingPathComponent("Scanned-Docs.pdf")

            if fileManager.fileExists(atPath: docURL.path){
                   pdfView.document = PDFDocument(url: docURL)
            }
            else {
                   print("file does not exist..")
            }
        }
...