【msce c++】 关于调用打印API的一些疑问。

我这边想实现一个批量打印图框的功能。读取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获取吗。我的想法就是做个一样的下拉列表出来

Parents
  • 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: 瑞 胡 

Reply Children
  • 老师 这个是可以,但是windows的打印驱动 有很多个,我用"printer.pltcfg" 后  当前的windows打印驱动  是其中的一个,怎么去获取所有的驱动列表呢,怎么把其他的windows打印驱动设置为当前的呢。

  • 怎么去获取所有的驱动列表呢,怎么把其他的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();  

  • 是不是因为这个InitializeFromTCB不能指定使用哪个windwos驱动,它只是默认的使用其中一个,至于想具体用哪个windows驱动去打印,需要调用Win32的API的去做一些事了吗?   

    在MS端调用InitializeFromTCB指定printer.pltcfg后会选用Windows默认打印机。Winodws默认打印机只有一个。要想设置Windows默认打印机,还得调用Win32 API。

    我想具体的代码流程是不是   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驱动,这样获取不到后缀。做批量打印的时候,就没法去预设文件的保存类型了 。 

    老师 你这边有什么建议吗。