OLE2フレームエンティティから画像ファイルを抽出する場合、OdDbOle2FrameにはstreamBufを取得するためのgetCompoundDocument()メソッドがありますが、これは複合ドキュメントのストリームであり、画像ではありません。通常、OdOleItemHandlerモジュールは複合ドキュメントを操作するために使用されますが、このモジュールには画像を抽出する機能がなく、またWinAPIを使用するため、Microsoft® Windows®でのみアクセス可能です。
Teighaには、非Windowsプラットフォーム向けにOLEプレビュー画像を描画するための代替のOdOleSsItemHandlerモジュールが含まれています。このモジュールの機能はやや限定的ですが、外部使用のために画像ファイルを抽出する機能をサポートしています。このモジュールはデータベースをロードする前にロードする必要があります。データベースがすでにロードされている場合は、再度ロードする必要があります。例:
exractOleImageFiles(pDb->appServices(), pDb->getFilename());
一部のOLEエンティティ、例えばMicrosoft Excel®コンテンツを含むエンティティは、WMFプレビューのみを含んでいます。TeighaにはWMFを描画するクロスプラットフォーム機能はありませんが、WMFをファイルとして抽出することはできます。例:
void exractOleImageFiles(OdDbHostAppServices* pAppServ,
const OdString& sDatabaseFileName)
{
OdRxModulePtr pModule = odrxDynamicLinker()->loadModule(OdOleSsItemHandlerModuleName);
if (pModule.isNull())
throw OdError(L"OdOleSsItemHandler module is missing.");
OdRxRasterServicesPtr pRasSvcs = odrxDynamicLinker()
->loadApp(RX_RASTER_SERVICES_APPNAME);
if (pRasSvcs.isNull())
throw OdError(L"OdRxRasterServices module is missing");
OdDbDatabasePtr pDb = pAppServ->readFile(sDatabaseFileName);
if (pDb.isNull())
throw OdError(eNoDatabase);
OdDbBlockTableRecordPtr pSpace = pDb->getActiveLayoutBTRId()
.safeOpenObject(OdDb::kForRead);
for (OdDbObjectIteratorPtr pItr = pSpace->newIterator(); !pItr->done(); pItr->step())
{
OdDbOle2FramePtr pOle2Frame = OdDbOle2Frame::cast(pItr->entity());
if (pOle2Frame.isNull())
continue;
OdOleItemHandlerBasePtr pHandler = pOle2Frame->getItemHandler();
if (pHandler.isNull())
continue;
if (pOle2Frame.isNull())
continue;
OdString sImageFileName = sDatabaseFileName;
sImageFileName += L".";
sImageFileName += pOle2Frame->objectId().getHandle().ascii();
OdGiRasterImagePtr pImage = pHandler->getRaster();
if (pImage.get())
{
if (pRasSvcs->isRasterImageTypeSupported(OdRxRasterServices::kPNG))
{
sImageFileName += L".png";
OdStreamBufPtr pIO = ::odrxSystemServices()->createFile(sImageFileName,
Oda::kFileWrite,
Oda::kShareDenyNo,
Oda::kCreateAlways);
if (pIO.get())
pRasSvcs->convertRasterImage(pImage, OdRxRasterServices::kPNG, pIO);
}
continue;
}
OdBinaryData data;
if (pHandler->getWmfData(data))
{
sImageFileName += L".wmf";
OdStreamBufPtr pIO = ::odrxSystemServices()->createFile(sImageFileName,
Oda::kFileWrite, Oda::kShareDenyNo, Oda::kCreateAlways);
if (pIO.get())
pIO->putBytes(data.asArrayPtr(), data.size());
}
}
}