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 及更高版本等),则无需采取任何特定操作。