swift - 如何在 Swift 中在 PDF 上绘制内容?

标签 swift macos cocoa cgpdf

这是我目前正在做的。

首先,我拿到了文件。接下来我创建一个 PDF View 并将文档分配给 View 。然后我创建一个 View 并在 View 中进行绘图,然后将 View 作为 subview 添加到 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. 为 PDFDocuments 创建一个 CGContext (ctx)。您可以使用数据或要写入的 URL 来执行此操作。
  2. 用你要编辑的文档创建一个 CGPDFDocument
  3. 获取要编辑的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 数据执行某些操作。)

关于swift - 如何在 Swift 中在 PDF 上绘制内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41370101/

相关文章:

快速加速: the vDSP enum

cocoa - 读取桌面plist

c# - 清除 LocalMessageReceiver 的 Mac Silverlight 资源

ios - cocoa 从 2 个字符之间获取多个子字符串

macos - 将自释放对象转换为 ARC

objective-c - 如何使用AddressBook框架有效地从AddressBook中删除所有联系人?

ios - 在 Swift 中使用 MagicalRecord 实例化的向下转换 CoreData 实体

swift 最后(:where) element in an array

swift - 如何删除以编程方式添加的约束

linux - 如何在不将本地 RSA key 放在各处的情况下进行多跳 ssh