使用 evince 保存后,可编辑的 .pdf 字段消失(但在字段焦点上可见)

jbo*_*man 4 java pdf-generation web-applications itext ubuntu-12.04

首先,让我感谢 SO 社区过去多次帮助我;你们是一个了不起的资源!

在我的工作中,我开发了一个 Web 应用程序,该应用程序使用在 Scribus 中创建的 PDF 模板和 iText Java 库来使用我们数据库中的数据填充模板。有时,用户提供的字段是必需的,iText 不会触及。下载 .pdf 后,编辑一个字段,并使用 Evince 保存副本,结果文件在重新打开时不会显示编辑过的文本。但是,在编辑字段的焦点上,它将显示保存的文本。失去焦点,文字消失。剪切文本,粘贴回字段;它保持可见 - 直到您保存并重新打开文档。保存并重新打开后,原始问题清单。我发现了许多关于这个问题的极其相似的帖子,但似乎没有一个解决方案对我有用。

另外,这个问题很奇怪。如果我用 Evince 打开 Scribus 模板(iText 未触及的 .pdf 文件),然后编辑字段并保存,它们将在重新打开时正确显示。然而,一旦库接触到模板,问题就会出现。同样,我可以用我在搜索此问题的原因时发现的 PDF 文件重现该问题;像这个:

http://www.quask.com/samples/pdfforms/pcpurchase.pdf

这让我相信行为不端的文件可能会以某种方式损坏,并且 iText 可能是我的问题的原因,但 iText 不是我可以重现问题的唯一途径,所以我不知道该怎么办思考。我似乎无法在我见过的众多解决方案中找到可行的解决方案。有没有人对这个问题足够熟悉,能够告诉我在哪里可以深入了解这个问题,或者提供一些关于我正在使用的工具的见解?很有可能,如果您使用谷歌搜索问题,我已经看到了..

我正在使用 Ubuntu 12.04(精确)、Evince 3.4.0、iText 2.1.5,并且可以根据要求尝试为您填写任何其他相关详细信息。我很担心发布任何代码,因为我不确定它是否符合 Kosher 标准,并且它可以很好地构建表单,除非有这个特殊问题;更不用说我可以在不使用我们的 webapp 的情况下重现问题的事实。

这是我在这里的第一篇文章,我是一个新手程序员(还在学校!)所以请让我知道我是否违反了任何约定或可以以任何方式改进我未来的查询。

谢谢你的尽心帮助!

mkl*_*mkl 5

对 jbowman 在其问题的评论中提供的文件的检查——特别注意密码字段(这是 evince 最终填写的字段之一)——显示:

模板.pdf

  • 是由 Scribus PDF Library 1.4.1.svn 生成的原始表格;
  • 包含一个具有 9 个字段的 AcroForm,并且标志 NeedAppearances 设置为 true;
  • 有一个密码字段(名为 passwordField),它包含一个空值和一个正常的外观流,用空文本绘制一个矩形。

after_itext.pdf

  • 是 iText 2.1.5 编辑的原始表单,不幸的是不是在附加模式下,这会使分析更容易;
  • 包含一个带有 8 个字段的 Acroform(成员编号字段已被填充并扁平化),没有 NeedAppearances 标志;
  • 具有密码字段(名为 passwordField:u4woYY1FK9)值和外观保持不变。

after_itext_edited.pdf

  • 是以前由 iText 编辑的表单,现在由其他一些软件(evince)以追加模式编辑;
  • 包含一个带有 8 个字段的 Acroform,没有 NeedAppearances 标志;对字段 passwordField:u4woYY1FK9 和 memberPrefix:u4woYY1FK9 进行了唯一更改:
  • 密码字段(名为 passwordField:u4woYY1FK9)具有新的关联值asdf,但其外观保持不变;
  • 具有带有新关联值asdf的成员前缀字段(名为 memberPrefix:u4woYY1FK9),但未更改其外观。

因此,默认情况下不显示值的观察行为是可以预期的:

最终的 Acroform 没有 NeedAppearances 标志。该标志在ISO 32000-1:2008规范中定义为:

一个标志,指定是否为文档中的所有小部件注释构造外观流和外观字典(见 12.7.3.3,“可变文本”)。默认值:假。

因此,最终形式的 PDF 文档表示:不需要生成小部件的外观(例如 AcroForm 字段可视化),从文档中获取外观。

文档中密码字段的外观是原始的,带有空文本的矩形。

所以你会看到这个空的矩形。

当您单击该字段时,PDF 查看器准备编辑其内容,因此会显示其认为合适的值。

如果使用 evince 编辑 PDF 文件旨在获得可见结果,则 evince 在更改字段值时还必须添加更新的外观流或确保设置了 AcroForm NddAppearances 标志。因此,这就是 evince 失败的地方。