Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用evince保存后,可编辑的.pdf字段将消失(但在字段焦点上可见)_Java_Web Applications_Pdf Generation_Itext_Ubuntu 12.04 - Fatal编程技术网

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

Java 使用evince保存后,可编辑的.pdf字段将消失(但在字段焦点上可见),java,web-applications,pdf-generation,itext,ubuntu-12.04,Java,Web Applications,Pdf Generation,Itext,Ubuntu 12.04,首先,让我感谢SO社区在过去多次帮助我;你们是一个了不起的资源 在我的工作中,我使用Scribus中创建的PDF模板和iText Java库开发一个web应用程序,用数据库中的数据填充模板。有时,用户提供的字段是必需的,iText不会触及该字段。下载.pdf文件时,会编辑一个字段,并保存一份副本,表明重新打开后生成的文件不会显示编辑过的文本。但是,在编辑的字段聚焦后,它将显示保存的文本。不聚焦,文本消失。剪切文本,粘贴回字段;在保存并重新打开文档之前,它始终可见。保存并重新打开原始问题清单后。关

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

在我的工作中,我使用Scribus中创建的PDF模板和iText Java库开发一个web应用程序,用数据库中的数据填充模板。有时,用户提供的字段是必需的,iText不会触及该字段。下载.pdf文件时,会编辑一个字段,并保存一份副本,表明重新打开后生成的文件不会显示编辑过的文本。但是,在编辑的字段聚焦后,它将显示保存的文本。不聚焦,文本消失。剪切文本,粘贴回字段;在保存并重新打开文档之前,它始终可见。保存并重新打开原始问题清单后。关于这个问题,我发现了很多非常相似的帖子,但是没有一个解决方案对我有效

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

这让我相信行为不端的文件可能在某种程度上被破坏了,iText可能是我问题的原因,但iText并不是我重现问题的唯一途径,所以我不确定该怎么想。在我见过的众多问题中,我似乎找不到一个有效的解决办法。是否有人对这个问题足够熟悉,能够告诉我在哪里可以找到问题的根源,或者提供一些关于我正在使用的工具的见解?如果你用谷歌搜索这个问题,很可能我已经看到了

我使用的是Ubuntu12.04(精确版)、Evince 3.4.0、iText 2.1.5,如果您要求,我可以尝试向您提供任何其他相关细节。我担心发布任何代码,因为我不确定它是否符合犹太教标准,并且它在构建表单时效果良好,除了这个特殊问题;更不用说不用我们的webapp我就能重现这个问题了

这是我在这里的第一篇帖子,我是一个新手程序员(还在上学!),所以如果我违反了任何惯例,或者可以以任何方式改进我未来的查询,请务必告诉我


谢谢你能提供的任何帮助

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

Template.pdf

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

  • 是由iText 2.1.5编辑的原始表单,不幸的是,它没有处于附加模式,这将使分析更容易
  • 包含一个Acroform,其中包含8个字段(成员编号字段已填充并展平),但没有标记
  • 密码字段(名为passwordField:u4woYY1FK9)的值和外观保持不变
在\u itext\u edited.pdf之后

  • 以前由iText编辑的表单现在由其他软件(evince)以追加模式编辑
  • 包含一个Acroform,其中包含8个字段,但没有标记;仅对字段passwordField:u4woYY1FK9和memberPrefix:u4woYY1FK9进行了更改:
  • 密码字段(名为passwordField:u4woyyy1fk9)具有新的关联值asdf,但其外观保持不变
  • 具有成员前缀字段(名为memberPrefix:u4woYY1FK9)和新的关联值asdf,但其外观保持不变
因此,观察到的默认值未显示的行为是预期的:

最后一个Acroform没有标记。该标志在规范中定义为:

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

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

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

你可以看到这个空矩形

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


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

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

正在对
PdfCopyFieldsImp
中的
createAcroForms()
方法进行黑客攻击,以包含该行

form.put(PdfName.NEEDAPPEARANCES, PdfBoolean.PDFTRUE);
这似乎最终解决了我的问题。添加此项后,evince会在保存并重新打开后正确显示对字段的更改