Я включаю VNDocumentCameraViewControllerDelegate
в моем классе
Чтобы "отсканировать документ", я использовал этот код:
@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..")
}
}