如何在 Swift 中的 PDF 上绘制一些东西?

Posted

技术标签:

【中文标题】如何在 Swift 中的 PDF 上绘制一些东西?【英文标题】:How do I draw something on a PDF in Swift? 【发布时间】:2016-12-28 21:40:11 【问题描述】:

这是我目前正在做的事情。

首先,我拿到文件。接下来,我创建一个 PDF 视图并将文档分配给该视图。然后我创建一个视图并在视图中绘制,然后将视图作为子视图添加到 PDFView。然后我将 PDFView 转换为数据,然后转换为 PDF 文档。由于我是在 PDF 的第一页上绘图,所以我从原始 PDF 中删除第一页,插入新的第一页,然后返回文档。

guard let document = PDFDocument(url: url) else  return nil 
guard let page = document.page(at: 0) else  return nil 
let pageBounds = page.bounds(for: .mediaBox)

let pdfView = PDFView(frame: pageBounds)
pdfView.document = document
pdfView.enclosingScrollView?.autohidesScrollers = true

let view = /// code for subview that I am drawing on
pdfView.addSubview(view)

let data = pdfView.dataWithPDF(inside: pageBounds)
guard let pdf = PDFDocument(data: data) else  return nil 

document.removePage(at: 0)
document.insert(pdf.page(at: 0)!, at: 0)
return document

有没有更好的方法来做到这一点?为了增加皱纹,我的最终产品有一个奇怪的滚动条图像(见截图)。我尝试添加自动隐藏滚动条 & enclosingScrollView?.hasVerticalScroller = false 但似乎都没有隐藏滚动条。

提前致谢!

【问题讨论】:

【参考方案1】:

所以我已经解决了我自己的问题。对于像我一样陷入困境的其他人,这就是我所做的。例如在页面上绘制一个框:

    为 PDFDocuments 创建一个 CGContext (ctx)。您可以使用数据或要写入的 URL 来执行此操作。 用您要编辑的文档创建一个 CGPDFDocument 获取要编辑的 CGPDF 的 CGPage (cgPage)

和:

ctx?.beginPDFPage(nil)
ctx?.drawPDFPage(cgPage)
ctx?.beginPath()
let path = CGPath(roundedRect: box as CGRect, cornerWidth: 5, cornerHeight: 5, transform: nil)
ctx?.setStrokeColor(CGColor.black)
ctx?.setFillColor(color.cgColor)
ctx?.setLineWidth(10.0)
ctx?.addPath(path)
ctx?.strokePath()
ctx?.addPath(path)
ctx?.fillPath()
ctx?.endPDFPage()
ctx?.closePDF()

(如果您使用 URL 创建了上下文,close 将写入磁盘。否则您将不得不对 PDF 数据进行处理。)

【讨论】:

【参考方案2】:

2017 年 WWDC 视频中的 PDFKit 演示了一个简单的解决方案。我假设您有一个想要添加一些绘图的现有文档。这是做什么:

    给文档一个委托。

    在委托中,实现 classForPage 为您的页面声明一个类:该类应该是您自己的 PDFPage 子类。

    在您的 PDFPage 子类中,实现 draw(with:to:)。给你一个上下文;吸进去!如果您希望使用默认绘图,请务必致电 super

如果你的PDFPage子类需要在不同的页面上绘制不同的东西,它可以通过询问self.document?.index(for:self)来找出它在文档中的位置。

【讨论】:

以上是关于如何在 Swift 中的 PDF 上绘制一些东西?的主要内容,如果未能解决你的问题,请参考以下文章

Swift PDF 渲染任何 UIView 或 UIViewController PDFKit

如何使用 Swift 在 SpriteKit 上绘制贝塞尔曲线?

通过考虑 swift 3 中的 filePath,如何显示以及在何处显示 pdf 文件?

无论如何要从 Swift 中的 socket.io 方法返回一些东西吗?

在 iOS 上,当某些维度信息不可用时,我们如何在 viewDidLoad 中的屏幕上绘制东西?

在 Swift 中的 UIView 上绘制网格