TeighaでPDFアンダーレイが標準になりました

Teigha 2019のリリースにより、ODAメンバーはTeighaの新しいPdfiumModuleモジュールを使用して.pdfファイルをアンダーレイとしてインポートする新しい方法を利用できるようになりました。このモジュールはGoogleが開発したPdfiumライブラリに基づいています。Pdfiumはオープンソースとして無料で利用できます。以前、ODAメンバーはPdfVIModuleモジュールを使用して.pdfファイルをアンダーレイとしてインポートできましたが、追加費用がかかりました。

PdfiumModuleは無料であることに加えて、PdfVIModuleよりも高速(.pdfファイルによって数パーセントから数倍高速)であり、クロスプラットフォームをサポートし、ソースコードにアクセスできるため将来のカスタマイズの可能性を秘めています。以下は、PdfiumModuleとPdfVIModuleが使用できるTeigha製品の利用可能な構成を比較した表です。

構成 PdfiumModule PdfVIModule
Visual Studio 2015以降 (vc14, vc15) はい 提供終了
Visual Studio 2013以前 (vc9, vc10, vc11, vc12) いいえ 提供終了
Linux GCC 4.7以前 (4.1, 4.2, 4.4, 4.7) いいえ 提供終了
Linux GCC 4.8以降 はい 提供終了
Mac OS X はい 提供終了
iOS はい いいえ
Android はい いいえ
PdfiumModuleは、この表に記載されているプラットフォームの静的構成もサポートしていることに注意してください。

 

ここで、PdfiumModuleは、C++ 11をサポートするすべてのプラットフォームで、動的構成と静的構成の両方で使用できることがわかります。

PdfiumModuleの主な機能は次のとおりです。

  • レンダリングされた.dwgファイルのビットマップとして.pdfファイルをレンダリングする
  • PdfUnderlayのSnapPointを処理する

レンダリングとSnapPointの処理はPDFレイヤーの状態を考慮に入れますが、PdfModuleVIはPDFレイヤーの状態を完全に処理しません。

PdfModuleVIからPdfiumModuleへの切り替え

PdfiumModuleの使い方はPdfModuleVIと同じなので、Pdfiumへの移行は簡単です。PdfUnderlayを作成する例を次に示します。

OdDbUnderlayReferencePtr loadPdfToUnderlayInModelSpace(OdDbHostAppServices* pHostApp)
{
  OdRxModulePtr pModule = ::odrxDynamicLinker()->loadModule(OdPdfModuleVIModuleName);
  if (pModule.isNull())
   throw OdError(eNullObjectPointer);

  OdString shortFileName = OD_T("test.pdf");
  OdString inputPdfFile = pHostApp->findFile(shortFileName);
  OdDbDatabasePtr pDb = pHostApp->createDatabase();
  // Try to load pdf file
  OdDbUnderlayHostPEPtr pHost 
       = OdDbPdfDefinition::desc()->getX(OdDbUnderlayHostPE::desc());

  if (pHost.isNull())
    throw OdError(eNullObjectPointer);

  OdDbUnderlayFilePtr pUnderlayFile;
  OdResult res = pHost->load(*pDb, inputPdfFile, "", pUnderlayFile);
  if (res != eOk)
    throw OdError(res);

  // Create pdf definition, add it to dictionary
  OdDbUnderlayDefinitionPtr pDef = OdDbPdfDefinition::createObject();
  pDef->setSourceFileName(inputPdfFile);
  pDef->setItemName( "1" ); // Page number

  OdString dictName = OD_T("MyPdfUnderlay - ") + activeLayout;
  OdDbObjectId definitionId = pDef->postDefinitionToDb(pDb, dictName);

  // Add Pdf underlay reference to model space
  OdDbUnderlayReferencePtr pRef = OdDbPdfReference::createObject();

  pRef->setDatabaseDefaults(pDb);

  OdDbBlockTableRecordPtr pSpace 
     = pDb->getModelSpaceId().safeOpenObject(OdDb::kForWrite);
  pSpace->appendOdDbEntity(pRef);
  pRef->setDefinitionId(definitionId);

  return pRef;
}

これを置き換えるだけです。

OdRxModulePtr pModule = ::odrxDynamicLinker()->loadModule(OdPdfModuleVIModuleName);

これで:

OdRxModulePtr pModule = ::odrxDynamicLinker()->loadModule(OdPdfiumModuleName);

これで完了です。

今すぐ始める

ODAソフトウェアを60日間無料でお試しください。
リスクなし、クレジットカード不要。

無料で試す