ODAプラットフォームは、さまざまな方法でPDFを扱います。一般的な機能の1つは、RxPdfToRasterサービスモジュールを使用して図面用のPDF添付ファイルを作成およびレンダリングすることです。.dgnファイルと.dwgファイルの両方でプロセスは似ており、この記事では.dgn図面での動作について説明します。
まず、空のデータベースを作成します。
OdDgDatabasePtr pDb = app->createDatabase();
次に、PDFコンバーターモジュールを準備します (変換は行われませんが、.pdfファイルからいくつかの情報を取得する必要があります)。
OdRxPdfToRasterServicesPtr pSvcs = odrxDynamicLinker()->loadApp(RX_PDF_TO_RASTER_SERVICES_APPNAME);
pConverter = pSvcs->createConverter();
.pdfファイルをロードし、必要な情報を取得します。
pConverter->loadPdf(L"file.pdf");
OdUInt16 count = pConverter->getPagesCount();
pConverter->setActivePage(2); //first page is active by default
OdPdfLayerArray layers;
pConverter->getLayers(layers); //we can enable/disable necessary layers in attachment with set layers[index].is_on
OdGsDCRect pageSize;
pConverter->getPageSize(pageSize); //page size measured in 1/72 inches
.dgn 用のラスター添付ファイルを準備します。
OdDgModelPtr pModel = pDb->getActiveModelId().openObject(OdDg::kForWrite);
OdDgRasterFramePtr pRasterFrame = OdDgRasterFrame::createObject();
OdDgRasterAttachmentHeaderPtr raster = OdDgRasterAttachmentHeader::createObject();
pModel->addElement(raster);
pModel->addElement(pRasterFrame);
raster->setFilename(L"file.pdf");
必要な設定を添付ファイルに適用し、添付ファイルを .dgn 図面に保存します。
//calculate size in meters
double width = (double)pageSize.m_max.x * .0254 / 72.;
double height = (double)pageSize.m_max.y * .0254 / 72.;
OdDgModel::StorageUnitDescription description;
pModel->getStorageUnit(description);
//calculate size in master units
width = width * description.m_numerator / description.m_denominator;
height = height * description.m_numerator / description.m_denominator;
raster->setExtent(OdGePoint2d(width, height));
int iDefaultDpi = 96; //96 is default system resolution
#if defined (ODA_WINDOWS)
DISPLAY_DEVICE dd;
dd.cb = sizeof(dd);
if (EnumDisplayDevices(NULL, 0, &dd, 0) != FALSE)
{
HDC hDC = CreateDC(dd.DeviceName, dd.DeviceName, NULL, NULL);
int iDpiX = GetDeviceCaps(hDC, LOGPIXELSX);
int iDpiY = GetDeviceCaps(hDC, LOGPIXELSY);
DeleteDC(hDC);
iDefaultDpi = iDpiX > iDpiY ? iDpiX : iDpiY;
}
#endif
pRasterFrame->setScanningResolution(OdGePoint2d(iDefaultDpi, iDefaultDpi));
pRasterFrame->setRasterReferenceId(raster->id());
pRasterFrame->setPrintableFlag(true);
pRasterFrame->setPageNumber(2);
for (OdUInt16 i = 0; i < layers.size(); i++)
pRasterFrame->setPdfLayerVisibility(layers[i].layer_name, layers[i].is_on);
そして、それを再描画します。
pModel->fitToView();
添付ファイルをレンダリングするには、使用しているコンパイラが C++11 (vc14/15、gcc 4.8 以降など) をサポートしていれば、特別な操作は必要ありません。