5つのテキストフィールドがあるフォームがあります。まず、ワークスペースでフォームに入力し、ワークフロー内の他の人に割り当てます。私の要件は、フォームを割り当てた人がフォームデータを編集できないようにすることです。たとえば、特定のフィールドは3つだけです。どうすれば同じことを達成できますか?それらの特定のフィールドをロックしたいのですが、編集できないようにする必要があります。
3 に答える
私はこの便利な取引をしました: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 フィールド!
データにフラグを設定して、フィールドをロックする必要があるかどうかを示すことができます。フォームのレンダリングを行う前に、フラグを設定する必要があります。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>
XFA ベースのフォームの各フィールドには、任意のイベントで設定できるアクセス プロパティがあります。アクセス プロパティは、次のいずれかの項目に設定できます。
"open|protected|readOnly|nonInteractive"
たとえば、サブフォーム「AddressSubform」に含まれる「City」という TextField を設定するには、アクセス プロパティを次のように設定して編集不可にします。
AddressSubform.City.access = "readOnly";
この JavaScript コード スニペットは、ボタンのクリック、フィールドの終了、またはフォームが特定のフォーム状態にある場合はフォームの初期化などのイベントでトリガーする必要があります。
あなたが言及したユースケースでは、誰がフォームに記入しているかを追跡する必要があります。一般に(ベスト プラクティス)、これは LiveCycle フォームでフォーム状態変数を設定することによって追跡されます。したがって、ワークスペースでフォームの操作が完了したら、フォームの状態が別の値に設定されていることを確認する必要があります。他のユーザーがフォームを受信したら、フォームの初期化イベントで新しいフォーム状態を確認し、コード スニペットに示されているようにこれらのフィールドを設定できます。