阅读:3366回复:17
50分请教:在打印的port monitor中将WritePort中的buffer直接输出的文件后,如何查看实际打印的内容?
如题,谢谢!!
|
|
最新喜欢:aasa2
|
沙发#
发布于:2005-03-31 12:50
这样做就形成
实际打印的东西变成了打印机能够识别的仿真语言指令了 我们能的到的就是这些打印数据了 |
|
|
板凳#
发布于:2005-04-01 14:10
打印机语言是?
贴一段上来看看? [编辑 - 4/1/05 by caesun] |
|
地板#
发布于:2005-04-04 09:14
下面是Hook StartDocPort实现打印内容重定向的代码,也就是将打印的内容定向到一个文件。
BOOL WINAPI MyStartDocPort( HANDLE hPort, LPWSTR pPrinterName, DWORD JobId, DWORD Level, LPBYTE pDocInfo) { EnterCritSection(); PORT *pPort=(PORT*)hPort; if(pPort->dwStatus & PS_STARTDOC) { LeaveCritSection(); return FALSE; } TCHAR filepath[MAX_PATH]; _tcscpy(filepath,pPort->sPath); switch(Level) { case 1: { DOC_INFO_1 *pDoc=(DOC_INFO_1*)pDocInfo; _tcscat(filepath,pDoc->pDocName); break; } case 2: { DOC_INFO_2 *pDoc=(DOC_INFO_2*)pDocInfo; _tcscat(filepath,pDoc->pDocName); break; } } //filepath contains now the full path of output file //change file extension to .ps PathRenameExtension(filepath,_T(\".ps\")); //If output file exists: try to delete if(FileExists(filepath)) DeleteFile(filepath); pPort->hFile=::CreateFile( filepath, GENERIC_WRITE, 0, //dont share the file NULL, //SECURITY_ATTRIBUTES --> Handle cannot be inherited CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL); //no template file if(pPort->hFile==INVALID_HANDLE_VALUE) { //could not open file pPort->hFile=0; HANDLE hPrinter; if(OpenPrinter(pPrinterName,&hPrinter,NULL)) { SetJob( hPrinter, JobId, 0, NULL, JOB_CONTROL_RESTART); SetJob( hPrinter, JobId, 0, NULL, JOB_CONTROL_PAUSE); CloseHandle(hPrinter); LeaveCritSection(); return FALSE; } } else { //file successfully opened _tcscpy(pPort->sCurDocument,filepath); _tcscpy(pPort->sPrinter,pPrinterName); pPort->dwStatus|=PS_STARTDOC; pPort->dwJobID=JobId; } LeaveCritSection(); return TRUE; } |
|
|
地下室#
发布于:2005-04-04 10:07
看的出,你存储的是PS的驱动生成的数据,
搜索一下,会不会有PS的解释器 |
|
|
5楼#
发布于:2005-04-04 10:32
看的出,你存储的是PS的驱动生成的数据, 类似GSView的工具是可以查看PS文件的,但是所查看的PS文件必须满足PostScript的规范, 而驱动生成的打印数据是不是一定满足这个规范,至少我现在获得的文件通过GSView是看不到的。 郁闷ing。。。 |
|
|
6楼#
发布于:2005-04-04 23:11
...
想看的是生成出来的文件里的内容... |
|
7楼#
发布于:2005-04-05 09:48
... 正是,也就是类似打印监控软件\"PrintUsage\"里的内容查看。 |
|
|
8楼#
发布于:2005-04-06 08:42
[quote]... 正是,也就是类似打印监控软件\"PrintUsage\"里的内容查看。 [/quote] 你试试创建一个文本文件打印机 你可以参考一下下面的文章 http://search.csdn.net/Expert/topic/2566/2566840.xml?temp=.297909 [编辑 - 4/6/05 by Pregunta] |
|
|
9楼#
发布于:2005-04-06 08:56
顺便请教下,你的重定向功能适用与所有打印机吗?
比如本地打印机断口LPT,网络打印端口 而且你存储的数据是工作打印机能识别的原始数据吗? |
|
|
10楼#
发布于:2005-04-06 09:52
顺便请教下,你的重定向功能适用与所有打印机吗? 我参考的做法其实就是建立一个打印到文件的虚拟端口,然后把打印机的端口设为该端口。 至于获得的数据能不能识别,我也不清楚,我只是想把这些数据转换为tif或者jpg的格式,以便浏览。 |
|
|
11楼#
发布于:2005-04-06 18:44
呵呵,我估计这个文本文件打印机,只能将文本类的数据保存成我们识别的格式.把这些数据转换为tif或者jpg的格式可能要复杂点,那些工作应该在数据传输工程中做吧 PrintUsage的内容查看我也看了,他是生成tiff格式的图片保存,但是具体在哪个阶段转化数据就不清楚了,还有应该是在应用层通过应用程序来实现的. |
|
|
12楼#
发布于:2005-04-07 09:19
PrintUsage应该是使用解释PCL和PS的方式保存打印内容的,例如用GSView可以看PS文件,但是PCL的就不清楚了
|
|
|
13楼#
发布于:2005-04-07 10:39
[quote]顺便请教下,你的重定向功能适用与所有打印机吗? 我参考的做法其实就是建立一个打印到文件的虚拟端口,然后把打印机的端口设为该端口。 至于获得的数据能不能识别,我也不清楚,我只是想把这些数据转换为tif或者jpg的格式,以便浏览。 [/quote] pcl,ps语言的打印机,打印到文件包存的数据流,都是指令集合。如果打印机驱动调用的是gdi固有函数,也就是用raster模式,将文件类容当成image来实现打印的话,想转成jpg不是不可能。但是如果你的打印驱动大量的使用了自己的函数(好像我见过的多数如此),实现了诸如drvtextout,strokepath...之类的方法。估计你要将文件还原就不太现实了。 想知道文件里的类容,最好看看相关的语言解释文件,不过没有专门的工具的话,就得自己读二进制码了(不过有时候也是必须的)。我用的是公司自己内部开发的一套翻译软件,不能外传的。如果你正在开发的话,为什么不找对方要呢。据我所知很多打印机厂家都有自己的解释器阿。。 |
|
14楼#
发布于:2005-04-07 11:03
PrintUsage应该是使用解释PCL和PS的方式保存打印内容的,例如用GSView可以看PS文件,但是PCL的就不清楚了 我在考虑是不是可以通过截获打印池文件(EMF),然后用EMF解码器来还原数据,但是这个解码器么的找到 |
|
|
15楼#
发布于:2005-04-07 11:26
问题还没有解决,但是还是把分散了先,感谢几位的讨论、指导!
|
|
|
16楼#
发布于:2008-05-22 08:46
我在 www.codeguru.com 上下的例子, 但我用网络打印机打印的时候,
为什么打印服务不调用 MyStartDocPort 函数阿? 而MyStartDocPort函数正式起到重定性作用的???? 本地打印机没有试过 例子的具体地址是: http://www.codeguru.com/Cpp/W-P/printing/article.php/c5893 高人帮忙阿~!!!!! |
|
17楼#
发布于:2008-06-24 15:37
顶一个,我也碰到这个问题,不知如何解决,高手赐教一下。
|
|