4

首先,让我感谢 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 的情况下重现问题。

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

谢谢你的尽心帮助!

4

2 回答 2

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)以附加模式编辑;
  • 包含一个没有 NeedAppearances 标志的 8 个字段的 Acroform;对字段 passwordField:u4woYY1FK9 和 memberPrefix:u4woYY1FK9 进行了唯一更改:
  • 具有带有新关联值asdf的密码字段(名为 passwordField:u4woYY1FK9),但其外观保持不变;
  • 具有成员前缀字段(名为 memberPrefix:u4woYY1FK9)和一个新的关联值asdf,但其外观保持不变。

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

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

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

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

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

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

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

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

于 2012-11-19T10:48:50.473 回答
1

我已经接受了 mkl 的回答,因为它对字段显示不正确的原因一针见血,并且包含的​​信息比我能提供的关于该问题的信息要多得多。但是,答案评论中的建议修复不起作用,因为文档是使用 iText 2.1.5 生成的(在这种特殊情况下)PdfCopyFields,它不尊重(剥离)原始文档的 NeedAppearances 标志,并且要求setNeedAppearances(true)没有AcroForm解决问题因为这。

破解createAcroForms()方法PdfCopyFieldsImp以包含该行

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

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

于 2013-11-26T01:19:28.797 回答