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

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

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

此外,问题是古怪的。 如果我用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,并可以根据要求尝试填写任何其他相关详细信息。 我很担心发布任何代码,因为我不确定它是否是犹太人,除了这个特殊问题外,它适用于构建表单; 更不用说我可以在不使用我们的webapp的情况下重现问题了。

这是我在这里的第一篇文章,我是一名新手程序员(仍然在学校!)所以如果我违反了任何约定或者可以以任何方式改进我未来的查询,请告诉我。

谢谢你尽你所能的帮助!

检查jbowman在他的问题的评论中提供的文件 – 特别关注密码字段(这是由evince填充的字段之一)—显示:

Template.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编辑的forms,现在由其他软件(evince)在追加模式下编辑;
  • 包含一个包含8个字段的Acroform,没有NeedAppearances标志; 对字段passwordField:u4woYY1FK9和memberPrefix:u4woYY1FK9进行了唯一的更改:
  • 有一个新的关联值asdf的密码字段(名为passwordField:u4woYY1FK9),但其外观未受影响;
  • 具有成员前缀字段(名为memberPrefix:u4woYY1FK9),其具有新的关联值asdf,但保持其外观不变。

因此,可以预期观察到的默认值未显示的行为:

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

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

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

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

所以你看到这个空矩形。

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

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

我已经接受了mkl的答案,因为它触及了关于为什么字段没有正确显示的问题,并且包含了比我能提供的关于该问题的更多信息。 但是,答案注释中的建议修复不起作用,因为使用iText 2.1.5的PdfCopyFields生成文档(在这种特殊情况下),它不尊重(剥离)原始文档的NeedAppearances标志,并调用setNeedAppearances(true) for AcroForm没有解决问题。

PdfCopyFieldsImpcreateAcroForms()方法以包含该行

 form.put(PdfName.NEEDAPPEARANCES, PdfBoolean.PDFTRUE); 

最终似乎已经为我解决了这个问题。 通过此添加,evince在保存和重新打开文档后正确显示对字段的更改。