我这边想实现一个批量打印图框的功能。读取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打印驱动的代码。
Windows驱动每种驱动程序打印出的结果文件的后缀都是事先规定好的吧?
是呀。 用windows驱动打印的话, 调用print() 不传参数的话, 就会弹出一个对话框去手动填写文件名,这时候后缀名是定死的。
同样的 如果调用print()传一个具体的文件路径比如C:\\Sample.pdf ,那么 程序就不会弹出一个对话框,程序就直接打印到指定文件,这样更快捷,但是有个问题就是,事先得先知道 这个windwos打印驱动的保存文件类型是什么。
瑞 胡 said:但是有个问题就是,事先得先知道 这个windwos打印驱动的保存文件类型是什么。
推测这个也是需要调用Win32 API来获得的。
老师 ,你说的这个是一个思路,我去网上找了很多,现在暂时没有找到方法。
我这边换个思路 ,api中是否有,当无参 print 后,弹出来对话框,对话框中的文件名被设置好的。(现在无参 print 时,弹出框里面文件名为空的,如下图)。
print不带参就是期望用户手动输入,带参则是程序指定。
你试一下只给文件基本名称,不带扩展名看看是什么效果。
我试过了,只要带参数, 就一定会生成文件,不带扩展名的话, 就会生成不带扩展名的文件。
确实是一个小难题。
plotter->GetString(Print::PlotTagStr::DefaultExtension, wStr);返回的默认扩展名是000,这是MS在采用自己的打印驱动时生成打印文件用的默认扩展名。
可能需要到Windows编程论坛去咨询有关Windows打印API的专家了。如下是Win32 打印API大全:
https://www.cnblogs.com/mydomain/archive/2010/11/24/1887161.html
变通的办法是:调用plotter->GetString(Print::PlotTagStr::SysprinterName, wStr);获得当前的系统打印机名称,根据具体的打印机名称显式地指定扩展名了。比如,如果获得的是Microsoft XPS Document Writer,就将扩展名指定为.XPS。将贵单位常用的打印机都指定一遍就可以了。
建议采用配置文件的方式实现,让用户指定打印机对应的扩展名。实体打印机可以通过端口名称来判断。