2016-12-28 81 views
0

这是我目前正在做的。如何在Swift上绘制PDF文件?

首先,我得到的文件。接下来,我创建一个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,但都没有隐藏滚动条。

提前致谢!

Scroll Bar Img

回答

1

所以我解决了我自己的问题。对于像我这样卡住的其他人,这是我所做的。例如,要在页面上绘制一个框:

  1. 为PDFDocuments创建一个CGContext(ctx)。您可以使用数据或者想要写入的URL来做到这一点。
  2. 创建要编辑
  3. 得到你想要编辑的CGPDF的CGPage的文档CGPDFDocument(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,关闭会写入磁盘,否则你必须对PDF数据做些什么。)

0

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

  1. 给文件一个委托。

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

  3. 在您的PDFPage子类中,实现draw(with:to:)。给你一个背景;吸取它!如果您想要使用默认绘图,请务必致电super

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