前言

最近有个项目,功能为将多张图片创建为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 += 1path = 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)// 设置页面大小pdfPage?.setBounds(CGRect(origin: .zero, size: PDFSettingState.shared.size), for: .mediaBox)// 添加页pdfDocument.insert(pdfPage!, at: index)}pdfDocument.write(to: path)// 加密PDF文档// pdfDocument.write(to: path, withOptions: [.ownerPasswordOption: "123456"])DispatchQueue.main.async {completed(path.path)}}}

缺陷

  • 固定大小之后图片会失真,图片变得发白
  • 如果图片与所设定的尺寸不一致时,图片将会自适应纸张大小,类似 UIImageViewUIViewContentModeScaleAspectFill 方式。

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 += 1path = 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 = pdfInfolet render = UIGraphicsPDFRenderer(bounds: rect, format: format)let data = render.pdfData { context invar x: CGFloat = 0for 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 方式。

总结

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

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

iOS 创建PDF文件相关推荐

  1. ABBYY在MS Office中创建PDF文件的方法

    2019独角兽企业重金招聘Python工程师标准>>> ABBYY PDF Transformer+是一款可创建.编辑及将PDF文件转换为其他可编辑格式的OCR图文识别软件,不仅可以 ...

  2. python使用fpdf创建pdf文件包含:页眉、页脚并嵌入logo图片、设置使用中文字体

    python使用fpdf创建pdf文件包含:页眉.页脚并嵌入logo图片.设置使用中文字体 #python使用fpdf创建页眉.页脚并嵌入logo图片.设置使用中文字体 from fpdf impor ...

  3. 使用iText库创建PDF文件

    前言 译文连接:http://howtodoinjava.com/apache-commons/create-pdf-files-in-java-itext-tutorial/ 对于excel文件的读 ...

  4. puppeteer api_使用Node.js和puppeteer API从URL创建PDF文件

    puppeteer api We will continue using Node.js and puppeteer which is a node library. As we saw in our ...

  5. 如何从服务器上取pdf文件,如何从服务器响应创建pdf文件?

    我在一个应用程序中工作,我需要从服务器上得到的响应创建pdf文件.有没有任何方法可以使用此响应创建pdf?反应如下: %PDF-1.4 %���� 2 0 obj <>st ...

  6. PHP创建PDF文件(通过FPDF类库)

    最近项目中需要用到PHP创建PDF文档,初步筛选决定使用FPDF这个纯PHP库来实现,类似的还有TCPDF等,有机会也可以试试. FPDF官网:http://www.fpdf.org  logo是个可 ...

  7. 【第三方库】PHP实现创建PDF文件和编辑PDF文件

    目录 引入Setasign/fpdf.Setasign/fpdi 解决写入中文时乱码问题 1.下载并放置中文语言包(他人封装):https://github.com/DCgithub21/cd_FPD ...

  8. STM32通过Fatfs创建PDF文件

    上面是我创建的群聊,欢迎新朋友的加入. 最近想用MCU去创建一个PDF文件,曾尝试移植HPDF和PDFGEN,因为这两个本就不是为单片机做的库,移植过程有点复杂了. 后面发现ST论坛有个网友发布了一个 ...

  9. Java使用 PDFBox创建 PDF 文件并将文本写入其中

    在本 PDFBox 教程中,我们将了解如何使用 PDFBox 2.0 创建 PDF 文件并将文本写入其中.我们将在此过程中逐步了解. 以下是使用 PDFBox 2.0 创建文本并将其写入 PDF 文件 ...

最新文章

  1. Windows下批量删除旧文件、清除缓存文件、解救C盘、拒绝C盘爆炸
  2. 网站的容错性设计原则
  3. Java基于自定义注解的面向切面的实现
  4. iOS内存暴增问题追查与使用陷阱
  5. c语言基本字符集ppt,C语言的字符集和保留字知识讲稿.ppt
  6. qt获取场景的缩略图
  7. python-字典数据类型-0222
  8. Web应用——焦点图自动浏览
  9. python官网下载文件-使用Python下载文件的简单示例
  10. UML2.0详细教程(附示例)
  11. MySQL 数据库规范
  12. sap php 接口,SAP调用RestfulApi接口接收数据
  13. ie8兼容性视图灰色修复_【ie8兼容性视图灰色修复】ie8兼容性视图 灰色_ie8兼容性视图设置...
  14. 国标GB28181协议紫光华智云平台级联国标GB28181协议视频平台EasyGBS注意事项
  15. MOS管自举电容工作原理电路设计及其分析
  16. 用生成对抗网络给雪人上色,探索人工智能时代的美学
  17. 前端面试题集锦——JavaScript
  18. 中职双师型教师计算机培训总结,双师型教师计算机培训心得体会.docx
  19. node_modules 困境
  20. PS CS4 序列号永久使用

热门文章

  1. 贼全面的计算机考研数据结构算法题集合(408+自命题均可)
  2. 【锁】Redis锁 处理并发 原子性
  3. 如何选择合适的香港物理服务器?
  4. 达梦数据库查看表结构的方法
  5. python 模糊匹配字符串 excel_如何使用Pandas在excel文件上进行模糊匹配?
  6. java迭代器原理_Java迭代器的原理及源码解析
  7. html字体自动变化颜色,JS实现文字闪烁自动变换颜色代码3则
  8. 键盘打字时,打一个字后面少一个字如何解决
  9. js中的对象转数组,数组转对象
  10. 零欧电阻的12种作用