-2

在我删除/添加注释后,我将文件保存到磁盘(这甚至是正确保存注释所必需的吗?)。然后,我将文档UIActivityViewController放在UIActivityItemProvider.

注释可在打印预览、PDF Expert、Firefox、Gmail 浏览器、预览等中查看 - 只是 Acrobat 无法查看(并导出为 .doc)

使用 Acrobat Reader Build 19.21.20061.361316;使用 Xcode 11.3

我正在编辑的 PDF此处

示例注释:

// Open PDF etc
if annotation.fieldName == "form1[0].Page1[0].WE_FACTR[0]" {
     annotation.setValue("30.0", forAnnotationKey: .widgetValue)
     page.removeAnnotation(annotation)
     page.addAnnotation(annotation)
}
// save PDF to file
// PDF File is in the UIACtivityViewController

我想知道是否有人有针对 Adob​​e Reader 的 PDFKit 中缺少注释的解决方法。

当我从PSPDFKit向@steipete 提问时,他告诉我这就是人们使用他的框架的原因。他建议有一个替代电话PDFXKit 。

它也不适用于 PSPDFKit!似乎不支持 XFA 表单。

4

2 回答 2

2

我遇到了同样的问题,我在应用程序中打开一个带有表单的 PDF,并用来自不同文本字段的数据填充它。不幸的是,由于 mkl 对此进行了很好的解释,所有注释在所有 Pdf 阅读器上都可见,希望大多数人使用的那个...Acrobat ...我一直在寻找解决方案,但不幸的是 PDFKit 没有在这个时候一个扁平化PDF的选项,我不得不想出一个“丑陋”的解决方案。但至少对于我的需要它有效。使用所有注释更新 PDF 表单后,我将其转换为图像,然后将其转换回 PDF。我现在有一个“扁平化”的 pdf ......这不是很好,我希望 Apple 将来会在他们的 PDFkit 中添加一个扁平化 pdf 的功能。

如果有更好的解决方案,请告诉我!

转换为图像

func pdfToImage(url: URL) -> [UIImage]? {
    
    let pdfDocument = PDFDocument(url: url)!
    let numbPages = pdfDocument.pageCount
   
    var imagePdf = [UIImage]()
    
    for i in 0...numbPages-1 {
        
        let page = pdfDocument.page(at: i)!
        let bounds = page.bounds(for: .mediaBox)
        
        
        let renderer = UIGraphicsImageRenderer(bounds: bounds, format: UIGraphicsImageRendererFormat.default())
        
         let img = renderer.image { (context) in
        
         context.cgContext.saveGState()

         context.cgContext.translateBy(x: 0, y: bounds.height)
        
         context.cgContext.concatenate(CGAffineTransform.init(scaleX: 1, y: -1))
         
         page.draw(with: .mediaBox, to: context.cgContext)
         
         context.cgContext.restoreGState()
         }
        
        imagePdf.append(img)
       
   
}
     return imagePdf
}

转换回PDF

func imageToPDF(image: [UIImage])-> PDFDocument? {
    let pdfDocument = PDFDocument()
    for (index,image) in image.enumerated() {
        let pdfPage = PDFPage(image: image)
        pdfDocument.insert(pdfPage!, at: index)
    }
    return pdfDocument
}

然后我只是调用这些函数

    let imageFromPdf = pdfToImage(url: pdfURL)!
   
    let flattenPDF = imageToPDF(image: imageFromPdf)
    
    flattenPDF?.write(to: pdfURL2)
于 2020-06-21T13:21:49.857 回答
1

您的 PDF 具有XFA/AcroForm 混合表单定义。这意味着表单在 PDF 中定义了两次,一次使用 AcroForm 对象,即“本机”PDF 表单格式,一次使用 XFA XML 流,同时已弃用的替代表单技术允许更多动态表单。

如果您的 PDF 在支持 XFA 的 PDF 处理器中打开(这主要意味着 Adob​​e 查看器加上很少的其他处理器),则 XFA 表单定义将被处理(例如显示)并且所有正常的 PDF 内容都将被忽略,而只是 AcroForm 表单定义中的值更新以匹配 XFA 表单值。

如果您的 PDF 在不支持 XFA的 PDF 处理器中打开(即基本上除了 Adob​​e 产品之外的所有产品),则会处理包括 Acroform 表单定义在内的正常 PDF 内容。

这解释了你的观察

注释可在打印预览、PDF Expert、Firefox、Gmail 浏览器、预览等中查看 - 只是 Acrobat 无法查看(并导出为 .doc)

(我现在才看到你自己发现了 XFA 并编辑了一个指向你问题的评论。)

在这种情况下,通常的解决方案是删除 XFA 表单定义。一旦它被删除,所有处理器(Adobe 查看器也是如此)将只处理正常的 PDF 内容,包括 AcroForm 表单定义。

为此,您只需删除PDF 的AcroForm字典中的XFA条目。

如果文档中存在使用权签名(如您的文档中一样),则删除将使其无效。在这种情况下,您还应该删除目录中的Perms条目。

不幸的是,我不知道你的库,所以我无法展示用它们来实现它的代码。

于 2020-01-27T11:29:03.900 回答