IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> iOS 创建PDF文件 -> 正文阅读

[移动开发]iOS 创建PDF文件

前言

最近有个项目,功能为将多张图片创建为PDF文件。

创建PDF文档在iOS中有两种方法

  1. PDFKit
  2. UIKit -> UIGraphicsPDFRenderer

PDFKit

iOS 11 版本之后,iOS 提供了生成与预览 PDF 文件的框架,即为 PDFKit。本篇文章不讨论使用 PDFKit 预览 PDF 文档的功能( PDFView )。感兴趣的同学可以自己去看看,不难。

PDFKit提供了大量的类

  • PDFDocument:描述为整个PDF文档,用于生成或获取PDF文档
  • PDFPage:PDF的页
  • PDFAction: 点击PDF的事件,基本使用其子类完成相关点击动作,如点击链接(PDFActionURL)。点击名称(PDFActionName)等。
  • PDFAnnotation: PDF的注释,如向PDF的某一处添加一段文字。

PDFKit在生成文档时只要使用了两个类 PDFDocumentPDFPage

废话不多说,上代码

    /// - Parameters:
    ///   - url: 创建PDF的根路径
    ///   - name: PDF文件名称
    ///   - images: 图片列表
    ///   - completed: 返回
    func convertPDF(url: URL, name: String, images: [UIImage], completed: @escaping (String) -> Void) {
        var path = url.appendingPathComponent(name).appendingPathExtension("pdf")
        var number = 0
        // 防止重名
        while self.isExist(path: path.path) {
            number += 1
            path = url.appendingPathComponent(name + "(\(number))")
                .appendingPathExtension("pdf")
        }
        let queue = DispatchQueue(label: "com.create.pdf")
        queue.async {
            let pdfDocument = PDFDocument()
            for (index, image) in images.enumerated() {
            	// 创建页
                let pdfPage = PDFPage(image: image)
                // 添加页
                pdfDocument.insert(pdfPage!, at: index)
            }
            pdfDocument.write(to: path)
            // 加密PDF文档
            // pdfDocument.write(to: path, withOptions: [.ownerPasswordOption: "123456"])
            DispatchQueue.main.async {
                completed(path.path)
            }
        }
    }

缺陷

  • 无法设置纸张大小 尝试过 pdfPage?.setBounds(rect, for: .artBox),但未成功
  • 无法创建横向 PDF 文档

UIKit

如果项目需要适配 iOS 11 以下的系统版本,那么就只能使用 UIGraphicsPDFRendererFormat 进行 PDF 创建了。

上代码

	/// - Parameters:
    ///   - url: 创建PDF的根路径
    ///   - name: PDF文件名称
    ///   - images: 图片列表
    ///   - completed: 返回
    func createPDF(url: URL, name: String, images: [UIImage], completed: @escaping (String) -> Void) {
        var path = url.appendingPathComponent(name).appendingPathExtension("pdf")
        var number = 0
        // 防止重名
        while self.isExist(path: path.path) {
            number += 1
            path = url.appendingPathComponent(name + "(\(number))")
                .appendingPathExtension("pdf")
        }
        let queue = DispatchQueue(label: "com.create.pdf")
        queue.async {
        	// 纸张大小
            let rect = PDFSettingState.shared.getSize()
            var pdfInfo = [String: Any]()
            // 加密
            if !PDFSettingState.shared.password.isEmpty {
                pdfInfo[kCGPDFContextOwnerPassword as String] = PDFSettingState.shared.password
            }
            let format = UIGraphicsPDFRendererFormat()
            format.documentInfo = pdfInfo

            let render = UIGraphicsPDFRenderer(bounds: rect, format: format)
            let data = render.pdfData { context in
                var x: CGFloat = 0
                for image in images {
                	// 开启PDF中的一页
                    context.beginPage()
                    if image.size.width <= rect.size.width {
                        x = (rect.size.width - image.size.width) / 2.0
                    } else {
                        x = 0
                    }
                    image.draw(at: CGPoint(x: x, y: 0))
                }
            }
            UIGraphicsEndPDFContext()
            try! data.write(to: path)
            DispatchQueue.main.async {
                completed(path.path)
            }
        }
    }

缺陷

  • 图片会自适应纸张大小,类似 UIImageViewUIViewContentModeScaleAspectFill 方式。
  • 无法创建横向 PDF 文档

总结

由于网上的文档多数都有问题,没办法只能自己看官方文档以及代码进行学习。相比较而言,PDFKit 要比 UIKit 的使用方式要简单一点,但功能也要简单一点。最起码无法设置纸张大小,也许是因为图片大小不符合纸张大小而不成功吧。这个问题就交给大家了。

最后附上纸张大小的尺寸网址 Paper Sizes

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-10-31 12:09:06  更:2022-10-31 12:09:21 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/29 7:59:54-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码