我有一个包含5个文本字段的表单。首先,我在工作区填写表单并将其分配给工作流中的其他人。我的要求是我分配表单的人不应该只能编辑三个特定字段的表单数据。我怎样才能实现同样的目标? 我想锁定那些特定的字段,它不应该是可编辑的。
答案 0 :(得分:1)
我做了这个方便的交易:解析你的xfa form
xml
:
private string MakeReadOnly(string xml)
{
string formName = GetFormName(xml);
return @"
ProcessAllFields(xfa.form." + formName + @");
function ProcessAllFields(oNode) {
if (oNode.className == 'exclGroup' || oNode.className == 'subform' || oNode.className == 'subformSet' || oNode.className == 'area') {
for (var i = 0; i < oNode.nodes.length; i++) {
var oChildNode = oNode.nodes.item(i); ProcessAllFields(oChildNode);
}
} else if (oNode.className == 'field') {
oNode.access = 'readOnly'
}
}";
}
private string GetFormName(string xml)
{
string formName = string.Empty;
int subFormStart = xml.IndexOf("<subform", 0);
if (subFormStart > -1)
{
int nameTagStart = xml.IndexOf("name", subFormStart);
int nameStart = xml.IndexOf("\"", nameTagStart);
int nameEnd = xml.IndexOf("\"", nameStart + 1);
formName = xml.Substring(nameStart + 1, (nameEnd - nameStart) - 1);
}
return formName;
}
然后这样称呼:
PdfAction readOnlyAction = PdfAction
.JavaScript(MakeReadOnly(xfa.DomDocument.InnerXml), stamper.Writer);
stamper.Writer.AddJavaScript(readOnlyAction);
在之前调用它:
stamper.Writer.CloseStream = false;
stamper.Close();
reader.Close();
你去吧。只读XFA字段!
答案 1 :(得分:0)
基于XFA的表单中的每个字段都有一个可以在任何事件上设置的访问属性。 access属性可以设置为以下项之一:
"open|protected|readOnly|nonInteractive"
例如,要设置子表单“AddressSubform”中包含的名为“City”的TextField,可以通过以下方式设置访问属性,使其不可编辑:
AddressSubform.City.access = "readOnly";
如果表单处于特定的表单状态,则需要在单击按钮,字段退出或表单初始化等事件上触发此JavaScript代码段。
在您提到的用例中,您需要跟踪填写表单的人员。通常(最佳实践),通过在LiveCycle表单中设置表单状态变量来跟踪它。因此,当您在工作区中完成表单时,您需要确保将表单状态设置为另一个值。一旦其他用户收到表单,您就可以在表单的initialize事件中检查新的表单状态,并按照代码段中的说明设置这些字段。
答案 2 :(得分:0)
您可以在数据中设置一个标记,以指示是否需要锁定字段。您需要在表单呈现发生之前设置标志。您可以使用setValue
服务。然后,您只需通过检查数据中的标志,将initialize
脚本添加到您想要读取的字段中。
var flag = xfa.resolveNode("xfa.datasets.data.Root.config.flag").value;
if(flag == "lock"){
this.access = "readOnly";
} else {
this.access = "";
}
请注意,上面的代码假设您的数据XML结构如下。
<Root>
<config>
<flag>lock</flag>
</config>
<restOfData>
...
</restOfData>
</Root>