PDFKit 和 PDFDocument 注释在 Adobe Acrobat 中不可见
Posted
技术标签:
【中文标题】PDFKit 和 PDFDocument 注释在 Adobe 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
我想知道是否有人为 Adobe 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 处理器中打开(这主要意味着 Adobe 查看器加上很少的其他处理器),则 XFA 表单定义将被处理(例如显示)并且所有正常的 PDF 内容都将被忽略,仅在AcroForm 表单定义已更新以匹配 XFA 表单值。
如果您的 PDF 在不支持 XFA 的 PDF 处理器中打开(即基本上除了 Adobe 产品之外的所有产品),则会处理包括 Acroform 表单定义在内的正常 PDF 内容。
这解释了你的观察
注释可在打印预览、PDF Expert、Firefox、Gmail 浏览器、预览等中查看 - 只是 Acrobat 无法查看(并导出为 .doc)
(我现在才看到你自己发现了 XFA 并编辑了一个指向你问题的评论。)
在这种情况下,通常的解决方案是删除 XFA 表单定义。一旦删除,所有处理器(也包括 Adobe 查看器)将仅处理普通 PDF 内容,包括 AcroForm 表单定义。
为此,您只需删除 PDF 的 AcroForm 字典中的 XFA 条目。
如果文档中存在使用权签名(如您的文档中一样),则删除将使其无效。在这种情况下,您还应该删除 Catalog 中的 Perms 条目。
很遗憾,我不知道你的库,所以我无法展示用它们实现这个的代码。
【讨论】:
非常感谢您的回复!这似乎是我的问题的正确答案。我在 ios 上,所以 PDFKit 将是我将在设备上使用的库。我还没有找到任何软件来删除 XFA 条目。我还没有尝试过 Acrobat Pro,因为我没有它。以上是关于PDFKit 和 PDFDocument 注释在 Adobe Acrobat 中不可见的主要内容,如果未能解决你的问题,请参考以下文章
iOS 11 PDFKit 墨水注释 - 无法填充 UIBezierPath
在 iOS 上使用 PDFKit.PDFView 打开 PDF