PDFKit 和 PDFDocument 注释在 Adob​​e Acrobat 中不可见

Posted

技术标签:

【中文标题】PDFKit 和 PDFDocument 注释在 Adob​​e Acrobat 中不可见【英文标题】:PDFKit and PDFDocument Annotations not visible in Adobe Acrobat 【发布时间】:2020-01-09 04:40:38 【问题描述】:

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

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

使用 Acrobat Reader Build 19.21.20061.361316;使用 Xcode 11.3

The PDF I am editing 或 here

示例注释:

// 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 表单。

【问题讨论】:

可能相关:***.com/questions/58860015/… 【参考方案1】:

我遇到了同样的问题,我在应用程序中打开一个带有表单的 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)

【讨论】:

【参考方案2】:

您的 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 表单定义。一旦删除,所有处理器(也包括 Adob​​e 查看器)将仅处理普通 PDF 内容,包括 AcroForm 表单定义。

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

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

很遗憾,我不知道你的库,所以我无法展示用它们实现这个的代码。

【讨论】:

非常感谢您的回复!这似乎是我的问题的正确答案。我在 ios 上,所以 PDFKit 将是我将在设备上使用的库。我还没有找到任何软件来删除 XFA 条目。我还没有尝试过 Acrobat Pro,因为我没有它。

以上是关于PDFKit 和 PDFDocument 注释在 Adob​​e Acrobat 中不可见的主要内容,如果未能解决你的问题,请参考以下文章

PDFKit / PDFView 禁用与表单注释的交互

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

iOS PDFKit不会写

在 iOS 上使用 PDFKit.PDFView 打开 PDF

如何在 iOS、PDFKit、swift 中获取 pdf 页面的准确 X 和 Y 原点值

如何在pdfkit swift中添加圆形注释?