手动创建交互式PDF

手动创建交互式PDF,pdf,pdf-generation,Pdf,Pdf Generation,出于冗长的解释原因,我需要从C#应用程序创建简单的PDF,而不使用任何第三方库。相关PDF需要包括文本和线条图,如果可能,还应包括图像、单选按钮和文本字段。我一直在读Adobe的,这在很大程度上是直截了当的,但到目前为止,我还没有弄清楚如何使交互字段真正出现在文档上 例如,考虑下面描述的部分测试PDF文档: 1 0 obj << /Type /Catalog /Pages 2 0 R /AcroForm 6 0 R >> endobj ...

出于冗长的解释原因,我需要从C#应用程序创建简单的PDF,而不使用任何第三方库。相关PDF需要包括文本和线条图,如果可能,还应包括图像、单选按钮和文本字段。我一直在读Adobe的,这在很大程度上是直截了当的,但到目前为止,我还没有弄清楚如何使交互字段真正出现在文档上

例如,考虑下面描述的部分测试PDF文档:

1 0 obj
  << /Type /Catalog
     /Pages 2 0 R
     /AcroForm 6 0 R
  >>
endobj

...

6 0 obj
  << /Fields [ 7 0 R ]
     /DR 5 0 R
  >>
endobj

7 0 obj
  << /FT /Btn
     /Ff 65536
     /Kids [ 8 0 R 9 0 R ]
  >>
endobj

8 0 obj
  << /Parent 7 0 R
     /AS /FieldA
     /AP 10 0 R
  >>
endobj

9 0 obj
  << /Parent 8 0 R
     /AS /FieldB
     /AP 10 0 R
  >>
endobj

10 0 obj
  << /N
    << /FieldA 11 0 R
       /FieldB 12 0 R
       /Off 13 0 R
    >>
  >>
endobj

11 0 obj
  << /Length  59 >>
stream
  BT
    /F1 12 Tf
    0 0 Td
    (Field A) Tj
  ET
endstream
endobj

...

字段将需要包括所谓的“外观”,即包含用于创建字段视觉外观的绘图说明的XObject。见PDF规范第12.5.5节。或者,您可以将文档目录中AcroForm条目的NeedAppearancess属性设置为true。见PDF规范第12.7.2节。将此设置为true将导致一致性查看器根据字段的属性创建字段的外观。但是,您不能指望大多数查看器来完成此操作。

您的字段需要包括所谓的“外观”,即包含用于创建字段视觉外观的绘图说明的XObject。见PDF规范第12.5.5节。或者,您可以将文档目录中AcroForm条目的NeedAppearancess属性设置为true。见PDF规范第12.7.2节。将此设置为true将导致一致性查看器根据字段的属性创建字段的外观。但是,您不能指望大多数观众都能做到这一点。

根据您发布的完整文件,我看到了几个问题(可能还有更多问题):

  • 文档目录不包括/AcroForm条目
  • 该页面不包含带有字段小部件链接的/Annots条目
  • 字段定义8和9不完整,它们不包括小部件注释条目。这些条目指定页面上的字段位置
  • 您的字段是一个按钮,它没有不同的外观状态,/N外观应该是对外观流的引用(11、12或13)
  • 字段外观11、12、13无效,缺少/Type、/Subtype、/BBox、/Resources等条目
更新:下面您可以找到单选按钮的最小文件结构

1 0 obj
<< /Type /Catalog /Version /1.4 /Pages 8 0 R /AcroForm <</Fields [2 0 R ]>> >>
endobj
2 0 obj
<< /FT /Btn /T (Radio) /V /Off /Kids [5 0 R 3 0 R ] /Ff 32768 >>
endobj
3 0 obj
<< /Type /Annot /F 4 /Rect [250  667  270  687  ] /Subtype /Widget /AS /Off /AP << /N << /Two 7 0 R /Off 6 0 R >> >> /Parent 2 0 R /P 4 0 R >>
endobj
4 0 obj
<< /Type /Page /Contents null /MediaBox [0  0  612  792  ] /Parent 8 0 R /Annots [5 0 R 3 0 R ] >>
endobj
5 0 obj
<< /Type /Annot /F 4 /Rect [150  667  170  687  ] /Subtype /Widget /AS /Off /AP << /N << /One 7 0 R /Off 6 0 R >> >> /Parent 2 0 R /P 4 0 R >>
endobj
6 0 obj
<< /Type /XObject /Subtype /Form /BBox [0  0  20  20  ] /Length 74 >>
stream
/DeviceRGB CS 0 0 0 SC 1 w 0.5 0.5 m 19.5 0.5 l 19.5 19.5 l 0.5 19.5 l h S
endstream
endobj
7 0 obj
<< /Type /XObject /Subtype /Form /BBox [0  0  20  20  ] /Length 55 >>
stream
/DeviceRGB cs 0 0 0 sc 0 0 m 20 0 l 20 20 l 0 20 l h f
endstream
endobj
8 0 obj
<< /Type /Pages /Count 1 /Kids [4 0 R ] >>
endobj 
10对象
>
endobj
20 obj
>
endobj
30 obj
>/Parent 2 0 R/P 4 0 R>>
endobj
40 obj
>
endobj
50 obj
>/Parent 2 0 R/P 4 0 R>>
endobj
60 obj
>
流动
/设备GB CS 0 0 SC 1 w 0.50.5 m 19.50.5 l 19.5 19.5 l 0.5 19.5 l h S
尾流
endobj
70 obj
>
流动
/设备GB cs 0 0 0 sc 0 0 m 20 0 l 20 l 0 20 l h f
尾流
endobj
80 obj
>
endobj
你可以下载一个


使用我们的工具,您可以可视化PDF文件结构。

根据您发布的完整文件,我发现了几个问题(可能还有更多问题):

  • 文档目录不包括/AcroForm条目
  • 该页面不包含带有字段小部件链接的/Annots条目
  • 字段定义8和9不完整,它们不包括小部件注释条目。这些条目指定页面上的字段位置
  • 您的字段是一个按钮,它没有不同的外观状态,/N外观应该是对外观流的引用(11、12或13)
  • 字段外观11、12、13无效,缺少/Type、/Subtype、/BBox、/Resources等条目
更新:下面您可以找到单选按钮的最小文件结构

1 0 obj
<< /Type /Catalog /Version /1.4 /Pages 8 0 R /AcroForm <</Fields [2 0 R ]>> >>
endobj
2 0 obj
<< /FT /Btn /T (Radio) /V /Off /Kids [5 0 R 3 0 R ] /Ff 32768 >>
endobj
3 0 obj
<< /Type /Annot /F 4 /Rect [250  667  270  687  ] /Subtype /Widget /AS /Off /AP << /N << /Two 7 0 R /Off 6 0 R >> >> /Parent 2 0 R /P 4 0 R >>
endobj
4 0 obj
<< /Type /Page /Contents null /MediaBox [0  0  612  792  ] /Parent 8 0 R /Annots [5 0 R 3 0 R ] >>
endobj
5 0 obj
<< /Type /Annot /F 4 /Rect [150  667  170  687  ] /Subtype /Widget /AS /Off /AP << /N << /One 7 0 R /Off 6 0 R >> >> /Parent 2 0 R /P 4 0 R >>
endobj
6 0 obj
<< /Type /XObject /Subtype /Form /BBox [0  0  20  20  ] /Length 74 >>
stream
/DeviceRGB CS 0 0 0 SC 1 w 0.5 0.5 m 19.5 0.5 l 19.5 19.5 l 0.5 19.5 l h S
endstream
endobj
7 0 obj
<< /Type /XObject /Subtype /Form /BBox [0  0  20  20  ] /Length 55 >>
stream
/DeviceRGB cs 0 0 0 sc 0 0 m 20 0 l 20 20 l 0 20 l h f
endstream
endobj
8 0 obj
<< /Type /Pages /Count 1 /Kids [4 0 R ] >>
endobj 
10对象
>
endobj
20 obj
>
endobj
30 obj
>/Parent 2 0 R/P 4 0 R>>
endobj
40 obj
>
endobj
50 obj
>/Parent 2 0 R/P 4 0 R>>
endobj
60 obj
>
流动
/设备GB CS 0 0 SC 1 w 0.50.5 m 19.50.5 l 19.5 19.5 l 0.5 19.5 l h S
尾流
endobj
70 obj
>
流动
/设备GB cs 0 0 0 sc 0 0 m 20 0 l 20 l 0 20 l h f
尾流
endobj
80 obj
>
endobj
你可以下载一个



使用我们的工具,您可以可视化PDF文件结构。

请共享整个PDF进行分析。您的内容没有隐藏在页面底部,是吗?(0,0是左下角)@lecstor不应该是,因为文本是从光标位置向上向右写入的。不管怎样,在我写的任何一页上都没有按钮。酷,是的,我只是想检查一下。有些肯定会出现在页面上,只是不在前8位)@mkl在最后添加了它。不合理的长,因此删除了额外的换行符。重新计算字节数,以确保它们对于外部参照表仍然准确。请共享整个PDF进行分析。您的内容没有隐藏在页面底部,是吗?(0,0是左下角)@lecstor不应该是,因为文本是从光标位置向上向右写入的。不管怎样,在我写的任何一页上都没有按钮。酷,是的,我只是想检查一下。有些肯定会出现在页面上,只是不在前8位)@mkl在最后添加了它。不合理的长,因此删除了额外的换行符。重新计算字节计数,以确保它们对于外部参照表仍然准确。这不是示例中的对象9、10和11吗?抱歉,我指的是对象8、9和10。XObject有一些我在代码中没有看到的必需属性。亚型和BBox是两种。类型是可选的,但实际上我发现它是必需的。请参阅本规范第8.10.2节。如果您能够在Adobe Reader或Acrobat之类的东西中看到此PDF,那只是因为它在您看到之前已经被修复了。我的PDF解析工具根本无法读取它。你可以尝试用iText RUPS打开你的文件,看看它是否真的有效。我在目录中也没有看到AcroForm字典,你的字段在那里,但没有挂在正确的对象上。这不是我的对象9、10和11在示例中的位置吗?对不起,对象8、9,XObject有一些我在代码中没有看到的必需属性。子对象