【问题标题】:Manually creating interactive PDFs手动创建交互式 PDF
【发布时间】:2017-03-29 19:17:35
【问题描述】:

由于解释繁琐的原因,我需要在不使用任何第三方库的情况下从 C# 应用程序创建简单的 PDF。有问题的 PDF 需要包含文本和线条图,如果可能,还应包含图像、单选按钮和文本字段。我一直在阅读 Adob​​e 的 documentation,其中大部分内容很简单,但到目前为止还无法弄清楚如何让交互式字段真正出现在文档上。

例如,考虑下面描述的部分测试 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

...

其中5 0 R 引用包含字体/F112 0 R13 0 R 的资源字典引用类似于11 0 R 的流,其中字符串分别替换为Field BOff

我需要对文档进行哪些更改才能使如此定义的字段真正出现在页面上?

编辑:由于 mkl 询问,这里是整个 pdf(删除额外的换行符以节省空间)

%PDF-1.7
%¥±ë

1 0 obj << /Type /Catalog /Pages 2 0 R >> endobj
2 0 obj << /Type /Pages /Kids [3 0 R] /Count 1 /MediaBox [0 0 200 200] >> endobj
3 0 obj << /Type /Page /Parent 2 0 R /Resources 5 0 R /Contents 4 0 R >> endobj

4 0 obj << /Length 39 >>
stream
BT /F1 12 Tf 0 0 Td (Hello World) Tj ET
endstream
endobj

5 0 obj << /Font << /F1 << /Type /Font /Subtype /Type1 /BaseFont /Helvetica >> >> >> 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 7 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

12 0 obj << /Length 39 >>
stream
BT /F1 12 Tf 0 0 Td (Field B) Tj ET
endstream
endobj

13 0 obj << /Length 39 >>
stream
BT /F1 12 Tf 0 0 Td (Off... ) Tj ET 94
endstream
endobj

xref
0 14
0000000000 65535 f 
0000000018 00000 n 
0000000068 00000 n 
0000000150 00000 n 
0000000233 00000 n 
0000000327 00000 n
0000000420 00000 n
0000000470 00000 n
0000000533 00000 n
0000000592 00000 n
0000000651 00000 n
0000000727 00000 n
0000000821 00000 n
0000000917 00000 n
trailer << /Root 1 0 R /Size 5 >>
startxref
1013
%%EOF

【问题讨论】:

  • 请分享整个PDF进行分析。
  • 您的内容没有隐藏在页面底部是吗? (0, 0 是左下角)
  • @lecstor 不应该,因为文本是从光标位置向上和向右写的。无论哪种方式,我所写的内容都不是放置在页面上的按钮。
  • 酷,是的,我只是想检查一下。有些肯定会在页面上,只是不在前 8)
  • @mkl 最后添加。长得不合理,因此删除了额外的换行符。重新计算字节数以确保它们对于外部参照表仍然准确。

标签: pdf pdf-generation


【解决方案1】:

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

  • 文档目录不包含 /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 

您可以下载minimum radio button samplemore detailed radio button sample

使用我们的XFINIUM.PDF Inspector,您可以可视化 PDF 文件结构。

【讨论】:

  • “您的字段是一个按钮,它没有不同的外观状态,/N 外观应该是对外观流的引用” - 或者... Ff 值以使该字段成为 CheckBox 或 RadioButton。但即便如此,三个状态也有点太多了。
  • 好的,我的文件基于 PDF 第 441 页上的示例。虽然我自己犯了一些错误(将 Ff 上的位数误读为 0 索引而不是 1 索引),但显然该示例非常不完整,并且仅采用您建议的更改并不能解决它。是否有一个实际的、可以工作的单选按钮的例子,你可以建议看看吗?
  • @P... 有很多 PDF,其中许多带有表单,特别是单选按钮...
  • @mkl 如果你还不知道去哪里找的话,祝你好运。在搜索词中添加“手动”只会添加有关 Acrobat 的“手动”工具的结果。
  • 非常感谢您提供的示例和资源!我想不出对这个问题更有帮助的答案。
【解决方案2】:

您的字段将需要包含所谓的“外观”,即 XObject,其中包含用于创建字段视觉外观的绘图指令。请参阅 PDF 规范的第 12.5.5 节。或者,您可以将文档目录中 AcroForm 条目的 NeedAppearances 属性设置为 true。请参阅 PDF 规范的第 12.7.2 节。将此设置为 true 将导致符合标准的查看器根据其属性创建字段的外观。但是,您不能指望大多数观众这样做。

【讨论】:

  • 示例中我的对象 9、10 和 11 不是这样吗?
  • 对不起,对象 8、9 和 10 是我的意思。
  • XObjects 有一些我在您的代码中没有看到的必需属性。 Subtype 和 BBox 是两个。类型是可选的,但实际上我发现它是必需的。请参阅规范的第 8.10.2 节。如果您能够在 Adob​​e Reader 或 Acrobat 之类的工具中看到此 PDF,那只是因为在您看到它之前它已被修复。我的 PDF 解析工具根本看不懂。你紧紧尝试在 iText RUPS 中打开你的文件,看看它是否真的有效。
  • 我也没有在目录中看到 AcroForm 字典,您的字段在那里,但没有挂在正确的对象上。
猜你喜欢
  • 2010-09-29
  • 2014-05-14
  • 1970-01-01
  • 1970-01-01
  • 2014-01-08
  • 2013-01-11
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
相关资源
最近更新 更多