这是我目前正在做的事情。
首先,我得到了文件。接下来,我创建一个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但似乎都没有隐藏滚动条。
提前致谢!
答案 0 :(得分:1)
所以我解决了自己的问题。对于像我这样困扰的其他人,这就是我所做的。例如,在页面上绘制一个框:
和
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数据执行某些操作。)
答案 1 :(得分:0)
2017年WWDC视频PDFKit上演示了一个简单的解决方案。我假设您有一个现有文档,您想要添加一些绘图。这是做什么的:
为文档提供代理。
在委托中,实现classForPage
为您的页面声明一个类:该类应该是您自己的PDFPage子类。
在您的PDFPage子类中,实现draw(with:to:)
。给你一个背景;画进去!如果您希望进行默认绘图,请务必致电super
。
如果你的PDFPage子类需要在不同的页面上绘制不同的东西,它可以通过询问self.document?.index(for:self)
来找出它在文档中的位置。