我想创建一个自定义模块,通过获取包含索引字段,批处理字段等某些字段值的生成的文件名字符串来重命名生成的PDF文件。
因此,当涉及批处理时,我可以这样做(class MyComponent extends Component {
static propTypes = {
....
};
static defaultProps = {
....
};
}
包含来自自定义存储字符串的已解析值)
setupTransformator
我必须使用 public void ProcessBatch(IBatch batch)
{
IACDataElement batchElement = GetBatchElementFromBatch(batch);
IACDataElementCollection currentDocuments = GetDocumentsFromBatchElement(batchElement);
IACDataElement customStorageStrings = GetCustomStorageStringsFromBatch(batch);
IACDataElementCollection batchFields = GetElementsByName(batchElement, ResourcesKofax.BATCH_FIELDS, ResourcesKofax.BATCH_FIELD);
setupTransformator = new SetupTransformator(customStorageStrings);
for (int i = 0; i < currentDocuments.Count; i++)
{
int currentDocumentIndex = i + 1;
IACDataElement currentDocument = currentDocuments[currentDocumentIndex];
IACDataElementCollection indexFields = GetElementsByName(currentDocument, ResourcesKofax.INDEX_FIELDS, ResourcesKofax.INDEX_FIELD);
string targetFilename = setupTransformator.GetFilename(batchElement, currentDocument, batchFields, indexFields);
string documentFilePath = currentDocument[ResourcesKofax.PDF_GENERATION_FILE_NAME];
// rename the PDF file
}
batch.BatchClose(KfxDbState.KfxDbBatchReady, KfxDbQueue.KfxDbQueueNext, 0, string.Empty);
}
private IACDataElement GetBatchElementFromBatch(IBatch batch)
{
IACDataElement rootElement = batch.ExtractRuntimeACDataElement(0);
return rootElement.FindChildElementByName(ResourcesKofax.BATCH);
}
private IACDataElementCollection GetDocumentsFromBatchElement(IACDataElement batchElement)
{
return GetElementsByName(batchElement, ResourcesKofax.DOCUMENTS, ResourcesKofax.DOCUMENT);
}
private IACDataElement GetCustomStorageStringsFromBatch(IBatch batch)
{
IACDataElement setupElement = batch.ExtractSetupACDataElement(0);
IACDataElementCollection batchClasses = GetElementsByName(setupElement, ResourcesKofax.BATCH_CLASSES, ResourcesKofax.BATCH_CLASS);
IACDataElement batchClass = batchClasses[1];
return batchClass.FindChildElementByName(ResourcesKofax.BATCH_CLASS_CUSTOM_STORAGE_STRINGS);
}
private IACDataElementCollection GetElementsByName(IACDataElement dataElement, string rootName, string targetName)
{
return dataElement.FindChildElementByName(rootName).FindChildElementsByName(targetName);
}
方法还是Kofax库中有可以使用的方法?
答案 0 :(得分:2)
文件名应仅由导出连接器处理。只要批处理在系统中,就不应更改其名称,因为这可能导致数据丢失和损坏。
这在将字段值用作PDF名称时尤其适用-由于只要批处理在系统中,值都可能发生变化,那么您将如何容纳它?没有什么能阻止您的用户在自定义模块中处理批处理并将该批处理设置回验证并更改一个或多个字段。
谈到导出连接器及其API:
默认情况下,Kofax提供了两种导出PDF的方法-都在ReleaseData
对象上(这来自API文档):
CopyKofaxPDFFile
:将属于文档的PDF文件复制到在导出设置过程中定义的导出PDF路径。CopyKofaxPDFFileToPath
:将属于文档的PDF文件复制到指定路径(该路径是此方法的字符串输入参数)。这两种方法都利用了您在安装过程中可以定义的内容-例如,CopyKofaxPDFFile
使用了KofaxPDFPath
属性。我不确定文件名是否保留属性。
我通常会坚持在运行时暴露KofaxPDFProperty
并执行File.Copy
操作。我不建议移动文件或删除文件,因为一旦成功导出批处理,KC会自动处理该文件(从理论上讲,可能会进行另一次导出,否则导出可能会失败)。
使用ReleaseData
对象访问字段值,并使用字符串插值来定义PDF的最终名称。
答案 1 :(得分:1)
沃尔夫冈·拉德尔斯答案是正确的。由于事实上我必须使用自定义模块来解决项目,因此我的解决方案如下:
必须存在一个称为“文件名”的索引字段。处理当前文档时,我可以使用新文件名填充此索引字段。
private void SetTargetFilename(IACDataElement batchElement, IACDataElement currentDocument, IACDataElementCollection batchFields, IACDataElementCollection indexFields)
{
// Get the file name from the custom storage strings
string targetFilename = setupTransformator.GetFilename(batchElement, currentDocument, batchFields, indexFields);
try
{
foreach (IACDataElement field in indexFields)
{
// ResourcesKofax.FIELD_NAME stands for "Name"
// ResourcesKofax.FIELD_VALUE stands for "Value"
// ResourcesKofax.INDEX_FIELD_FILENAME stands for "Filename"
if (field[ResourcesKofax.FIELD_NAME] == ResourcesCommon.INDEX_FIELD_FILENAME)
{
field[ResourcesKofax.FIELD_VALUE] = targetFilename;
}
}
}
catch (Exception exception)
{
throw exception;
}
}
现在,导出连接器能够从索引字段读取新文件名。