在执行发布脚本的OpenScript
方法时,我想将索引字段,批处理字段和变量存储到列表中。我为此创建了一个代码段
Dictionary<string, string> indexFields = new Dictionary<string, string>();
Dictionary<string, string> batchFields = new Dictionary<string, string>();
Dictionary<string, string> kofaxValues = new Dictionary<string, string>();
foreach (Value val in documentData.Values)
{
if (val.TableName.IsEmpty())
{
string sourceName = val.SourceName;
string sourceValue = val.Value;
switch (val.SourceType)
{
case KfxLinkSourceType.KFX_REL_INDEXFIELD:
indexFields.Add(sourceName, sourceValue);
break;
case KfxLinkSourceType.KFX_REL_VARIABLE:
kofaxValues.Add(sourceName, sourceValue);
break;
case KfxLinkSourceType.KFX_REL_BATCHFIELD:
batchFields.Add(sourceName, sourceValue);
break;
}
}
}
我想这样做,因为我需要字段值。每个字段名称都是唯一的,因此我可以将其用作键。
将自定义属性存储到ReleaseSetupData
时,我可以从ReleaseData
中读取它们。假设有两个自定义属性会返回字段名称和字段类型,所以我知道该字段是IndexField
,名称是“ MyIndexField”。
我可以使用这些信息来访问Dictionary<string, string> indexFields
并从Indexfield
获取值。
目前,我使用此代码设置了ReleaseSetupData
releaseSetupData.CustomProperties.RemoveAll();
// Save all custom properties here
releaseSetupData.CustomProperties.Add("myCustomProperty", "fooBar");
releaseSetupData.Links.RemoveAll();
foreach (IndexField indexField in releaseSetupData.IndexFields) // Save all IndexFields
{
releaseSetupData.Links.Add(indexField.Name, KfxLinkSourceType.KFX_REL_INDEXFIELD, indexField.Name);
}
foreach (BatchField batchField in releaseSetupData.BatchFields) // Save all BatchFields
{
releaseSetupData.Links.Add(batchField.Name, KfxLinkSourceType.KFX_REL_BATCHFIELD, batchField.Name);
}
foreach (dynamic batchVariable in releaseSetupData.BatchVariableNames) // Save all Variables
{
releaseSetupData.Links.Add(batchVariable, KfxLinkSourceType.KFX_REL_VARIABLE, batchVariable);
}
当我的发布脚本的OpenScript
方法被执行时,字典(如第一个代码片段所示)保持为空。这是因为documentData.Values
为空。
如何填写documentData.Values
?
答案 0 :(得分:3)
不能。事件的顺序如下:
OpenScript()
被调用-每批一次。ReleaseDoc()
被调用-每个文档一次CloseScript()
被调用-每批一次。“值”集合保存特定于单个文档的信息,因此在OpenScript()
期间将为空。有时这不是您想要的-您可能想访问另一个文档的值,或一次导出所有这些值-例如在一个Web服务调用中。
这是我推荐的:
为Kofax的Document
对象创建包装器类。这是我的方法(仅显示属性)。此类具有一个接受ReleaseData
对象作为单个参数的构造函数,并且所有相应的属性都填充在该构造函数中。
public class Document
{
public Dictionary<string, string> BatchFields { get; private set; }
public Dictionary<string, string> IndexFields { get; private set; }
public Dictionary<string,string> KofaxValues { get; set; }
public Dictionary<string, string> TextConstants { get; set; }
public Dictionary<string, string> CustomProperties { get; private set; }
public Dictionary<string,string> ConfigurationSettings { get; set; }
public List<Table> Tables { get; private set; }
private List<Column> Columns;
public List<string> ImageFileNames { get; private set; }
public string KofaxPDFFileName { get; private set; }
public string XdcFilePath { get; private set; }
public XDocument XDocument { get; private set; }
public string ImageFilePath { get; private set; }
public string KofaxPDFPath { get; private set; }
public string TextFilePath { get; private set; }
public byte[] BinaryImage { get; private set; }
public char CellSeparator { get; set; }
}
然后,在ReleaseDoc()
期间,我将所有Documents
添加到集合中。请注意,连接documents
在您的ReleaseScript
中定义为私有:
public KfxReturnValue ReleaseDoc()
{
documents.Add(new Document(DocumentData));
}
然后您可以决定何时以及在何处导出数据。也可能在CloseScript()事件期间,但是请记住,必须在ReleaseDoc()
期间抛出健全性检查和与文档数据相关的潜在异常(无效的索引字段值等)。使用自定义包装器类和集合可为您的导出连接器(如LINQ)增加.NET固有的很多灵活性和功能-这是一个示例(对于Kofax的COM对象是不可能的):
var noPdfs = documents.Where(x => x.KofaxPDFPath.Length == 0);