零基础学习Swift

【Swift】把ScrollView转成PDF保存

2021-12-30  本文已影响0人  哗啦啦啦呃

iOS小白纪录的第一天

本文主要介绍怎么将App里的scrollView转成pdf并保存到本地文件中

static func createPDFfromScrollView(view:UIScrollView) -> NSMutableData {
            let origRect = view.frame
            let origContent = view.contentSize
            let origSuperView = view.superview
            
            //创建一个新的用来显示的pdf的大小,并且为内容上下各预留了20的偏移
            let rootRect = CGRect(x: 0,y: 0,width: 595,height: view.contentSize.height+40)
            
            //重新计算scrollview的frame,新frame处于背景的中间,同时,为了能打印所有内容,将size设置为contentsize
            let newScrollRect = CGRect(x: (595-view.contentSize.width)/2, y: 20, width: view.contentSize.width, height: view.contentSize.height)
            
            //重新为scrollview设置frame,并从原父视图移除
            view.removeFromSuperview()
            view.frame = newScrollRect
            
            //设置背景图,这里的背景图宽度为A4的宽度595
            let rootView = UIView(frame: rootRect)
            rootView.backgroundColor = UIColor.white
            //将需要打印的内容放置在新的背景图上
            rootView.addSubview(view)
            
            //声明存储打印数据的数据结构
            let pdfdata:NSMutableData = NSMutableData()
            
            //设置要打印出来的文件的宽高
            UIGraphicsBeginPDFContextToData(pdfdata, rootRect, nil)
            
            //开始打印
            UIGraphicsBeginPDFPage()
            let pdfContext = UIGraphicsGetCurrentContext()
            rootView.layer.render(in: pdfContext!)
            
            //结束打印
            UIGraphicsEndPDFContext()
            
            //将scrollview的frame与父视图设置为初始状态
            view.frame = origRect
            origSuperView?.addSubview(view)

            //此处对可以进行对子视图的恢复,比如说图片视图的恢复显示
                
            //输出打印数据,根据需要进行数据的存储或传输
            return pdfdata
        }
          //获取沙箱路径
            let dir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).last
            print(dir!)
            //URL 追加 文件名
            let path = dir?.appendingPathComponent(pdfname)
            print(path!)
            do {
                //写文件到路径
                try pdfdata.write(to: path!, options: .atomic)
                self.saveState(message: "Save Success!")
            } catch {
                self.saveState(message: "Save Failed!")
            }

saveState是笔者自己写的一个提示框,可有可无。
这里也贴一下代码:

//弹框:是否保存成功
    func saveState(message str:String){
        let alertController = UIAlertController(title: str,
                                                message: nil, preferredStyle: .alert)
        //显示提示框
        self.viewController.present(alertController, animated: true, completion: nil)
        //两秒钟后自动消失
        DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 2) {
            self.viewController.presentedViewController?.dismiss(animated: false, completion: nil)
        }
    }

OK,这个时候,你的pdf已经保存到App的Documents文件夹下面了,接下来就是怎么看见它了
简短的介绍一下iOS程序的独立的文件系统(存储空间):每个iOS程序都有一个独立的文件系统(存储空间),而且只能在对应的文件系统中进行操作,此区域被称为沙盒。

沙盒中相关路径

解决方法
这需要你在你的 App 内的 Info.plist 中添加两个键值对,第一个是 UIFileSharingEnabled,这个可以使 iTunes 分享你文件夹内的内容;第二个是 LSSupportsOpeningDocumentsInPlace ,它保证了你文件夹内本地文件的获取权限,你需要将这两个键值对的值设置为 YES

image.png

如果不想保存到应用程序下面,可以直接调用系统的分享框去保存到任选的一个文件夹下面。

参考文档:
https://blog.csdn.net/lyz0925/article/details/104460366

上一篇下一篇

猜你喜欢

热点阅读