PDFAnnotationSubType 墨水在持久化时未保存(iOS11,PDFKit)
PDFAnnotationSubType Ink not saved when persisting (iOS11, PDFKit)
在 iOS 11 中,我有一个 PDFView
控制器实现,它允许注释 PDF,如果使用 PDFAnnotationSubtypeInk
let page : PDFPage = ...
let points : [CGPoint] = ...
let path = UIBezierPath()
for x in 0..<points.count {
let point = self.pdfView.convert(points[x], to: page)
if x == 0 {
path.move(to: point)
}else{
path.addLine(to: point)
}
}
let border = PDFBorder()
border.style = .solid
border.lineWidth = 2.0
let drawAnnotation = PDFAnnotation(bounds: page.bounds(for: .mediaBox), forType: .ink, withProperties: nil)
drawAnnotation.backgroundColor = .yellow
drawAnnotation.interiorColor = .yellow
drawAnnotation.fontColor = .yellow
drawAnnotation.color = .yellow
drawAnnotation.border = border
drawAnnotation.add(path)
page.addAnnotation(drawAnnotation)
当我调用持久化代码时
if let path = self.pdfDocumentPath, let document = self.pdfDocument {
if !document.write(toFile: path){
NSLog("Failed to save PDF")
}
}
理论上一切正常,PDF 已保存到磁盘...但是在下次从磁盘重新加载时,我的注释无处可见。其他类型的注释被正确保存(即文本和突出显示)
看起来 UIBezierPaths 永远不会从磁盘中返回。在重新加载的 PDFAnnotation
中找不到 UIBezierPath
我做错了什么吗?我错过了什么吗?
PS:我很抱歉 Ruby 正在寻找 questions/answers 的开发人员 Ruby 被称为 PDFKit 的包...... iOS 也从 iOS 11 开始就有一个名为 PDFKit 的包...如有任何混淆,请见谅。
我设法解决了这个问题。注释被保存,但 UIBezierPath 没有(和所有的点)
因此,当我将 PDF 写回磁盘时,我遍历所有页面和所有注释,并找到带有 UIBezierPath 的那些,并将 CGPoints 序列化为 JSON 进入 PDFAnnotation content
属性.
当重新加载同一个 PDF 时,我做了完全相同的事情,即遍历所有页面,找到 .ink 注释,反序列化这些点,然后将 UIBezierPath 添加回注释。
Apple 在 iOS 12 中修复了此错误。PDFAnnotation.paths
已正确填写。
从 11.2 - 11.4 之间的某个版本开始(我没有机会验证,但它在 11.1 中不完全工作,在 11.4+ 中工作)你可以使用 PDFAnnotation
方法 drawWithBox:inContext:
正确渲染墨迹注释。
注意,在 iOS 12.0 Apple 中损坏了 PDFAnnotation.color
(从磁盘保存重新加载 PDFDocument 后,alpha 始终等于 1)。可以用上面的方法通过上下文画注解来修复
在 iOS 11 中,我有一个 PDFView
控制器实现,它允许注释 PDF,如果使用 PDFAnnotationSubtypeInk
let page : PDFPage = ...
let points : [CGPoint] = ...
let path = UIBezierPath()
for x in 0..<points.count {
let point = self.pdfView.convert(points[x], to: page)
if x == 0 {
path.move(to: point)
}else{
path.addLine(to: point)
}
}
let border = PDFBorder()
border.style = .solid
border.lineWidth = 2.0
let drawAnnotation = PDFAnnotation(bounds: page.bounds(for: .mediaBox), forType: .ink, withProperties: nil)
drawAnnotation.backgroundColor = .yellow
drawAnnotation.interiorColor = .yellow
drawAnnotation.fontColor = .yellow
drawAnnotation.color = .yellow
drawAnnotation.border = border
drawAnnotation.add(path)
page.addAnnotation(drawAnnotation)
当我调用持久化代码时
if let path = self.pdfDocumentPath, let document = self.pdfDocument {
if !document.write(toFile: path){
NSLog("Failed to save PDF")
}
}
理论上一切正常,PDF 已保存到磁盘...但是在下次从磁盘重新加载时,我的注释无处可见。其他类型的注释被正确保存(即文本和突出显示)
看起来 UIBezierPaths 永远不会从磁盘中返回。在重新加载的 PDFAnnotation
中找不到 UIBezierPath我做错了什么吗?我错过了什么吗?
PS:我很抱歉 Ruby 正在寻找 questions/answers 的开发人员 Ruby 被称为 PDFKit 的包...... iOS 也从 iOS 11 开始就有一个名为 PDFKit 的包...如有任何混淆,请见谅。
我设法解决了这个问题。注释被保存,但 UIBezierPath 没有(和所有的点)
因此,当我将 PDF 写回磁盘时,我遍历所有页面和所有注释,并找到带有 UIBezierPath 的那些,并将 CGPoints 序列化为 JSON 进入 PDFAnnotation content
属性.
当重新加载同一个 PDF 时,我做了完全相同的事情,即遍历所有页面,找到 .ink 注释,反序列化这些点,然后将 UIBezierPath 添加回注释。
Apple 在 iOS 12 中修复了此错误。PDFAnnotation.paths
已正确填写。
从 11.2 - 11.4 之间的某个版本开始(我没有机会验证,但它在 11.1 中不完全工作,在 11.4+ 中工作)你可以使用 PDFAnnotation
方法 drawWithBox:inContext:
正确渲染墨迹注释。
注意,在 iOS 12.0 Apple 中损坏了 PDFAnnotation.color
(从磁盘保存重新加载 PDFDocument 后,alpha 始终等于 1)。可以用上面的方法通过上下文画注解来修复