[ブログに戻る](/ja/blog) # .dgn ファイルの PDF 添付ファイルを作成およびレンダリングする

Sergey Sherstnev 8月 15, 2019 [\#dgn](/ja/blog/tag/dgn) [\#pdf](/ja/blog/tag/pdf) [\#Raster image](/ja/blog/tag/raster-image)

<a class="a2a_button_facebook"></a><a class="a2a_button_twitter"></a><a class="a2a_button_linkedin"></a>

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 以降など) をサポートしていれば、特別な操作は必要ありません。

## 今すぐ始める

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

[無料で試す](https://www.opendesign.com/ja/free-trial)
