我遵循了这个article

使用PDFAnnotation对PDF签名

您可以使用文章here中的项目下载项目

我的问题是,如果我将pdf下载到计算机上,然后使用Preview或任何PDFviewer应用程序将其打开,则为PDFAnnotation
我可以在页面上移动PDFAnnotation!

并且因为我的应用是“客户到客户”

因此客户端1对PDF签名,然后将其发送给客户端2
以及Client 2签名PDF

那就是为什么我需要渲染新的pdf,这意味着PDFAnnotation进入了PDF而不是PDFAnnotation

另外,您可以下载此PDF

您会注意到我的问题以及如何将这两个PDFAnnotations移动

最佳答案

我终于找到了解决方案!

感谢tempire
和他的code

我确实将其转换为Swift 4.2

这里的想法不是使用PDFAnnotation!。

签名是图像
因此,当用户保存PDF时

我将使用签名图片
创建新的PDF
并保存到相同的PDF文件

把你的签名放在你想要的地方
您需要修改X和Y
image.draw(in: CGRect(x: 100, y: 100, width: 100, height: 100))

   func drawOnPDF(path: String , signatureImage:UIImage) {

        // Get existing Pdf reference
    let pdf = CGPDFDocument(NSURL(fileURLWithPath: path))

        // Get page count of pdf, so we can loop through pages and draw them accordingly
    let pageCount = pdf?.numberOfPages


        // Write to file
        UIGraphicsBeginPDFContextToFile(path, CGRect.zero, nil)

        // Write to data
        //var data = NSMutableData()
        //UIGraphicsBeginPDFContextToData(data, CGRectZero, nil)

        for index in 1...pageCount! {

            let page =  pdf?.page(at: index)

            let pageFrame = page?.getBoxRect(.mediaBox)


            UIGraphicsBeginPDFPageWithInfo(pageFrame!, nil)

            let ctx = UIGraphicsGetCurrentContext()

            // Draw existing page
            ctx!.saveGState()

            ctx!.scaleBy(x: 1, y: -1)

            ctx!.translateBy(x: 0, y: -pageFrame!.size.height)
            //CGContextTranslateCTM(ctx, 0, -pageFrame.size.height);
            ctx!.drawPDFPage(page!)
            ctx!.restoreGState()

            // Draw image on top of page
            let image = signatureImage
            image.draw(in: CGRect(x: 100, y: 100, width: 100, height: 100))
            // Draw red box on top of page
            //UIColor.redColor().set()
            //UIRectFill(CGRectMake(20, 20, 100, 100));
        }


        UIGraphicsEndPDFContext()
    }

08-24 19:13