我这边想实现一个批量打印图框的功能。读取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获取吗。我的想法就是做个一样的下拉列表出来
一、老师 , 你的意思就是 想要用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
Answer Verified By: 瑞 胡
是的 老师,我这边实验成功了!
现在就有个问题哈。在print的时候,想要打印到指定文件,需要给出文件的路径,文件名,和文件后缀,比如 C:\\Sample.pdf 这样的。 如果是bently的驱动,那么使用 plotter->GetString(PlotTagStr::DefaultExtension, ws1); 这样可以获取后缀。但是如果是windows驱动,这样获取不到后缀。做批量打印的时候,就没法去预设文件的保存类型了 。
老师 你这边有什么建议吗。
Windows驱动每种驱动程序打印出的结果文件的后缀都是事先规定好的吧?
是呀。 用windows驱动打印的话, 调用print() 不传参数的话, 就会弹出一个对话框去手动填写文件名,这时候后缀名是定死的。
同样的 如果调用print()传一个具体的文件路径比如C:\\Sample.pdf ,那么 程序就不会弹出一个对话框,程序就直接打印到指定文件,这样更快捷,但是有个问题就是,事先得先知道 这个windwos打印驱动的保存文件类型是什么。