Java 使用evince保存后,可编辑的.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我就能重现这个问题了 这是我在这里的第一篇帖子,我是一个新手程序员(还在上学!),所以如果我违反了任何惯例,或者可以以任何方式改进我未来的查询,请务必告诉我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文件时,会编辑一个字段,并保存一份副本,表明重新打开后生成的文件不会显示编辑过的文本。但是,在编辑的字段聚焦后,它将显示保存的文本。不聚焦,文本消失。剪切文本,粘贴回字段;在保存并重新打开文档之前,它始终可见。保存并重新打开原始问题清单后。关
谢谢你能提供的任何帮助 检查jbowman在对其问题的评论中提供的文件,特别是密码字段(这是evince内部填写的字段之一),显示: Template.pdf
- 是Scribus PDF Library 1.4.1.svn生成的原始表单李>
- 包含一个包含9个字段的AcroForm,且标志设置为true李>
- 具有密码字段(名为passwordField),其中包含一个空值和一个用空文本绘制矩形的正常外观流
- 是由iText 2.1.5编辑的原始表单,不幸的是,它没有处于附加模式,这将使分析更容易李>
- 包含一个Acroform,其中包含8个字段(成员编号字段已填充并展平),但没有标记李>
- 密码字段(名为passwordField:u4woYY1FK9)的值和外观保持不变
- 以前由iText编辑的表单现在由其他软件(evince)以追加模式编辑李>
- 包含一个Acroform,其中包含8个字段,但没有标记;仅对字段passwordField:u4woYY1FK9和memberPrefix:u4woYY1FK9进行了更改:
- 密码字段(名为passwordField:u4woyyy1fk9)具有新的关联值asdf,但其外观保持不变李>
- 具有成员前缀字段(名为memberPrefix:u4woYY1FK9)和新的关联值asdf,但其外观保持不变
如果使用evince编辑PDF文件的目的是获得可见结果,则evince在更改字段值时必须添加更新的外观流,或者确保设置了AcroForm NeddAppearances标志。因此,这就是evince失败的地方。我接受了mkl的答案,因为它直截了当地说明了字段为什么不能正确显示,并且包含了比我能提供的更多的关于该问题的信息。但是,答案注释中建议的修复方案不起作用,因为文档是使用iText 2.1.5的
PdfCopyFields
生成的(在这种特殊情况下),它不尊重(去除)原始文档的NeedAppearancess标志,并调用SetNeedAppearancess(true)forAcroForm
因此没有解决问题
正在对PdfCopyFieldsImp
中的createAcroForms()
方法进行黑客攻击,以包含该行
form.put(PdfName.NEEDAPPEARANCES, PdfBoolean.PDFTRUE);
这似乎最终解决了我的问题。添加此项后,evince会在保存并重新打开后正确显示对字段的更改