iOS 11 PDFKit墨迹注释 - 无法填充UIBezierPath

问题描述 投票:3回答:2

我正在使用带有子类型墨迹的PDFAnnotation()类向PDFDocument添加墨迹注释。我们的想法是捕获使用触摸绘制的签名。

受UberSignature的启发,我的UIBezierPath是一系列应该填充颜色的矩形。但是,当我将注释添加到PDFDocument时,它不会被填充。

似乎UIBezierPath的fill()方法在添加到PDFAnnotation时什么都不做?

如果我使用相同的UIBezierPath并在UIImage上绘制它,则会正确填充纯色。

关于什么可能出错的任何想法?

有问题的代码:

UIColor.red.setStroke()
UIColor.red.setFill()

var path = UIBezierPath()
path.append(myRectangles)
path.fill()

var annotation = PDFAnnotation(bounds: path.bounds, forType: .ink, withProperties: nil)
annotation.add(path)
myPDFPage.addAnnotation(annotation)

Current view of PDF

在截图中我尝试编写普通文本和两个示例行。左侧的线条缓慢绘制,右侧的线条绘制得很快。这个想法是让线条的宽度根据绘制的速度而变化,以使签名看起来更自然/逼真。

ios ipad uibezierpath pdfkit
2个回答
2
投票

我设法找到了一个似乎相对最优的问题的解决方案。

诀窍是创建PDFAnnotation的子类并覆盖绘图(使用box:,in context :)函数。在这个函数中,我可以使用drawPath(using:.fill)方法来填充bezier路径。

代码可能如下所示:

class SignatureAnnotation : PDFAnnotation {
  public var myPath : UIBezierPath = UIBezierPath()

  override func draw(with box: PDFDisplayBox, in context: CGContext) {
    context.saveGState()
    self.page?.transform(context, for: box)
    context.beginPath()
    context.setLineWidth(0.1)
    context.setShouldAntialias(true)
    context.addPath(self.myPath.cgPath.mutableCopy()!)
    context.drawPath(using: .fill)
    context.restoreGState()
  }
}

将此注释(类型.stamp)添加到PDF而不是墨迹注释,并且所有内容都将呈现为矢量(完全可缩放而不会像素化) - 并且在保存到文件或数据缓冲区时将与其余PDF一起保存。

唯一的缺点是UIBezierPath不能太复杂,因为如果draw()函数花费太长时间将引入闪烁。这可以通过简单地将UIBezierPath拆分为多个单独的路径来解决,每个路径都有自己的注释。


1
投票

InkAnnotation呈现为描边路径的集合。根据PDF reference 1.4 page 508,没有办法用颜色填充它。

Apple的预览使用Stamp注释将PDF签名包含在内。我试图使用PDFKit对其进行反向工程,但我看不到任何包含我放在PDF中的签名的矢量数据。 PDFKit可能还不够。

(lldb) po annotation.annotationKeyValues
▿ 10 elements
  ▿ 0 : 2 elements
    ▿ key : AnyHashable("/AAPL:Hash")
      - value : "/AAPL:Hash"
    - value : /264236ab9aaabfe2d536167a89c26c2d
  ▿ 1 : 2 elements
    ▿ key : AnyHashable("/DA")
      - value : "/DA"
    - value : /Helvetica 12 Tf 0 g
  ▿ 2 : 2 elements
    ▿ key : AnyHashable("/T")
      - value : "/T"
    - value : Wojciech Nagrodzki
  ▿ 3 : 2 elements
    ▿ key : AnyHashable("/F")
      - value : "/F"
    - value : 4
  ▿ 4 : 2 elements
    ▿ key : AnyHashable("/Subtype")
      - value : "/Subtype"
    - value : /Stamp
  ▿ 5 : 2 elements
    ▿ key : AnyHashable("/Name")
      - value : "/Name"
    - value : /Draft
  ▿ 6 : 2 elements
    ▿ key : AnyHashable("/Rect")
      - value : "/Rect"
    - value : NSRect: {{5.8745389999999995, 748.38995}, {307.66119599999996, 87.648936000000049}}
  ▿ 7 : 2 elements
    ▿ key : AnyHashable("/Border")
      - value : "/Border"
    - value : PDFBorder: {solid lineWidth:2.8 hCorner:0.0 vCorner:0.0 dashCount:0 dashPattern:(
)}
  ▿ 8 : 2 elements
    ▿ key : AnyHashable("/Type")
      - value : "/Type"
    - value : /Annot
  ▿ 9 : 2 elements
    ▿ key : AnyHashable("/C")
      - value : "/C"
    - value : kCGColorSpaceModelRGB 0 0 0 1 

fill()方法用于填充当前图形上下文中的路径,这与注释无关。

如果使用图章注释失败,您还可以在图形上下文中渲染路径,将其转换为图像并放置在PDF中。但我不确定你是否会考虑这一点。

您可以在Adobe's archives中找到更多PDF参考资料。

© www.soinside.com 2019 - 2024. All rights reserved.