iOS 创建PDF文件
前言
最近有个项目,功能为将多张图片创建为PDF
文件。
创建PDF
文档在iOS
中有两种方法
PDFKit
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
在生成文档时只要使用了两个类 PDFDocument
、PDFPage
。
废话不多说,上代码
/// - 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)}}}
缺陷
- 固定大小之后图片会失真,图片变得发白
- 如果图片与所设定的尺寸不一致时,图片将会自适应纸张大小,类似
UIImageView
的UIViewContentModeScaleAspectFill
方式。
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)}}}
缺陷
- 图片会自适应纸张大小,类似
UIImageView
的UIViewContentModeScaleAspectFill
方式。
总结
由于网上的文档多数都有问题,没办法只能自己看官方文档以及代码进行学习。相比较而言,PDFKit
要比 UIKit
的使用方式要简单一点,但功能也要简单一点。最起码无法设置纸张大小,也许是因为图片大小不符合纸张大小而不成功吧。这个问题就交给大家了。
最后附上纸张大小的尺寸网址 Paper Sizes。
iOS 创建PDF文件相关推荐
- ABBYY在MS Office中创建PDF文件的方法
2019独角兽企业重金招聘Python工程师标准>>> ABBYY PDF Transformer+是一款可创建.编辑及将PDF文件转换为其他可编辑格式的OCR图文识别软件,不仅可以 ...
- python使用fpdf创建pdf文件包含:页眉、页脚并嵌入logo图片、设置使用中文字体
python使用fpdf创建pdf文件包含:页眉.页脚并嵌入logo图片.设置使用中文字体 #python使用fpdf创建页眉.页脚并嵌入logo图片.设置使用中文字体 from fpdf impor ...
- 使用iText库创建PDF文件
前言 译文连接:http://howtodoinjava.com/apache-commons/create-pdf-files-in-java-itext-tutorial/ 对于excel文件的读 ...
- 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 ...
- 如何从服务器上取pdf文件,如何从服务器响应创建pdf文件?
我在一个应用程序中工作,我需要从服务器上得到的响应创建pdf文件.有没有任何方法可以使用此响应创建pdf?反应如下: %PDF-1.4 %���� 2 0 obj <>st ...
- PHP创建PDF文件(通过FPDF类库)
最近项目中需要用到PHP创建PDF文档,初步筛选决定使用FPDF这个纯PHP库来实现,类似的还有TCPDF等,有机会也可以试试. FPDF官网:http://www.fpdf.org logo是个可 ...
- 【第三方库】PHP实现创建PDF文件和编辑PDF文件
目录 引入Setasign/fpdf.Setasign/fpdi 解决写入中文时乱码问题 1.下载并放置中文语言包(他人封装):https://github.com/DCgithub21/cd_FPD ...
- STM32通过Fatfs创建PDF文件
上面是我创建的群聊,欢迎新朋友的加入. 最近想用MCU去创建一个PDF文件,曾尝试移植HPDF和PDFGEN,因为这两个本就不是为单片机做的库,移植过程有点复杂了. 后面发现ST论坛有个网友发布了一个 ...
- Java使用 PDFBox创建 PDF 文件并将文本写入其中
在本 PDFBox 教程中,我们将了解如何使用 PDFBox 2.0 创建 PDF 文件并将文本写入其中.我们将在此过程中逐步了解. 以下是使用 PDFBox 2.0 创建文本并将其写入 PDF 文件 ...
最新文章
- Windows下批量删除旧文件、清除缓存文件、解救C盘、拒绝C盘爆炸
- 网站的容错性设计原则
- Java基于自定义注解的面向切面的实现
- iOS内存暴增问题追查与使用陷阱
- c语言基本字符集ppt,C语言的字符集和保留字知识讲稿.ppt
- qt获取场景的缩略图
- python-字典数据类型-0222
- Web应用——焦点图自动浏览
- python官网下载文件-使用Python下载文件的简单示例
- UML2.0详细教程(附示例)
- MySQL 数据库规范
- sap php 接口,SAP调用RestfulApi接口接收数据
- ie8兼容性视图灰色修复_【ie8兼容性视图灰色修复】ie8兼容性视图 灰色_ie8兼容性视图设置...
- 国标GB28181协议紫光华智云平台级联国标GB28181协议视频平台EasyGBS注意事项
- MOS管自举电容工作原理电路设计及其分析
- 用生成对抗网络给雪人上色,探索人工智能时代的美学
- 前端面试题集锦——JavaScript
- 中职双师型教师计算机培训总结,双师型教师计算机培训心得体会.docx
- node_modules 困境
- PS CS4 序列号永久使用