Pdf.js: 交互式表单(AcroForm)支持

创建于 2016-09-07  ·  28评论  ·  资料来源: mozilla/pdf.js

_这只是一个跟踪问题,所以这里不是任何其他问题或讨论的地方。 为此打开一个新问题。_

根据 PDF 参考 (http://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/PDF32000_2008.pdf#G11) 的第 12.7 章,这是交互式表单 (AcroForm) 支持的元问题.2110737)。 这包括除签名字段之外的所有表单元素,在#1076 中进行跟踪。 目标是让https://github.com/mozilla/pdf.js/blob/master/test/pdfs/f1040.pdf.link完全渲染,同时解决其他未解决的问题和 PR。

一般的

  • [x] 为实现表单元素准备核心和显示层(#7596)
  • [x] 参考测试 (#7602)
  • [x] 偏好 (#7602)
  • [x] 删除全局PDFJS.renderInteractiveForms使用(#7640)
  • [x] 重构WidgetAnnotation字段名称构造代码 (#7775)
  • [x] 重构或阐明注释的呈现位置

    • 主要在显示层,但是带有外观流的文本小部件注释在核心层渲染,这会造成混乱......

  • [x] 出场
  • [x] 当页面不可见时,当页面被销毁时存储输入的值
  • [x] 打印输入的值

    • 打印 HTML 元素或将内容渲染到画布上(使用appendToOperatorList

  • [x] 默认启用
  • [x] 更新示例 (#8030)
  • [x] 添加 Firefox 首选项以启用/禁用表单 (https://bugzilla.mozilla.org/show_bug.cgi?id=1652145)

文本小部件

  • [x] 渲染单行字段 (#7602)
  • [x] 句柄最大长度 (#7622)
  • [x] 处理标志:多行和只读 (#7633)
  • [x] 处理标志:梳子 (#7649)
  • [x] 处理对齐 (#7622)
  • [x] 在核心层和单元测试中清理maxLentextAlignment (#7629)

选择小部件

  • [x] 组合框的渲染 (#7671)
  • [x] 列表框的渲染 (#7671)

按钮小部件

  • [x] 按钮渲染 (#9191)
  • [x] 复选框的渲染 (#7898)
  • [x] 单选按钮的渲染 (#7898)
4-annotations 4-form-acroform

最有用的评论

这是一个跟踪问题(参考 https://github.com/mozilla/pdf.js/issues/7613#issuecomment-251895091),所以这里不是讨论或提问的地方。 如有问题,请通过 IRC 联系我们,如果您发现错误,请提交单独的问题。 谢谢。

_(我解锁对话是为了让用户可以使用反应按钮来衡量对该功能的兴趣,但不相关的评论将被删除。)_

所有28条评论

根据 PDF 参考 (https://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/pdf_reference_1-7) 的第 8.6 章,这是跟踪交互式表单 (AcroForm) 支持的元问题。 pdf#page=671&zoom=auto,-246,244)。

最好将工作基于最新版本的 PDF 规范,以防万一有任何差异: http :

另外,添加一个关于确保适当的测试覆盖率的“通用”TODO 项目也许是个好主意?

这两个项目都得到了解决。 谢谢!

我认为我们还必须实际解析AcroForm字典的内容,否则我们将无法加载所有必要的字体资源。
显然,我们不能在显示层中使用自定义字体,但我们至少应该能够推断出应该使用的正确字体系列(以及诸如粗体/斜体之类的东西)并将该信息传递给显示层。

此外,对于打印表单,我们可能能够利用(或构建)现有的appendToOperatorList功能,但这肯定需要加载AcroForm字典中的字体资源。

我们可能应该尝试支持的另一件事是在显示层中使用正确的文本颜色(注意在 Adob​​e Reader 中f1040.pdf表单字段中的文本是蓝色的)。 这可能与更好、更完整的Appearance流支持有关。

最后,一个普遍的问题:我们是否真的能够以一种有意义的方式支持表单,而没有部分(并且经过良好净化的)脚本支持?

好点。 我只是将它们添加到上面的项目列表中。 我不认为我们真的需要脚本支持,因为 AcroForms 通常只需要填写和打印。 AFAIK 脚本仅用于元素之间的交互,但我们可以自己实现最常用的功能(例如重置表单或用于打印的按钮操作)。 我们必须看看这种脚本功能的使用有多广泛。

处理标志:多行和只读

我们可能还需要尝试和支持其他标志,一个例子是comb ,它控制输入字段中字符之间的间距。 那个实际上用于f1040.pdf的第二页,请参阅“个人识别码 (PIN)”字段。

听起来是一个好主意。 我已将其添加到列表中。

看看构建fullName属性的WidgetAnnotation代码是否可以清理或改进,这可能也是一个好主意,请参阅https://github.com/mozilla/pdf.js /blob/6c263c19946af23b723f148d9f05118971e18b36/src/core/annotation.js#L640 -L670。

此外,关于WidgetAnnotation似乎不同类型对注释字典中的V条目可能有不同的要求,因此最好在 _each_ 中获取和验证data.fieldValue特定的WidgetAnnotation子类。

第一点现在在列表中,对此我有一些想法。 我发现了一个补丁中的第二点,我目前正在完成选择小部件注释,因此将在那里解决。

嘿@timvandermeij
此功能何时可用? 我能提供什么帮助?

我们目前正在实现这一点,但这是一个很大的功能,需要时间才能完成。 上面打勾的框显示了哪些元素已经实现,而对于其他框,已经有正在进行的拉取请求,所以我们正在使用这个功能。 随意使用master分支并将renderInteractiveForms参数设置为true来测试它。 默认情况下它是禁用的,因为它还没有准备好。

谢谢蒂姆,你能告诉我关于数字签名的什么吗? 根据这个讨论线程有进展https://github.com/mozilla/pdf.js/issues/1076

这是由用户报告的:soa-x在 2012 年 1 月 13 日打开了这个问题

距离报道已经过去了将近 5 年。

甚至有人已经完成了大部分的实现

viveksjain 于 2 月 22 日发表评论
@complience嗨,我有一个在https://github.com/viveksjain/pdf.js/tree/sig-verify-support 上工作的概念验证https://github.com/viveksjain/pdf.js.git来尝试

您知道这些作业是否已添加到最新版本的 pdf.js 中吗?

回复: https :

PDF 文件中的签名是一个大而复杂的主题,它与基本 AcroForm 支持的实现有些正交(这是_这个_特定问题正在跟踪的内容)。

当前的问题只是基本 AcroForm 功能实现的跟踪问题,签名已经在其他地方跟踪(在 #1076 中,应该讨论该功能的地方)。

@lexcorp请不要在此处发布不相关的信息和/或提出问题,因为这会偏离此问题的目的(跟踪对基本 AcroForm 功能的支持)。
此外,您现在已经在_三个_不同的问题中发布了基本相同的信息,请不要以这种方式向问题跟踪器发送垃圾邮件!

你好@timvandermeij @Snuffleupagus
我们非常喜欢您添加对 AcroForm 字段支持的解决方案。 我们计划在我们目前正在开发的应用程序中使用这些功能。 如果您能向我们提供一个暂定日期,我们将不胜感激,您可以在其中添加对所有类型的表单字段(如复选框等)的支持,并将填充的数据导出为 XFDF 文件或任何其他格式。 谢谢。

@anujgeek正如我在https://github.com/mozilla/pdf.js/issues/7613#issuecomment -251699579 中已经提到的,这是一个 _tracking_ 问题,并不是进行这种一般性讨论的好地方和/或提问!

有许多相当困难的 TODO 需要实现,请参阅上面可能不完整的列表,因此_不可能_给出任何类型的估计何时,甚至是否会完全实现此功能。

另请注意,到目前为止,所有工作都由贡献者完成,鉴于 Mozilla 正在替换 Firefox 中的 PDF.js(请参阅 https://wiki.mozilla.org/Mortar_Project)表单支持很可能需要一段时间才能完成。

这是一个跟踪问题(参考 https://github.com/mozilla/pdf.js/issues/7613#issuecomment-251895091),所以这里不是讨论或提问的地方。 如有问题,请通过 IRC 联系我们,如果您发现错误,请提交单独的问题。 谢谢。

_(我解锁对话是为了让用户可以使用反应按钮来衡量对该功能的兴趣,但不相关的评论将被删除。)_

一起嗨起来!

AcroForm 填充的进展如何?
使用的示例https://www.irs.gov/pub/irs-pdf/f1040.pdf (和其他)仍然不起作用。 还是默认没有配置?
提到了一些基本的 JavaScript,如设置字段、清除字段、发送按钮支持?

谢谢。

@Alex-DE-74 请仔细阅读以上评论,特别是https://github.com/mozilla/pdf.js/issues/7613#issuecomment -251895091 和https://github.com/mozilla/pdf。 js/issues/7613#issuecomment -287907674 是相关的。
此外,您已经在#9261(提供答案的地方)中提出了这些问题; 请让我们试着让这个跟踪问题不受那种一般性讨论的影响。

@Snuffleupagus

对不起,但对我来说,通过许多主题,哪个项目具有哪个阶段,这并不是真正可追溯的。 循环引用根本没有帮助。 从https://github.com/mozilla/pdf.js/projects/1 的角度来看,我很清楚,现在(完全)支持什么 AcroForms 以及计划中的内容。 此外,许多主题涉及重新编辑/查看,但没有关于填写/检查/选择/提交等交互功能的字样。 因此,例如,上面的“文本小部件”部分与“文本输入”无关。 比,如果“AcroForm 词典”目前根本没有被解析,它怎么能很好地工作?
也许如果“用户”看到一个简单的表格会有所帮助,其中 AcroForm 具有其属性和列出的整体/特定/计划支持的状态。 (为什么这显示为粗体=?!)

PS 这对我来说很痛苦,我不是 JS/HTML5 专家,但在另一个站点上做了很多事情(用 C# 创建 PDF)并且熟悉其他编程语言。 我是否值得尝试了解当前代码以提供一些更具交互性的支持并帮助开发该项目? 还是仅仅为了理解当前的架构就需要花费大量的时间?

我已为您删除了粗体样式。 我想再次强调,这里不是进行这种讨论的地方; 像 IRC 这样的频道会更合适,所以我们可以提供一些背景信息。 填写/提交/打印表格实际上在上面的复选框列表中,只是尚未实施。 “文本小部件”部分是关于呈现文本小部件的,这意味着您可以输入的输入字段。大功告成; 剩下的部分是存储输入的值。 欢迎任何人帮助实现这一点。

顺便说一句:Chrome 也无法保存带有表单的 PDF,但有一个解决方法。 表单默认呈现,并且可以打印它们,甚至可以默认将它们打印为 PDF,包括表单输入。

也许这也适用于 pdf.js,我们可以使用现有的 FF 保存为 PDF ( https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/tabs/saveAsPDF )?

我正在尝试使用 pdf.js 尝试打印输入的表单文本字段值。 我有一个基本的工作概念证明,我可以在其中将输入的值呈现到打印 PDF 中。 我现在想讨论我的方法,看看是否有人提出了更好或更简单的方法。

在我的方法中,我通过向任务添加映射将输入的值传递给工作任务。 该地图目前在“beforeprint”事件中填充。
在“TextWidgetAnnotation”的“getOperatorList”方法中,我读取了对象流并将“Tj”运算符的旧文本值替换为新值。 这有效,但有很多问题。 第一个是,如果流没有 'Tj' 运算符,因为该字段没有值,它会失败。 第二个是,“左”以外的对齐方式的位置是错误的。
所以下一个想法是创建一个全新的流,自己计算所有值。 这将是很多工作,所以我想首先讨论这种方法。
我已经可以创建一个新流并显示值,但同样,“Td”操作的偏移值存在问题。 我深入研究了代码,我认为我需要通过考虑给定字体的字符串的宽度和高度来计算偏移量 X 和 Y 位置。 我找到了一种嵌入字体的 FontDescriptor,但没有找到系统字体。 使用字体描述符我有字体的上升和下降值,我想我可以用它来计算 y 偏移 对于左对齐的文本,x 偏移将是固定的,但需要为居中或右对齐的文本计算. 我想我可以用 Font xRef 的宽度数组来做到这一点,但同样,系统字体没有这样的。 所以我想我将不得不使用画布和 measureText 方法。

所以正如你所看到的,有很多“思考”。 但在我尝试实施和测试我的方法之前,我想知道其他人是怎么想的。

前段时间我们讨论了如何解决这个问题。 请参阅https://mozilla.logbot.info/pdfjs/20161219。 这个想法是有两个不同的操作员列表:一个用于 UI,另一个用于打印。 在打印中,我们将根据小部件中输入/选择的值替换操作。

我认为这比您所描述的要容易一些,因为我们让剩下的逻辑为我们完成繁重的工作; 我们只需要提供正确的操作员列表。

这是一个我们必须通过多个小步骤来解决的问题。 第一步是使注解代码异步,由@dmitryskey在#9822 中完成。 下一步是解析 AcroForm 字典中的字体,并解析注释字典中所有外观信息的默认外观条目。 为此,我们可能可以使用评估器将信息作为运算符列表获取,这需要注释代码是异步的。 然后,我们可以为每个注释类型创建打印操作员列表。

我也想过自己创建操作列表,但这对我来说比我的方法更复杂。 我只是使用“BMC ... EMC”创建 pdf 对象流并将流传递给生成操作列表的评估器。
如果我自己创建操作列表数组,我将遇到与生成新对象流相同的问题。 但是恕我直言,创建 oplist 比创建字符串并将其转换为对象流更复杂。 这已经在我的概念证明中起作用了。

我虽然 Opera/Chrome 也在使用 pdf.js,但 Opera 能够打印和使用公式数据。 也许有什么。 我们可以重用吗?

他们使用 PDFium,主要是 C++ 代码。

大家好,我工作的公司开始利用 PDFJS,我被告知我需要“存储输入的值,以便在页面不可见时销毁页面”工作。 我不确定这个线程是否适合讨论它。 @timvandermeij ,看来您是该项目的主要推动者。 无论如何,我们是否可以与您或社区中可以提供帮助的人取得联系。 我有一个实现此功能的策略,但我想确保我所做的也可以回归到这个 repo 中。 我们也愿意赞助或创建一些功能奖励,如果这有助于更快地完成任务。

如果您有关于如何完成此操作的想法,最好打开一个单独的问题来讨论它。 主要问题是如何处理输入的数据。 打印时将其渲染到画布上? 提供以 FDF 格式下载值的选项吗? 用填充的值渲染一个新的 PDF 文件? 等等。 这取决于用户的期望以及其他 PDF 阅读器的做法。

关闭,因为 AcroForm 支持现已完成并启用。 剩下的问题现在在单独的问题中归档并使用4-form-acroform标签收集; 参见https://github.com/mozilla/pdf.js/labels/4-form-acroform。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

dmisdm picture dmisdm  ·  3评论

jigskpatel picture jigskpatel  ·  3评论

kleins05 picture kleins05  ·  3评论

aaronshaf picture aaronshaf  ·  3评论

AlexP3 picture AlexP3  ·  3评论