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);
これで完了です。