我这边想实现一个批量打印图框的功能。读取dgn信息,获取图框位置,并且套上fence 都已经实现了。就是打印的那部分还有很多疑问。
如下代码,能实现打印fence到pdf,我这边就想做更多的功能,所以有了一些疑问
1.如何打印到实体打印机。
PrintDescriptionPtr printDescPtr = PrintDescriptionRef::Create(); IPrintDescriptionP printDesc = printDescPtr->GetP(); if (SUCCESS != printDesc->InitializeFromTCB(L"pdf.pltcfg")) return; //设置纸张名称 printDesc->SetFormName(L"ISO A4"); if(printDesc->IsFenceDefined()) { printDesc->SetPlotArea(PlotAreaMode::Fence); printDesc->SetPaperOrientation(PlotOrientation::Portrait); } else { MessageBox::Show("没有Fence 未生成pdf"); return; } //开始打印 printDesc->Print(L"C:\\Sample.pdf");
2.打开msce自带的打印功能,可以选择很多打印驱动,其中分为windows的打印驱动和bently的打印驱动。
bently驱动的pltcfg文件,我这边知道文件在哪。 windows的那些驱动信息,有现成的api获取吗。我的想法就是做个一样的下拉列表出来
MS SDK的例子中有7个有关打印的,不知您读过没有?C:\Program Files\Bentley\MicroStationCONNECTSDK\examples\Printing
PrintAcctLog 是通过打印机事件,像个钩子一样,来记录打印日志。这个我暂时用不上。
PrintCustomProperties 也是通过打印机事件,来输出一些属性。 这个我暂时用不上。
PrintDesc 是一个简单的打印pdf的例子,我上面给出的代码就是它的简化版本。 这个打印pdf没问题,但是上面提到多的功能,就不知道怎么下手了。
PrintDlgDesc 是获取msce自带打印机上的参数数据的。 这个可能有点用,就是去获取驱动等信息,但是这种方法有点勉强了。还是想通过api直接获取想要的windows驱动。
PrinterDriver 是做的一个打印驱动,里面的东西很细。我想做的肯定是直接去使用一个驱动,而不是去创建一个驱动。这个我暂时用不上。
PrintSet 是c++\cli 的环境下,打印一个打印集。依然没有介绍关于如何使用windows打印驱动的东西。
PrintTextSubst 是打印的时候替换文本内容。这个我暂时用不上。
例子我都看了,没有关于如何使用windows打印驱动的代码。
你要往实体打印机打印的话,可否尝试将printDesc->InitializeFromTCB(L"pdf.pltcfg")
改成
printDesc->InitializeFromTCB(L"printer.pltcfg")
Answer Verified By: 瑞 胡
老师 这个是可以,但是windows的打印驱动 有很多个,我用"printer.pltcfg" 后 当前的windows打印驱动 是其中的一个,怎么去获取所有的驱动列表呢,怎么把其他的windows打印驱动设置为当前的呢。
瑞 胡 said:怎么去获取所有的驱动列表呢,怎么把其他的windows打印驱动设置为当前的呢。
这些功能都是调用的标准Win32的API。比如EnumPrinters就能获得Windows的所有系统打印机列表。需要您深入学习和研究一下Windows的打印编程。
https://baike.baidu.com/item/EnumPrinters
一、老师 , 你的意思就是 想要用windows驱动打印的话, 打印api 里面的只有 printDesc->InitializeFromTCB(L"printer.pltcfg") 这个加载函数有用吗。是不是因为这个InitializeFromTCB不能指定使用哪个windwos驱动,它只是默认的使用其中一个,至于想具体用哪个windows驱动去打印,需要调用Win32的API的去做一些事了吗?
二、我想具体的代码流程是不是 1.printDesc->InitializeFromTCB 2.使用Win32的API改变当前的windows打印驱动 3. printDesc->Print();
瑞 胡 said:是不是因为这个InitializeFromTCB不能指定使用哪个windwos驱动,它只是默认的使用其中一个,至于想具体用哪个windows驱动去打印,需要调用Win32的API的去做一些事了吗?
在MS端调用InitializeFromTCB指定printer.pltcfg后会选用Windows默认打印机。Winodws默认打印机只有一个。要想设置Windows默认打印机,还得调用Win32 API。
瑞 胡 said:我想具体的代码流程是不是 1.printDesc->InitializeFromTCB 2.使用Win32的API改变当前的windows打印驱动 3. printDesc->Print();
我认为应该是先调用Win32API设置Windows默认打印机,然后再调用InitializeFromTCB,最后是Print
是的 老师,我这边实验成功了!
现在就有个问题哈。在print的时候,想要打印到指定文件,需要给出文件的路径,文件名,和文件后缀,比如 C:\\Sample.pdf 这样的。 如果是bently的驱动,那么使用 plotter->GetString(PlotTagStr::DefaultExtension, ws1); 这样可以获取后缀。但是如果是windows驱动,这样获取不到后缀。做批量打印的时候,就没法去预设文件的保存类型了 。
老师 你这边有什么建议吗。