当前位置: 首页 > 知识库问答 >
问题:

为什么我的PDF的Acroform复选框注释没有在Acrobat Reader中呈现?

西门嘉石
2023-03-14

我正在编写一些生成PDF文档的代码。我正在为可编辑的PDF表单生成Acroform复选框注释,这些注释在我测试的大多数PDF阅读器中都表现得非常好:Chrome、Firefox、Mac Preview和PDF Element 6。然而,我真的很难在Acrobat Reader中得到正确的渲染。

我一直在工作一个最小的示例PDF,只包含一个复选框,没有其他内容。

以下是当我悬停/单击复选框时,在Acrobat Reader中损坏的PDF的外观:

下面是它应该看起来的样子(来自Adobe Acrobat的工作PDF):

以下是一些PDF文件的链接:

  • 破碎PDF(由我的代码生成):http://www.filedropper.com/acrobat-minimal-broked
  • 工作PDF(在Adobe Acrobat中创建):http://www.filedropper.com/acrobat-checkbox-minimal-working
1 g
0 0 36.029 36.029 re
f
0.5 0.5 35.029 35.029 re
s
q
1 1 34.029 34.029 re
W
n
0 g
BT
/ZaDb 33.4305 Tf
2.853 6.3838 Td
32.8405 TL
0 0 Td
(4) Tj
ET
Q

(这是一个非常简单的流,它只是使用ZapfDingbats字体显示一个选中标记。)

不幸的是,我不能分享任何具体的代码示例。我正在使用Ruby和Prawn,但我也有很多低级专有代码(Prawn实际上没有任何对Acroform注释的支持。)我只需要理解这些PDF之间的主要区别,弄清楚为什么一个是坏的,而另一个是正确呈现的,然后我就能够在我的代码中进行更改。

如果你熟悉PDF规范,那么我将非常感激,如果你能请看一下我上面发布的PDF文件。谢谢你的帮助!

共有1个答案

霍襦宗
2023-03-14

我终于找到解决办法了!我花了很多时间削减每一个PDF直到我能找到最小的变化导致这个渲染错误在Acrobat Reader。(提示:使用pdftk original.PDF output original-uncompressed.PDF uncompress解压缩PDF流,然后可以在文本编辑器中编辑PDF。)

我终于在/root=>/acroform=>/da下找到了罪魁祸首。工作PDF文件包含:

/DA (/Helv 0 Tf 0 g)

损坏的PDF文件有:

/DA <feff002f00480065006c0076002000300020005400660020003000200067>

大多数PDF阅读器都会自动解码这个字符串,没有任何问题(Chrome,Firefox,Mac预览版),但是Acrobat Reader出于某种原因不支持这个。(特别适用于/acroform中的/da属性。它非常好地解码任何其他编码字符串。)

我真的很难发现这个问题,因为许多PDF调试工具(例如iText RUPS)会自动解码这些字符串,并隐藏它们被编码的事实。

我正在用Ruby编写一些PDF生成代码(使用Prawn和pdf-core gem),所以修复非常简单。

self[:DA] = '/Helv 0 Tf 0 g'

之后:

self[:DA] = PDF::Core::LiteralString.new('/Helv 0 Tf 0 g')

使用PDF::Core::LiteralString类可以防止Prawn对字符串进行编码。

进行此更改后,该复选框在Acrobat Reader中正常运行:

 类似资料:
  • 问题内容: 我发现不方便之处在于番石榴中的前提条件没有标注注释。考虑以下示例: 因此IDE找不到总是错误的。是否有任何特殊原因为什么不标记此前提条件(即使其参数是使用定义的)。 问题答案: 很抱歉,我们没有在任何地方使用过。为什么?我们尝试添加更多的空检查注释,发现: 添加所有其他注释非常冗长。 这就是我们所需要的。诚然,对于Guava开发人员而言,这比Guava用户更为重要。 似乎遇到了大多数问

  • 问题内容: 好的,我知道三引号字符串可以用作多行注释。例如, 和 但是从技术上讲,这些是字符串,对吗? 我已经在Google上搜索并阅读了Python样式指南,但无法找到关于为什么没有正式实现多行,/ * * /注释类型的技术答案。我使用三重引号没有问题,但是对于导致这个设计决定的原因我有点好奇。 问题答案: 我怀疑您会得到比“ Guido不需要多行注释”更好的答案。 Guido在推特上发布了以下

  • 我正在尝试使用CSS边框在GUI(fxml)上显示墙。getStyleClass()。add()但它们没有出现。 我正在使用一个开关,将相应的样式类添加到单元格中。 Java代码: CSS代码: GUI事后图片:结果

  • 我有复选框数组使用不同id的映射,所以不能为状态检查设置反应钩子,我尝试使用另一种方式,但仍然没有找到答案。我使用React-bootstrap的react钩子。

  • 我在资源文件夹中有文件。例如,如果我需要从资源文件夹获取文件,我会这样做: 我已经测试过了,一切正常! 路径是 /D:/java/projects/.../classes/X/Y/Z/myFile.jpg 但是,如果我使用Maven创建jar文件: ...,然后启动我的应用: 我有以下错误: …文件路径为: 当我尝试从资源文件夹获取文件时,会发生此异常。在这条线上。为什么?为什么JAR文件中有这个

  • 为什么我无法从mapview中删除我的注释? 我的代码: <代码>[self.mapView removeAnnotation:myAnnotation] 不适用于我