- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试将 AcroFields
转换为特定类型,以便我可以为其设置属性。
当我调用 AcroFields.GetField(string name);
时,我得到的只是一个字符串。
当我调用 AcroFields.GetFieldItem(string name);
时,我得到了一个对象,但无法将其转换为特定类型。
我也试过:
AcroFields.SetFieldProperty("myfield", "CheckType", RadioCheckField.TYPE_STAR, null);
每次都返回 false。
为了更好地解释我的场景:
我有一个现有的 PDF(我没有生成这个文件)。
其中有一个复选框。我想像这样更改“CheckType”:myRadioCheckField.CheckType = RadioCheckField.TYPE_STAR
但由于我无法将 AcroField 转换为特定类型,因此我无法访问该属性“CheckType”。
有什么办法可以实现吗?
如果可能,请提供工作示例。
谢谢。
最佳答案
您的帖子包含两个不同的问题。一个问题很容易回答。另一个问题无法回答。
让我们从一个简单的问题开始:
如何从 AcroFields 获取特定类型?比如 PushButtonField、RadioCheckField 等
这在 FormInformation 中有解释示例,它是 chapter 6 of my book 的一部分:
PdfReader reader = new PdfReader(datasheet);
// Get the fields from the reader (read-only!!!)
AcroFields form = reader.AcroFields;
// Loop over the fields and get info about them
StringBuilder sb = new StringBuilder();
foreach (string key in form.Fields.Keys) {
sb.Append(key);
sb.Append(": ");
switch (form.GetFieldType(key)) {
case AcroFields.FIELD_TYPE_CHECKBOX:
sb.Append("Checkbox");
break;
case AcroFields.FIELD_TYPE_COMBO:
sb.Append("Combobox");
break;
case AcroFields.FIELD_TYPE_LIST:
sb.Append("List");
break;
case AcroFields.FIELD_TYPE_NONE:
sb.Append("None");
break;
case AcroFields.FIELD_TYPE_PUSHBUTTON:
sb.Append("Pushbutton");
break;
case AcroFields.FIELD_TYPE_RADIOBUTTON:
sb.Append("Radiobutton");
break;
case AcroFields.FIELD_TYPE_SIGNATURE:
sb.Append("Signature");
break;
case AcroFields.FIELD_TYPE_TEXT:
sb.Append("Text");
break;
default:
sb.Append("?");
break;
}
sb.Append(Environment.NewLine);
}
// Get possible values for field "CP_1"
sb.Append("Possible values for CP_1:");
sb.Append(Environment.NewLine);
string[] states = form.GetAppearanceStates("CP_1");
for (int i = 0; i < states.Length; i++) {
sb.Append(" - ");
sb.Append(states[i]);
sb.Append(Environment.NewLine);
}
// Get possible values for field "category"
sb.Append("Possible values for category:");
sb.Append(Environment.NewLine);
states = form.GetAppearanceStates("category");
for (int i = 0; i < states.Length - 1; i++) {
sb.Append(states[i]);
sb.Append(", ");
}
sb.Append(states[states.Length - 1]);
此代码片段将字段类型存储在 StringBuilder
中,以及单选字段和复选框的可能值。
如果你在 datasheet.pdf 上执行它, 你得到 form_info.txt结果。
到目前为止一切顺利,但问题来了:
如何找到支票类型?我该如何更改它?
这个问题揭示了对 PDF 缺乏理解。当我们在前面的答案中查找复选框(或单选按钮)的可能值时,我们要求提供不同的外观状态。这些外观状态是用 PDF 语法表达的小块内容。
例如:看看 buttons.pdf形式。
当我们从外面看时,我们会看到:
“英语”旁边的复选框可以是空方 block ,也可以是带粉红色背景和十字的方 block 。现在让我们看看里面:
我们看到这是表格复选框,我们看到有两种外观状态:/Yes
和/Off
。在流中描述了这些状态在被选中时的样子。
/Off
状态的流很简单:
您会立即看到我们正在构造一个矩形 (re
) 并在不填充的情况下绘制它 (S
)。
/Yes
状态稍微复杂一些:
我们看到填充颜色正在更改 (rg
),我们用黑色描边矩形并使用定义的填充颜色 (B
) 填充它).然后我们用 moveTo (m
) 和 lineTo (l
) 操作定义两行,然后我们对它们进行描边 (S
)。
如果您精通 PDF 语法,很容易看出我们在彩色矩形内画了一个十字。这样就可以在您精通PDF的情况下回答您的问题...
如果要替换外观,那么就必须替换绘制矩形和十字的流。这并非不可能,但与您发布的问题不同。
总结:PDF 引用 (ISO-32000-1) 和任何 PDF 中都没有 TYPE_STAR
这样的东西。如果您有现有的 PDF,则不能将复选框或单选按钮转换到 RadioCheckField
。您可以尝试重建 RadioCheckField
对象,但是如果您想知道复选框是否使用复选标记、星号...可视化,那么您必须解释 PDF 语法。如果您不想这样做,则无法创建用于创建 PDF 的“原始”RadioCheckField
对象,因为 PDF 中缺少现成的信息。
关于c# - iTextSharp。如何从 AcroFields 获取特定类型?像 PushButtonField、RadioCheckField 等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33243667/
我有一个已填写字段的 PDF 表单。如果我尝试阅读 acrofields,它们是空的。但在 PDF 中,我可以更改值并保存它们。 private static string GetFormFieldN
使用 itextsharp ,我正在尝试将表单文本字段的字体大小设置为 auto . 我目前正在做这样的事情: Object d = 0.0; PdfReader reader = new PdfRe
我正在使用 java 中的压模创建 acrofields(如下所示),我想找到一种方法来知道 acrofields 的长度。我希望能够确定要在 acrofield 中输入的字符串的长度,如果它太长,那
我有一个将目录插入现有 Acroform 的过程,并且我能够跟踪我需要从哪里开始该内容。但是,我现有的 Acrofields 低于该点,需要根据我插入的表格的高度向上或向下移动。有了那个,我怎样才能改
我需要使用 iTextSharp 将一些格式化文本添加到 PDF 表单域,但我似乎无法弄清楚。这就是我目前设置字段的方式,但插入文本的某些部分需要加粗或采用其他格式。 stamper.AcroFiel
我正在使用 iTextSharp 从 PDF 中提取签名名称。我在访问大尺寸和多页 PDF(~40MB 和~5000 页)的 AcroFiels 时遇到问题(速度过慢)。 这是我的代码片段: usin
AcroField 中有没有计算文本高度的技巧? 换句话说,我有一个带有正文部分的模板 PDF,我想将长文本粘贴到其中,并且我想获取文本的高度。如果溢出,则为其余文本插入一个新页面。 最佳答案 这将给
我正在使用 iTextSharp 将数据填充到在 OpenOffice 中创建的 PDF 模板。它填充良好,我得到了正确的 PDF,但有些地方我想增加 AcroField 的宽度。 我做了下面的代码。
我正在使用 iTextSharp 将数据填充到在 OpenOffice 中创建的 PDF 模板。它填充良好,我得到了正确的 PDF,但那是即将到来的可编辑模式。我想要不可编辑的 PDF。并且还使一些行
我正在使用 iTextSharp 将数据填充到在 OpenOffice 中创建的 PDF 模板。它填充得很好,我得到了正确的 PDF。在那个 PDF 中,有些地方会出现摘要,我希望那个地方的文本与模板
我正在用 Java 编写一个程序,用于打印宾果卡的 PDF 文件。每页是一张卡片。为了方便我,我创建了一个带有 acrofields 的模板 PDF 文件,这样程序只需要创建该模板的副本,用数字填充
我正在尝试使用 acrofields 填充 PDF,我能够完美地添加字符串数据,但在将图像添加到 acrofields 时遇到问题。这是我添加字符串数据的代码.. File f = new F
我目前有一个 PdfReader 和一个 PdfStamper,我正在用它们填写 acrofields。我现在必须将另一个 pdf 复制到我一直在填写的表格的末尾,当我这样做时,我在复制的新表格上丢失
“iText In Action”中有一些技巧,涵盖了设置字体以及“FontFactory.RegisterDirectories”方法(正如书中所说...这是一个昂贵的调用)。但是,就我而言,我想用
我目前正在开发一种用于在 pdf 文档上应用和验证数字签名的工具。我了解 pdf 文档中的每个签名都适用于 AcroFields 的某个版本。每次用户更改某些输入(即通过填写 pdf 表单)时,都会创
将内容填充到模板中,很好,但我想要 AcroField 的下划线。 我正在使用下面的代码。 ClassCastException 即将到来。 Font font = FontFactory.getFo
我正在处理的项目有一个 PDF 文件,用作生成另一个最终 PDF 的模板。 该模板有几个表单字段。为了呈现最终文档,我使用 iText 打开模板,找到所有表单字段并填写所需的数据。 现在有一个要求,要
我正在使用 itext sharp 用值填充模板上的表单字段。 我使用 pdfescape.com 创建了模板 这是我用来将值放入 pdf 模板的代码。 private static byte[]
我有一个带有 acroform 字段的 pdf,现在我需要找到相应的 PDField 对象。为此,我正在使用这段代码 public PDField getPDFieldWithName(final S
我正在编写一个需要读取 XFA 和 AcroField 模板的 C# 应用程序。由于公司的规模和可能与应用程序相关的现有 PDF 文档的数量,选择一个并使用它是不可能的。 我目前正在使用 iTextS
我是一名优秀的程序员,十分优秀!