1

I have a form with some 5 text fields. Firstly I am filling out the form in workspace and assigning it to some other person in the workflow. My requirement is that person to whom i have assigned the form should not be able to edit the form data say ONLY three particular fields. How can i achieve the same? I want to lock those particular fields and it should not be editable.

4

3 回答 3

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 字段!

于 2013-10-26T06:18:14.337 回答
0

基于 XFA 的表单中的每个字段都有一个可以在任何事件上设置的访问属性。访问属性可以设置为以下项目之一:

"open|protected|readOnly|nonInteractive"

例如,要设置子表单“AddressSubform”中包含的名为“City”的TextField,您可以通过以下方式设置访问属性以使其不可编辑:

AddressSubform.City.access = "readOnly";

如果表单处于特定表单状态,则需要在单击按钮、退出字段或表单初始化等事件上触发此 JavaScript 代码片段。

在您提到的用例中,您需要跟踪谁在填写表格。通常(最佳实践),这是通过在 LiveCycle 表单中设置表单状态变量来跟踪的。因此,当您完成工作区中的表单时,您需要确保将表单状态设置为另一个值。一旦其他用户收到表单,您可以在表单的初始化事件中检查新的表单状态,并按照代码片段中的指示设置这些字段。

于 2013-01-15T23:27:02.883 回答
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>
于 2013-01-23T14:17:36.060 回答