从 OdDbOle2Frame 实体中提取图像文件

当尝试从 OLE2 帧实体中提取图像文件时,OdDbOle2Frame 具有 getCompoundDocument() 方法来获取 streamBuf,但这只是复合文档的流,而不是图像。通常使用 OdOleItemHandler 模块来处理复合文档,但此模块不具备提取图像的功能,并且它使用 WinAPI,仅在 Microsoft® Windows® 上可用。

Teigha 包含一个替代的 OdOleSsItemHandler 模块,用于在非 Windows 平台上绘制 OLE 预览图像。该模块的功能有些受限,但它支持提取图像文件以供外部使用。此模块应在加载数据库之前加载。如果数据库已加载,则应重新加载。例如:

exractOleImageFiles(pDb->appServices(), pDb->getFilename());

某些 OLE 实体仅包含 WMF 预览,例如,包含 Microsoft Excel® 内容的实体。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());
    }
  }
}

今天就开始行动

免费试用 ODA 软件 60 天。
无风险,无需信用卡。

免费试用