ドキュメント分類関連オブジェクトの操作
指定した MIME タイプのドキュメントを自動的に分類できるようにするには、以下のオブジェクトが必要です。
- 指定した MIME タイプのドキュメントに Content Engine のクラスを適用するドキュメント分類子。「ドキュメント分類子の作成」を参照してください。
- 指定した MIME タイプをドキュメント分類子に関連付ける DocumentClassificationAction オブジェクト。「DocumentClassificationAction オブジェクトの作成」を参照してください。
DocumentClassificationAction オブジェクトを取得することもできます。
ドキュメントの分類を依頼し、その分類状況を表示するには、自動分類を有効にしてドキュメントをチェックインする必要があります。「ドキュメントの自動分類」を参照してください。
ドキュメントの自動分類の概要については、『ドキュメント分類』を参照してください。
ドキュメント分類子の作成
ドキュメント分類子を作成するには、DocumentClassifier インターフェースを、Java™ コンポーネントまたは JavaScript コンポーネントとして実装する必要があります。分類子の実装により、チェックインされた Document オブジェクトが属する Content Engine クラスが決まり、次にそのクラスがオブジェクトに適用されます。通常この作業は、Document オブジェクトのコンテンツを解析し、コンテンツのメタデータを Content Engine のクラスのプロパティーにマッピングすることで行われます。
Java による実装と JavaScript による実装の例を以下に示します。それぞれ、MIME タイプが「text/pdf」であるドキュメントを分類します。classify メソッドは、ドキュメントの PDF コンテンツを InputStream オブジェクトとして取得し、サード・パーティーの API を使用してコンテンツを解析します。次に、PDF コンテンツの件名フィールドが調べられます。件名で PDF ドキュメントがローンのアプリケーションであることが示されている場合、このメソッドは changeClass メソッドを使用して、「PdfLoanApplication」クラスを Document オブジェクトに適用します。また、このメソッドは、PDF コンテンツのメタデータを「PdfLoanApplication」クラスのプロパティーにマッピングします。PDF ドキュメントがローンのアプリケーションでない場合、Document オブジェクトのデフォルトのクラスが維持されます。
- Windows: C:¥Program Files¥Filenet¥Content Engine¥samples
- Windows 以外: /opt/IBM/FileNet/ContentEngine/samples
Java の例
package sample.actionhandler;
import com.filenet.api.core.*;
import com.filenet.api.engine.DocumentClassifier;
import com.filenet.api.exception.*;
import java.io.*;
import com.ticdoc.pdfextract.*; // PDF ドキュメントをパースするサード・パーティー API
public class DocClassifyHandler implements DocumentClassifier
{
public void classify(Document doc)
{
try
{
// Get PDF content from the document passed to this method.
InputStream IS= doc.accessContentStream(0);
// サード・パーティー API を使用して PDF ドキュメントのメタデータを取得
PDFDocument pdfDoc = PDFDocument.load(IS);
PDFDocumentInformation pdfProperties = pdfDoc.getDocumentInformation();
pdfDoc.close();
// PDF ドキュメントの件名を取得
String pdfSubject = pdfProperties.getSubject();
// PDF 件名に基づいて分類
if ( pdfSubject.equalsIgnoreCase("loan application") )
{
// Apply new class.
doc.changeClass("PdfLoanApplication");
// ドキュメントにマップする PDF プロパティーを取得
String pdfloanType = pdfProperties.getLoanType();
String pdfApplicantName = pdfProperties.getApplicant();
String pdfDateSubmitted = pdfProperties.getModificationDate().getTime().toString();
// オブジェクト・ストアに保存された Document にプロパティーを設定
doc.getProperties().putValue("LoanType", pdfloanType);
doc.getProperties().putValue("ApplicantName", pdfApplicantName);
doc.getProperties().putValue("ApplicationDate", pdfDateSubmitted);
doc.getProperties().putValue("DocumentTitle", "PDF Loan Application");
// ローンの型に基づいてセキュリティー所有者を設定
if ( pdfloanType.equalsIgnoreCase("home loan application") )
doc.set_Owner("GEvans");
else if (pdfloanType.equalsIgnoreCase("auto loan application") )
doc.set_Owner("EMesker");
}
}
catch(Exception e)
{
throw new RuntimeException(e);
}
}
}
JavaScript の例
importPackage(java.lang);
importPackage(Packages.com.filenet.api.core);
importPackage(Packages.com.ticdoc.pdfextract); // PDF ドキュメントを解析するためのサード・パーティー API
function classify(doc)
{
try {
// Get PDF content from document passed to this method.
var IS= doc.accessContentStream(0);
// サード・パーティー API を使用して PDF ドキュメントのメタデータを取得
var pdfDoc = PDFDocument.load(IS);
var pdfProperties = pdfDoc.getDocumentInformation();
pdfDoc.close();
// PDF ドキュメントの件名を取得
var pdfSubject = pdfProperties.getSubject();
// PDF 件名に基づいて分類
if ( pdfSubject.equalsIgnoreCase("loan application") )
{
// Apply new class.
doc.changeClass("PdfLoanApplication");
// ドキュメントにマップする PDF プロパティーを取得
var pdfloanType = pdfProperties.getLoanType();
var pdfApplicantName = pdfProperties.getApplicant();
var pdfDateSubmitted = pdfProperties.getModificationDate().getTime().toString();
// オブジェクト・ストアに保存された Document にプロパティーを設定
doc.getProperties().putValue("LoanType", pdfloanType);
doc.getProperties().putValue("ApplicantName", pdfApplicantName);
doc.getProperties().putValue("ApplicationDate", pdfDateSubmitted);
doc.getProperties().putValue("DocumentTitle", "PDF Loan Application");
// ローンの型に基づいてセキュリティー所有者を設定
if ( pdfloanType.equalsIgnoreCase("home loan application") )
doc.set_Owner("GEvans");
else if (pdfloanType.equalsIgnoreCase("auto loan application") )
doc.set_Owner("EMesker");
}
}
catch (e) {
throw new RuntimeException(e);
}
}
DocumentClassificationAction オブジェクトの作成
DocumentClassificationAction オブジェクトは、自動分類を有効にしてドキュメントをチェックインするときに開始するドキュメント分類子を識別します。DocumentClassificationAction オブジェクトの作成方法およびそのプロパティーの設定方法を、次の Java および C# のコード例に示します。MimeType プロパティーが、DocumentClassificationAction オブジェクトを、同じ MIME タイプを持つドキュメントに関連付けます。プロパティーは「text/pdf」に設定されます。自動分類を有効に設定してこの MIME タイプのドキュメントがチェックインされると、この DocumentClassificationAction オブジェクトに関連付けられているドキュメント分類子が開始されます。
ドキュメント分類子は、ProgId プロパティー、および条件によっては CodeModule プロパティーを通じて DocumentClassificationAction オブジェクトに関連付けられます。JavaScript で実装された分類子の場合、ProgId プロパティーを「Javascript」に設定する必要があります。Java で実装された分類子の場合、ProgId プロパティーをドキュメント分類子の完全修飾名に設定する必要があります。以下の例では、Java で実装された分類子を想定しています。
例に示すように、ドキュメント分類子がオブジェクト・ストアに格納された CodeModule に含まれている場合は、CodeModule オブジェクトも取得し、このオブジェクトを DocumentClassificationAction オブジェクトの CodeModule プロパティーに割り当てる必要があります。CodeModule プロパティーを CodeModule の予約 (実行中) バージョンに設定することはできません。詳細については、「CodeModule オブジェクトの作成」を参照してください。
保存すると、DocumentClassificationAction オブジェクトが Content Engine のオブジェクト・ストアの Document Classification Actions フォルダーに格納されます。
Java の例
...
// Create document classification action.
DocumentClassificationAction docClassAction = Factory.DocumentClassificationAction.createInstance(os,
ClassNames.DOCUMENT_CLASSIFICATION_ACTION);
// Set MIME type that associates action to documents of same MIME type.
docClassAction.set_MimeType("text/pdf");
// ProgId プロパティーに、分類子の完全修飾名を設定
docClassAction.set_ProgId("sample.actionhandler.DocClassifyHandler");
// CodeModule オブジェクトの取得
CodeModule cm = Factory.CodeModule.getInstance( os,
ClassNames.CODE_MODULE, new Id("{C45954D4-5DBB-460B-B890-78D6F4CFA40B}") );
// CodeModule プロパティーの設定
docClassAction.set_CodeModule(cm);
docClassAction.set_DisplayName("DocumentClassificationAction");
docClassAction.save(RefreshMode.REFRESH);
}
C# の例
...
// Create document classification action.
IDocumentClassificationAction docClassAction = Factory.DocumentClassificationAction.CreateInstance(os,
ClassNames.DOCUMENT_CLASSIFICATION_ACTION);
// Set MIME type that associates action to documents of same MIME type.
docClassAction.MimeType = "text/pdf";
// ProgId プロパティーに、分類子の完全修飾名を設定
docClassAction.ProgId = "sample.actionhandler.DocClassifyHandler";
// CodeModule オブジェクトの取得
ICodeModule cm = Factory.CodeModule.GetInstance( os,
ClassNames.CODE_MODULE, new Id("{C45954D4-5DBB-460B-B890-78D6F4CFA40B}"));
// CodeModule プロパティーの設定
docClassAction.CodeModule = cm;
docClassAction.DisplayName = "DocumentClassificationAction";
docClassAction.Save(RefreshMode.REFRESH);
}
DocumentClassificationAction オブジェクトの取得
Factory.DocumentClassificationAction メソッドを使用すると単一の DocumentClassificationAction オブジェクトを取得できます。ObjectStore オブジェクトの DocumentLifecycleActions プロパティーを取得することで、DocumentClassificationAction オブジェクトのコレクション (DocumentLifecycleActionSet) を取得することもできます。
オブジェクト・ストアから DocumentLifecycleActionSet のコレクションを取得する方法を、次の Java および C# の例に示します。例では、セットを反復処理し、コレクション内の DocumentClassificationAction オブジェクトごとに、オブジェクトのプロパティーである MimeType、ProgId、および CodeModule を取得します。DocumentClassificationAction オブジェクトが参照するドキュメントの分類子は、オブジェクト・ストアに格納されている CodeModule に含まれていないことがあります。このシナリオは、Content Engine を実行中のアプリケーション・サーバーのクラスパスで指定された、JavaScript または Java で実装された分類子の場合に当てはまります。
Java の例
...
DocumentClassificationActionSet actionSet = os.get_DocumentClassificationActions();
DocumentClassificationAction actionObject;
Iterator iter = actionSet.iterator();
while ( iter.hasNext() )
{
actionObject = (DocumentClassificationAction)iter.next();
System.out.println("DocumentClassificationAction: " +
actionObject.get_DisplayName() +
"¥n MimeType is " + actionObject.get_MimeType() +
"¥n ProgId is " + actionObject.get_ProgId() );
String cmName = actionObject.get_CodeModule() != null ?
actionObject.get_CodeModule().getProperties().getStringValue("Name") :
"not assigned to this action";
System.out.println(" CodeModule is " + cmName);
}
}
C# の例
...
IDocumentClassificationActionSet actionSet = os.DocumentClassificationActions;
IDocumentClassificationAction actionObject;
System.Collections.IEnumerator iter = actionSet.GetEnumerator();
while (iter.MoveNext())
{
actionObject = (IDocumentClassificationAction)iter.Current;
System.Console.WriteLine("IDocumentClassificationAction: " +
actionObject.DisplayName +
"¥n MimeType is " + actionObject.MimeType +
"¥n ProgId is " + actionObject.ProgId );
String cmName = actionObject.CodeModule != null ?
actionObject.CodeModule.Properties.GetStringValue("Name") :
"not assigned to this action";
System.Console.WriteLine(" CodeModule is " + cmName);
}
}
ドキュメントの自動分類
分類用のインフラストラクチャーが事前に設定されている場合、MIME タイプによってドキュメントを自動分類できます。これには特定の MIME タイプについて、対応するドキュメント分類子および DocumentClassificationAction オブジェクトが存在する必要があります。
MIME タイプが「text/pdf」のドキュメントの自動分類を依頼する方法を、次の Java および C# の例に示します。
このコード例では、Document オブジェクトが PDF ドキュメント用に作成され、オブジェクトのプロパティー、特に ContentElements プロパティーと MimeType プロパティーが設定されます。ContentElements プロパティーはドキュメントの PDF コンテンツに設定され、このコンテンツは後でドキュメント分類子によって解析されます。Document オブジェクトの MimeType プロパティーの値は、DocumentClassificationAction オブジェクトの MimeType プロパティーの値と一致する必要があります。次に、AUTO_CLASSIFY 定数を指定して checkin メソッドを使用して、Document オブジェクトがチェックインされます。
この例には、チェックインされたドキュメントの ClassificationStatus プロパティーを読み取ることにより分類プロセスをモニターするコードも含まれています。このプロパティーは、DocClassificationStatus 定数に設定されています。自動分類の要求が出されたときの、ClassificationStatus の初期値は CLASSIFICATION_PENDING です。コードは、プロパティーの値が変更されるまで、この状況を繰り返し確認します。
ドキュメント分類子は非同期アクションとして実行されるため、自動分類要求はまずキューに追加され、DocumentClassificationQueueItem オブジェクトで表されます。キューに追加済みというこの状況が、CLASSIFICATION_PENDING 状況に該当します。
Java の例
...
Document doc = Factory.Document.createInstance(os, "Document");
FileInputStream fileIS = new FileInputStream("C:¥¥EclipseWorkspace¥¥Documents¥¥loanapplication.pdf");
// コンテンツ転送リストを作成
ContentTransferList contentList = Factory.ContentTransfer.createList();
ContentTransfer ctNew = Factory.ContentTransfer.createInstance();
ctNew.setCaptureSource(fileIS);
contentList.add(ctNew);
// Document オブジェクトにコンテンツを設定
doc.set_ContentElements(contentList);
// Set Document properties.
doc.getProperties().putValue("DocumentTitle", "PDF Document");
doc.set_MimeType("text/pdf");
// ドキュメントをチェックインし、サーバーにコミット
doc.checkin(AutoClassify.AUTO_CLASSIFY, CheckinType.MAJOR_VERSION);
doc.save(RefreshMode.REFRESH);
// 自動分類中の分類状況を確認
while (doc.get_ClassificationStatus() == DocClassificationStatus.CLASSIFICATION_PENDING)
{
System.out.println( "Classification status is " + doc.get_ClassificationStatus() );
doc.refresh();
}
System.out.println("Classification status is " + doc.get_ClassificationStatus() );
}
C# の例
...
IDocument doc = Factory.Document.CreateInstance(os, "Document");
Stream fileStream = File.OpenRead(@"C:¥¥EclipseWorkspace¥¥Documents¥¥loanapplication.pdf");
// コンテンツ転送リストを作成
IContentTransferList contentList = Factory.ContentTransfer.CreateList();
IContentTransfer ctNew = Factory.ContentTransfer.CreateInstance();
ctNew.SetCaptureSource(fileStream);
contentList.Add(ctNew);
// Document オブジェクトにコンテンツを設定
doc.ContentElements = contentList;
// Set Document properties.
doc.Properties["DocumentTitle"] = "PDF Document";
doc.MimeType = "text/pdf";
// ドキュメントをチェックインし、サーバーにコミット
doc.Checkin(AutoClassify.AUTO_CLASSIFY, CheckinType.MAJOR_VERSION);
doc.Save(RefreshMode.REFRESH);
// 自動分類中の分類状況を確認
while (doc.ClassificationStatus == DocClassificationStatus.CLASSIFICATION_PENDING)
{
System.Console.WriteLine("Classification status is " + doc.ClassificationStatus);
doc.Refresh();
}
System.Console.WriteLine("Classification status is " + doc.ClassificationStatus);
}