Help documentation is provided in the form of seven HTML files (*.chm) and two PDF files.
General platform-independent information appears in the General Information Help.
The following issues are added to the documentation.
- Resolved limitation: In this release NLS and OpLicMgr are able to work on the same computer
at the same time
The original design of Nuance License Management system assumes that NCLS/NCLT and OpLicMgr utilities are not used on the same computers. To avoid licensing issues in special deployment cases when both the NCLS/NCLT-activated and OpLicMgr-activated licenses are present simultaneously, we introduced the use of NLCL.cfg file in Desktop Runtime distributions (deployments), starting from version 20.3.
To ensure that your desktop runtime deployment works properly even if other CSDK-based applications install NCLS/NCLT, it is recommended to add a special NLCL.cfg file to your deployment. In this case the NLCL.cfg file must contain only a single, 8-character code word: „oplicmgr”
For the possible locations of NLCL.cfg file and further details of its entries refer to the Licensing improvements section
in this Release Notes document.
- DCTool additional information
1. modify & get_def_file commands - project definition file format
A project definition file(‘definition - file’ parameter in case of the ‘modify’ and ‘get_def_file’ commands) is a text file of JSON format describing the actual project properties(classes, documents, stopwords, metawords, etc.).
Actually the following project - data is serialized(using a struct Project instance as a root - object) :
struct POINT {
long x;
long y;
};
struct SIZE {
int cx;
int cy;
};
// see KernelApi.h!
// NOTE: enum values are serialized now using their 'int' representation!
enum LANGUAGES {
// ...
};
// NOTE: enum values are serialized now using their 'int' representation!
enum Ngram_weights {
NGW_NON = -1,
NGW_PROHIBITED,
NGW_NORMAL,
NGW_LEVEL1,
NGW_LEVEL2,
NGW_MANDATORY
};
// NOTE: enum values are serialized now using their 'int' representation!
enum DCProjectType {
DCPT_OPEN = 0,
DCPT_CLOSED
};
struct MetaWord {
string pattern;
string value;
};
typedef string StopWord;
struct Phrase {
string text;
string value;
};
struct ClassPhrase : public Phrase {
Ngram_weights weight;
POINT location; // serialized as location.x, location.y
SIZE size; // serialized as size.cx, size.cy
SIZE drift; // serialized as drift.cx, drift.cy
int groupId = -1;
};
struct Document {
string imagePath;
unsigned page = 0;
bool isHidden = false;
};
typedef vector<ClassPhrase> ClassPhraseVect;
typedef map<LANGUAGES, ClassPhraseVect> ClassPhrasesMap;
struct Class {
string name;
bool isHidden = false;
vector<Document> documents;
ClassPhrasesMap classPhrasesMap;
};
typedef set<LANGUAGES> LangSet;
typedef vector<MetaWord> MetaWordVect;
typedef map<LANGUAGES, MetaWordVect> MetaWordsMap;
typedef vector<StopWord> StopWordVect;
typedef map<LANGUAGES, StopWordVect> StopWordsMap;
struct Project {
string projectPath;
DCProjectType projectType = DCPT_CLOSED;
LangSet langSet;
vector<Class> classes;
MetaWordsMap metaWordsMap;
StopWordsMap stopWordsMap;
};
A simplified project definition file sample :
{
"project": {
"projectPath": "e:\\dc\\test_project\\test.dcproj",
"projectType" : 1,
"langSet" : [ 0 ],
"classes" : [ {
"name": "BusinessCard",
"isHidden" : false,
"documents" : [ {
"imagePath": "e:\\dc\\test_input\\BusinessCard\\02.jpg",
"page" : 0,
"isHidden" : false },{
"imagePath": "e:\\dc\\test_input\\BusinessCard\\10.jpg",
"page" : 0,
"isHidden" : false } ],
"classPhrasesMap": [ {
"key": 0,
"value" : [] } ] },
{
"name": "Receipt",
"isHidden" : false,
"documents" : [ {
"imagePath": "e:\\dc\\test_input\\Receipt\\03.jpg",
"page" : 0,
"isHidden" : false },{
"imagePath": "e:\\dc\\test_input\\Receipt\\08.jpg",
"page" : 0,
"isHidden" : false } ],
"classPhrasesMap": [ {
"key": 0,
"value" : [] } ] }
],
"metaWordsMap": [
{
"key": 0,
"value" : [
{
"pattern": "fax|facsimile",
"value" : "fax"
},
{
"pattern": "tel|telephone|phone|mobil[e]",
"value" : "tel"
} ]
}
],
"stopWordsMap": [
{
"key": 0,
"value" : [
"a",
"about",
"above"
]
}
]
}
}
2. test command - optional CSV output
Using the –csv parameter of the ‘test’ command we can create a CSV(Comma Separated Values) output file containing the test result information similar to the format displayed by the DCAssistant tool.
We can directly open this CSV file using e.g.Excel or other spreadsheet tools.
Excel & Windows – the role of the configured default list separator character
Excel uses the default list separator character to separate columns in the CSV - file.
The default list separator can be configured here :
1. Click the Windows Start menu.
2. Click Control Panel.
3. Open the Regional and Language Options dialog box.
4. Click the Formats Tab.
5. Click Additional settings.
6. Check the actual value or type a new separator in the List separator box.
7. Click OK twice.
The default list - separator used by DCTool is the ‘, ’(comma) character.
If you want to specify an alternative list separator character for DCTool(e.g.matching to the default list separator character configured in the Control Panel), you can use the –csv_separator parameter of the ‘test’ command!
3. test command - optional JSON output
Using the ‘–json <json - output - file>’ option of the ‘test’ command we can create the test - ouput data using JSON format(as an alternative to CSV - format).
Actually the following test - output data is serialized(using a struct TesOutputData instance as a root - object) :
struct StatData {
unsigned count = 0;
float percent = 0.0;
};
struct FileMatchInfo {
string docName;
string targetClass;
string predictedClass;
int confidence;
bool isConfident;
string result;
};
struct ConfusionMatrix {
struct Row {
string className;
vector<unsigned> numOfDocsVect;
};
vector<string> header;
vector<Row> matrix;
};
struct TotalStatistics {
unsigned alienNum = 0;
float falsePosPercentInAliens;
StatData falsePos;
StatData falseNegOrRejected; // open project: false negative; closed project: rejected
StatData misclassified;
StatData totalError;
StatData correct;
};
struct BestConfidenceThresholdInfo {
float falseNegativeOrRejectedWeight;
float falsePositiveWeight;
float misclassifiedWeight;
unsigned bestConfidenceThreshold;
};
struct TestOutputData {
vector<FileMatchInfo> fileMatchInfoVect;
ConfusionMatrix confusionMatrix;
TotalStatistics totalStatistics;
BestConfidenceThresholdInfo bestConfidenceThresholdInfo;
};
A simplified JSON test - output sample :
{
"testOutputData": {
"fileMatchInfoVect": [
{
"docName": "02.jpg#1",
"targetClass" : "BusinessCard",
"predictedClass" : "BusinessCard",
"confidence" : 100,
"isConfident" : true,
"result" : "Correct"
},
{
"docName": "10.jpg#1",
"targetClass" : "BusinessCard",
"predictedClass" : "BusinessCard",
"confidence" : 100,
"isConfident" : true,
"result" : "Correct"
},
{
"docName": "03.jpg#1",
"targetClass" : "Receipt",
"predictedClass" : "Receipt",
"confidence" : 100,
"isConfident" : true,
"result" : "Correct"
},
{
"docName": "08.jpg#1",
"targetClass" : "Receipt",
"predictedClass" : "Receipt",
"confidence" : 100,
"isConfident" : true,
"result" : "Correct"
}
],
"confusionMatrix": {
"header": [
"BusinessCard",
"Receipt",
"<Rejected>"
],
"matrix" : [
{
"className": "BusinessCard",
"numOfDocsVect" : [
2,
0,
0
]
},
{
"className": "Receipt",
"numOfDocsVect" : [
0,
2,
0
]
},
{
"className": "Alien documents",
"numOfDocsVect" : [
0,
0,
0
]
}
]
},
"totalStatistics": {
"alienNum": 0,
"falsePosPercentInAliens" : 0.0,
"falsePos" : {
"count": 0,
"percent" : 0.0
},
"falseNegOrRejected" : {
"count": 0,
"percent" : 0.0
},
"misclassified" : {
"count": 0,
"percent" : 0.0
},
"totalError" : {
"count": 0,
"percent" : 0.0
},
"correct" : {
"count": 4,
"percent" : 100.0
}
},
"bestConfidenceThresholdInfo": {
"falseNegativeOrRejectedWeight": 1.0,
"falsePositiveWeight" : 1.0,
"misclassifiedWeight" : 1.0,
"bestConfidenceThreshold" : 49
}
}
}
- User Guide for Intelligen Workflow Runner (OCRService)
See in the Documentation folder IWRUsersGuide.docx
and the two videos (IWR_Client.wmv, IWR_Designer.wmv) for the details
The typical usage of the OCRService:
- Build the workflow using AssistantApp.exe (or iTest or OmniPage Pro 19).
- Save the workflow into a .xwf file.
- Test its
running capabilities in iTest (or OmniPage Pro 19).
- Convert the xwf file into JobXML using the XWFToXML.exe command line tool.
You
should create workflows without naming input and output files. In this case the workflow displays dialog boxes (custom open and save dialogs) to request the actual file
names.
In the save dialog you can set all output converter specific settings (Converters.Text.<convertername>.<settingname>). Here you can save these settings into a
setting file for the xwf to JobXML conversion. After that, use the XWFToXML converter tool and the setting file to create the JobXML file.
You can place any additional CSDK settings to the setting file.
If /p command line parameters are specified for XWFToXML.exe, the given input and
output files are replaced by macros $INPUT_FILE$, $OUTPUT_FILE$.
- Place these JobXML files somewhere in the application folder structure.
- In the Application
change the runtime input ($INPUT_FILE$), output ($OUTPUT_FILE$) and response XML ($OUTPUT_XML$) file macros to the actual file names.
- Read JobXML into a string and pass it to the Run() function and wait for the Done event
and handle the response XML.
A similar way is to use WorkflowXMLDesigner.exe for creating WorkflowXMLs directly
by saving them into templated WorkflowXML files. Check the IWR_Designer.wmv.
From a C++ program use #import "OCRService.exe" named_guids to access OCRService COM.
Simple .NET C# Application for IWR usage
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
namespace ConsoleApplication1
{
class Program
{
static OCRServiceLib.OCRService OCRService = null;
static System.Threading.Semaphore sem;
static void Main(string[] args)
{
try
{
Console.WriteLine("OCRServiceLib.OCRService()");
OCRService = new OCRServiceLib.OCRService();
// OEM type licensing
//OCRService.SetLicense("License file", "Key");
OCRService.Done += OCRService_Done;
((OCRServiceLib.IOCRServiceEvents_Event)OCRService).Ping += OCRService_HeartBeat;
OCRService.Ping(false);
string WorkflowXml = "";
WorkflowXml = File.ReadAllText(@"C:\Temp\WorkflowXMLFile1.xml");
// Delete the output file, naming in the WorkflowXMLFile1.xml
try { File.Delete(@"C:\Temp\Test1.txt"); } catch (Exception) { };
sem = new System.Threading.Semaphore(0, 1);
OCRService.Run(WorkflowXml, "1"); // Asynchronous call
sem.WaitOne(); // wait for finishing the Job
OCRService.Done -= OCRService_Done;
((OCRServiceLib.IOCRServiceEvents_Event)OCRService).Ping -=
OCRService_HeartBeat;
OCRService = null;
string output = System.IO.File.ReadAllText(@"C:\Temp\Test1.txt");
Console.WriteLine(output);
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
}
static void OCRService_Done(string ID, int StartError, Array StartErrors, Array RuntimeErrors, Array RuntimeErrorDesciptions, Array ResponseXMLFiles)
{
sem.Release(1);
return;
}
static void OCRService_HeartBeat()
{
return;
}
}
}
Simple C++ Application for IWR
// OCRJob.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <atlbase.h>
#include <atlcom.h>
#include <atlstr.h>
#include <msxml2.h>
#pragma comment(lib, "msxml2")
#import "libid:FFD9491E-B353-4BFF-A99E-0ACA62000707" no_namespace named_guids no_smart_pointers raw_interfaces_only
class ATL_NO_VTABLE CServiceWithEvents :
public CComObjectRootEx<CComMultiThreadModel>,
public IOCRServiceEvents
{
public:
CServiceWithEvents() : m_hEvent(NULL), m_hr(S_OK)
{
}
BEGIN_COM_MAP(CServiceWithEvents)
COM_INTERFACE_ENTRY(IOCRServiceEvents)
COM_INTERFACE_ENTRY_AGGREGATE(IID_IMarshal, m_pUnkMarshaler.p)
END_COM_MAP()
DECLARE_GET_CONTROLLING_UNKNOWN()
HRESULT FinalConstruct()
{
return S_OK;
}
void FinalRelease()
{
}
STDMETHOD(Done)(BSTR strGUID, long lResult, SAFEARRAY* psaResults, SAFEARRAY*, SAFEARRAY *, SAFEARRAY *)
{
if (m_strGUID != strGUID)
return S_OK;
if (lResult || psaResults)
m_hr = E_FAIL;
SetEvent(m_hEvent);
return S_OK;
}
STDMETHOD(Ping)(void)
{
return S_OK;
}
HRESULT Run(TCHAR* strFile)
{
GUID guid = GUID_NULL;
HRESULT hr = S_OK;
CComPtr<IXMLDOMDocument2> pXMLDOMDocument;
CComPtr<IOCRService> pOCRSrvice;
VARIANT_BOOL bSuccess = VARIANT_TRUE;
CComBSTR strXML;
DWORD dwCookie = 0;
m_strGUID.Empty();
m_hr = S_OK;
m_hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
if (!m_hEvent)
hr = AtlHresultFromLastError();
if (SUCCEEDED(hr))
{
hr = CoCreateGuid(&guid);
m_strGUID = CComBSTR(guid);
}
if (SUCCEEDED(hr))
hr = CoCreateFreeThreadedMarshaler(GetControllingUnknown(), &m_pUnkMarshaler.p);
if (SUCCEEDED(hr))
hr = pXMLDOMDocument.CoCreateInstance(CLSID_DOMDocument);
if (SUCCEEDED(hr))
hr = pXMLDOMDocument->load(CComVariant(strFile), &bSuccess);
if (SUCCEEDED(hr))
hr = pXMLDOMDocument->get_xml(&strXML);
if (SUCCEEDED(hr))
hr = pOCRSrvice.CoCreateInstance(CLSID_OCRService, NULL, CLSCTX_LOCAL_SERVER);
if (SUCCEEDED(hr))
hr = AtlAdvise(pOCRSrvice, GetControllingUnknown(), IID_IOCRServiceEvents, &dwCookie);
if (SUCCEEDED(hr))
hr = pOCRSrvice->Run(strXML, CComBSTR(guid));
if (SUCCEEDED(hr))
{
AtlWaitWithMessageLoop(m_hEvent);
hr = m_hr;
}
if (dwCookie)
AtlUnadvise(pOCRSrvice, IID_IOCRServiceEvents, dwCookie);
if (m_hEvent)
CloseHandle(m_hEvent);
m_pUnkMarshaler.Release();
return hr;
}
CComPtr<IUnknown> m_pUnkMarshaler;
HANDLE m_hEvent;
HRESULT m_hr;
CComBSTR m_strGUID;
};
int _tmain(int argc, _TCHAR* argv[])
{
if (argc < 2)
return E_FAIL;
HRESULT hr = S_OK;
CoInitialize(NULL);
{
CComObjectStack<ExCServiceWithEvents> service;
hr = service.Run(argv[1]);
}
CoUninitialize();
return hr;
}
- Redistributable Microsoft file sets for deployments
In each case the deployment for your own Capture SDK-enabled application requires you to include one of the redistributable file sets from Microsoft.
The Distribution Wizard in the Capture SDK provides you with hints on which merge modules contain the redistributable file set necessary for your particular deployment. This section tries to simplify your options.
- As the Capture SDK was built with Microsoft VS 2015.2, the Distribution Wizard will advise several merge modules of VS 2015.
Microsoft Visual C++ 2015 Redistributable Package (x86) – VCRedist_x86.exe
xx.x.xxxx.x,
covers all the necessary Microsoft binaries from those merge modules. It can be downloaded from
Microsoft internet sites
- RM_RER engine ICR2.DLL was built with Microsoft VS 2013. RM_RER engine, ICR2.DLL.
If the application uses RER engine, it also has to distribute the latest VC 2013 crt.
Handwritten and Thai language pages are affected.
From version CSDK 20.1 icr2.dll requires VC 2015 crt.
- Nuance Vocalizer 2.2 support for premium quality audio (x86/x64) in CSDK
version 20.2
64-bit processes
on x64 OS or 32-bit processes on x86 OSs:
[HKEY_LOCAL_MACHINE\SOFTWARE\Nuance\Vocalizer Expressive\2.2]
"InstallPath"="... home of the Vocalizer
engine binary (ve.dll) files ..."
32-bit processes on x64 OSs:
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Nuance\Vocalizer Expressive\2.2]
"InstallPath"="... home of the Vocalizer files ..."
This additional registry key may be necessary for enabling MP3 codec on Windows:
64-bit processes
on x64 OS or 32-bit processes on x86 OSs:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Drivers32
“msacm.l3acmp”=”C:\Windows\System32\l3codecp.acm”
32-bit processes on x64 OSs:
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\Drivers32
“msacm.l3acmp”=”C:\Windows\SysWOW64\l3codecp.acm”
The application should set Converters.Text.Audiomp3 output converter type for Vocalizer MP3 output
- Nuance Vocalizer 2.0/2.1 support for premium quality audio (x86/x64) in CSDK
version 20.0, 20.1, 20.2
64-bit processes or 32-bit processes on x86 OSs:
[HKEY_LOCAL_MACHINE\SOFTWARE\Nuance\Vocalizer Expressive\SAPI5]
"Vocalizer Expressive"="... home of the Vocalizer files ..."
32-bit processes on x64 OSs:
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Nuance\Vocalizer Expressive\SAPI5]
"Vocalizer Expressive"="... home of the Vocalizer files ..."
This additional registry key may be necessary for enabling MP3 codec on Windows:
64-bit processes or 32-bit processes on x86 OSs:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Drivers32
“msacm.l3acmp”=”C:\Windows\System32\l3codecp.acm”
32-bit processes on x64 OSs:
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\Drivers32
“msacm.l3acmp”=”C:\Windows\SysWOW64\l3codecp.acm”
The application should set Converters.Text.Audiomp3 output converter type for Vocalizer MP3 output
- Installing Form Template Editor or Document Classifier Assistant with 64bit version of the CSDK
Both Form Template Editor and Document Classifier Assistant are 32bit applications. They require the 32bit version of the CSDK runtime binaries. In this scenario the Installer
installs those binaries into the Engine folder below FTE and DCAssistant home
path.
- User written custom workflows in Workflow Runner
Creating custom job item (C#):
1. Create a new C# project with 'Class Library' template. Set Target framework to '.NET Framework 4.6'.
2. With Configuration Manager, create new solution platform; 'x86' or 'x64' depending on your deployed CSDK.
3. Add Nuance.OmniPageSDK.IproPlus.JobItem.dll and Nuance.OmniPageSDK.IproPlus.dll as reference.
4. Use Nuance.OmniPage.CSDK.IproPlus namespace.
5. Derive your class from JobItem and implement abstract class.
6. You can find an implementation of Ping and GetResult method in CustomJobItemCS sample.
7. Implement Run method as you wish. You can evaluate your job request accessing XElement public property.
You can access IproPlus Engine and Document via public properties, do not dispose them.
Fire a Progress event periodically. If you have a lot of work to do fire NewObject event occasionally.
When your task is finished, fire the Done event.
8. Make your class COM visible via adding attributes ComVisible(true), Guid(""), ClassInterface(ClassInterfaceType.None).
9. Implement a static Register function to change COM threading model to apartment model. You can find a sample in CustomJobItemCS sample.
10.Unload project and edit it to add a platform specific post build event.
<PropertyGroup Condition="'$(Platform)' == 'x86'">
<PostBuildEvent>
call "$(DevEnvDir)..\..\vc\bin\vcvars32.bat"
regasm "$(TargetPath)" /codebase
</PostBuildEvent>
</PropertyGroup>
<PropertyGroup Condition="'$(Platform)' == 'x64'">
<PostBuildEvent>
call "$(DevEnvDir)..\..\vc\bin\amd64\vcvars64.bat"
regasm "$(TargetPath)" /codebase
</PostBuildEvent>
</PropertyGroup>
Do not use 'Register for COM interop' option.
11. Build your project.
Integrating into WorkflowXMLDesigner:
1. Create a new C# 'Class Library' project targeting to '.NET Framework 4.6' or use the project containing your JobItem.
2. Add System.Activities.dll and Nuance.OmniPageSDK.IproPlus.JobDesign.dll as reference.
3. Add a new class, use Nuance.OmniPage.CSDK.IproPlus.JobDesign namespace and derive your class from JobItem.
4. In constructor, set clsid field to '{<YOURGUID>}'.
5. Add necessary public properties to your class, these will be edited in WorkflowXMLDesigner.
6. Override CacheMetadata method to check your properties and add validation error if necessary.
7. Override InputXMLContainer property to compose a proper XML snippet, it will be passed to your custom job item.
8. If you want a custom UI, you can implement an ActivityDesigner class and add Designer attribute to your class.
9. Build your project.
12. In WorkflowXMLDesigner select Options/Custom Job Items... and add your assembly to the collection.
Debugging your custom jobitem designer:
1. Simply set WorkflowXMLDesigner as external program to start debugging.
2. Check composed XML.
Debugging your custom jobitem:
1. In Task Manager terminate all OCRServer.exe instances.
2. Set OCRServer.exe to the external program to start debugging.
3. Start debugging.
4. Launch WorkflowXMLDesigner, create a job using your custom job item, and run the job.
- Sample WorkflowXML
This Workflow XML has been created by WorkflowXMLDesigner. Comments were added later.
<? xml version="1.0" encoding="utf-8"?>
<OCRJob>
<JobItem clsid = "{14ABDDC9-0DF7-4D1C-9687-0AE5F2AD1C3D}" id="{fc02eeb3-c985-4bff-965f-6f1464872599}"> <!-- Workflow Job Type, load recognize, export -->
<Type type = "integer" value="IWFT_WFS_DIRECT|CWFF_LOADIMG| CWFF_RECOGNIZE| CWFF_EXPORTDOC" />
<Inputs type = "array" >
<Input type="string" value="$inputfile1$" />
</Inputs>
<Parameters>
<Parameter parametername = "SP_LDI_DESKEW" type="boolean" value="false" />
<Parameter parametername = "SP_LDI_PAGEROTATION" type="integer" value="ROT_NO" />
<Parameter parametername = "SP_RCI_PROFDICT" type="array">
<Parameter type = "string" value="English Medical Dictionary" />
<Parameter type = "string" value="English Financial Dictionary" />
<Parameter type = "string" value="English Legal Dictionary" />
</Parameter>
</Parameters>
<Settings> <!-- Any CSDK Setting could go here -->
<Setting settingname = "Kernel.OcrMgr.DefaultRecognitionModule" type="integer" value="RM_OMNIFONT_PLUS3W" />
</Settings>
<Output type = "string" value="$outputfile1$" />
<Converter value = "Converters.Text.PDFImageOnText" >
<Properties >
<!-- Any CSDK Converter Setting could go here -->
<Property propertyname = "ColorQuality" type="integer" value="R2ID_PDFCOLORQUALITY_LOSLESS" />
<Property propertyname = "Compatibility" type="integer" value="R2ID_PDF17" />
<Property propertyname = "Linearized" type="boolean" value="true" />
<Property propertyname = "UseMRC" type="integer" value="R2ID_PDFMRC_LOSLESS" />
<Property propertyname = "Compression.UseJBIG2" type="integer" value="true" />
<Property propertyname = "Compression.UseJPEG2000" type="integer" value="true" />
</Properties>
</Converter>
</JobItem>
<JobItem clsid = "{69490304-CC87-476C-90C3-58B200F6303F}" <!-- Statistics Job Type, depending from Workflow Job Type -->
id="{66b6e5e1-8fa8-46e0-91f9-6232dedbfa3c}" dependency="{fc02eeb3-c985-4bff-965f-6f1464872599}">
<OutputXML type = "string" value="$xmlfile1$" />
</JobItem>
</OCRJob>
- How to setup CSDK scanning sub-system in the redistribution
There are 3 new functions in RSD to be called by the install/uninstall process
as delayed custom actions: RsdInstallMsi(), RsdRepairMsi() and
RsdUninstallMsi().
All these functions are located in RnRSDu.dll. These functions have to
be called from the installed instance of RnRSDu.dll in the folder where
it is installed and NOT from the temporary one in the temp folder,
otherwise other RSD modules will not be found by RnRSDU.dll.
These functions replace all activities of the installer/uninstaller in regard to
all registry entries and files mentioned below. The installer should simply
install all files mentioned below in the same folder where the binaries of RSD
are installed. All other activities including maintenance of reference counts
are the task of these functions. All files belonging to RSD (including the files
mentioned below) should be installed in the same folder, but other files of the
product might be installed in other folders including the 'main app'. E.g. in
case of PPDF the binaries of RSD are located in the install folder, while
the main app is installed in the install\bin folder, therefore delayed
custom actions should be called from RnRSDu.dll in the install
folder and <full path of main app> should point to the main application
in the install\bin folder.
1.
int WINAPI RsdInstallMsi( MSIHANDLE hMsi )
a.
It can be called after all binaries of RSD are
installed to the destination folder. This function performs all necessary
actions for RSD which can only be done in Admin Mode at install time.
b.
The CustomActionData should be composed as
follows:
<product name>;<full path of main app>;<path of scanner.ini>;<registry
key>;<language>
Where:
- <product name> is the name of the product as the Wizard will show (e.g.
"Nuance Power PDF Advanced")
- <full path of main app> is what it really means (e.g. "D:\Program
Files (x86)\Nuance\Power PDF 20\bin\NuancePdf.exe")
- <path of scanner.ini> can be absolute path but usually it will be
relative using one of the following prefixes:
- “ROAMING\” is the user’s roaming data folder
- “LOCAL\” is the user’s local data folder
- “COMMON\” is the common data folder
- (e.g. "LOCAL\Nuance\PDF\V1\Scanner.ini")
- <registry key> is the path of registry entries relative to HKLM\SOFTWARE if it is different from <product name>, otherwise it can be
empty (e.g. "Nuance\PDF\V1")
- <language> is the 3 letter suffix of one of the RnRsdWizRes_*.dll
files. It is treated “ENG” if it is empty.
Currently the following languages are available: BRA, BUL, CHS, CHT, CZH, DAN,
DUT, ENG, FIN, FRE, GER, HUN, ITA, JPN, KOR, NOR, POL, ROM, RUS, SLO, SPA, SWE,
TUR, but the list of available languages depends on the file set just
installed.
e.g. “Nuance Power PDF Advanced;D:\Program Files (x86)\Nuance\Power PDF
20\bin\NuancePdf.exe;LOCAL\Nuance\PDF\V1\Scanner.ini;Nuance\PDF\V1;ENG”
The separator character between the components of CustomActionData can be ‘;’
(semicolon) or ‘|’ (vertical bar)
c.
This function performs the following operations:
·
Creates the following registry key: HKLM\SOFTWARE\<product
name> or HKLM\SOFTWARE\<registry key> if <registry
key> is not empty
·
Creates the following values under the key above:
- BinPath = <full path of RSD> without the name of the file (e.g. “D:\Program
Files (x86)\Nuance\Power PDF 20\bin\”)
- DataPath = <path of scanner.ini>
- ProductName = <product name> if it does not exist already and
differs from <registry key>
- _RSD_ = <number> for private use of RSD
·
Creates the following folder: <Common
AppData>\Nuance\SWizard
·
Copies the following files from the installed binaries to the
folder above: SWizard.xml, SWizard.xsd with version control and
reference count (creates or increases reference count)
·
Creates the following folder: <Windows>\PIXTRAN if ISIS
is supported by the product (i.e. RnISISu.rsd is installed)
·
Copies the following file from the installed binaries to the
folder above: RsdScan.chn with reference count (creates or increases
reference count)
·
Creates the following registry key:
HKLM\SOFTWARE\PFU\ScanSnap Extension\<product name> if Fujitsu
ScanSnap is supported by the product (i.e. RnScanSnapU.rsd is installed)
·
Creates the following values under the key above:
- <Default> = <full path of main app>
- Config = <path of ScanSnap.ini> in the same folder as <path
of scanner.ini> if it does not contain any prefix above, otherwise the
prefix is changed to <Common AppData>.
- Path = <full path of main app> without the name of the file (e.g.
“D:\Program Files (x86)\Nuance\Power PDF 20\bin\”)
2.
int WINAPI RsdRepairMsi( MSIHANDLE hMsi )
a.
It can be called when 'Repair' is selected in the
installer. This function performs all necessary actions for RSD which can only
be done in Admin Mode at repair time.
b.
The CustomActionData should be composed
exactly the same way as for RsdInstallMsi().
c.
This function performs the same operations as
RsdInstallMsi() except it does not increase reference counts.
3.
int WINAPI RsdUninstallMsi( MSIHANDLE hMsi
)
a.
It can be called when 'Uninstall' is selected in
the installer before the installed binaries are removed. This function performs
all necessary actions for RSD which can only be done in Admin Mode at uninstall
time.
b.
The CustomActionData should be composed
exactly the same way as for RsdInstallMsi() except it should contain
<delete custom setting> instead of <language>:
<product name>;<full path of main app>;<path of scanner.ini>;<registry key>;<delete custom settings>
Where:
<delete custom settings> is “0” or empty if custom settings should be
preserved or “1” if custom settings should be deleted. Currently it
applies only to the WizConf.xml file of the Wizard.
e.g. “Nuance Power PDF Advanced;D:\Program Files (x86)\Nuance\Power PDF
20\bin\NuancePdf.exe;LOCAL\Nuance\PDF\V1\Scanner.ini;Nuance\PDF\V1;1”
c.
This function performs the following operations:
·
Deletes the following values under the key below:
BinPath
DataPath
Language
ProductName if it has been created by RsdInstallMsi()
_RSD_
·
Deletes the following registry key: HKLM\SOFTWARE\<product
name> or HKLM\SOFTWARE\<registry key> if it has been
created by RsdInstallMsi()
·
Removes the following files from the folder below:
SWizard.xml, SWizard.xsd with reference count (decreases the
reference count and deletes the files and the reference count itself if it
becomes 0)
·
Removes the following file from the folder below:
WizConf.xml along with SWizard.xml if it was removed
and <delete custom settings> is
“1”
·
Removes the following folder: <Common
AppData>\Nuance\SWizard if it is empty
·
Removes the following folder: <Common AppData>\Nuance if
it is empty
·
Removes the following file from the folder below:
RsdScan.chn with reference count (decreases the reference count and deletes
the file and the reference count itself if it becomes 0)
·
Removes the following folder: <Windows>\PIXTRAN if it is
empty
·
Removes the following file: ScanSnap.ini from the folder
where the Config key of HKLM\SOFTWARE\PFU\ScanSnap Extension\<product
name> points
·
Removes the following folder: the folder where the Config
key of HKLM\SOFTWARE\PFU\ScanSnap Extension\<product name> points
if it is empty
·
Deletes the following registry key:
HKLM\SOFTWARE\PFU\ScanSnap Extension\<product name> with all of its
values
An up-to-date version of this file is located in the root folder of the
installation media and CSDKLab.com