为 .dgn 文件创建和渲染 PDF 附件

ODA 平台以多种方式处理 PDF。一个常见功能是使用 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 天。
无风险,无需信用卡。

免费试用