如何提取本地打印机打印的文字?

silverbullet007 2011-12-21 09:45:38
操作系统为Windows XP
需要在本地打印机打印文字的时候提取它打印的文字。目前想到的方案有:
1)使用虚拟打印机,让虚拟打印机打印txt文件,完成后再将打印任务转移(Redirect)到本地打印机。
使用这个方案,不知道有没有免费的SDK可供使用?
2)监控打印机端口
据我监控的结果看起来像是乱码,应该是并口发送给打印机的指令集,不知道如何从这些指令集中提取打印文字?

另外其它简单可行的方法也希望大家提供。
...全文
979 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
silverbullet007 2011-12-23
  • 打赏
  • 举报
回复
终于找到一个可以输出txt文件,又可以转移打印任务的软件LEADTOOLS ePrint,可免费使用30天,价格为99$
免费开源的找到了PDFCreator,但是中文输出txt文件时提示编码有问题,最后转移打印的排版好像也不对
赵4老师 2011-12-22
  • 打赏
  • 举报
回复
Windows下Hook打印文字相关API?
Printer: Printing Sample

Click to open or copy the files for the Printer sample.

The Printer sample shows how to print using both the CreateDC and the PrinterDlg methods for acquiring a printer HDC. The user is allowed to print different graphical objects, as well as a complete device font set. An "Abort" dialog box is also implemented.

The Printer sample also does the following:

Provides complete device capabilities for all printers and the display.


Provides information (levels 1 and 2) returned by a call to EnumPrinters.


Shows how to enumerate fonts for a particular DC.


Illustrates differences among the various mapping modes.


Demonstrates GDI features.
Building SDK Samples

This sample uses the following keywords:

createdc; deletedc; errmsgbox; getlasterror; getstringres; getstringres2; isdbcsleadbyte; mainwndproc; makeintresource; my_mbslen; outnum; outstr; outstr2; outstr3; printdlg; printthread; registerclass; strcat; winmain; wsprintf
silverbullet007 2011-12-22
  • 打赏
  • 举报
回复
没有人帮忙解决吗?
silverbullet007 2011-12-22
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 zhao4zhong1 的回复:]

建议在http://www.codeproject.com搜Printer Capture或Printer Hook或virtual printer
[/Quote]

好的,谢谢
赵4老师 2011-12-22
  • 打赏
  • 举报
回复
建议在http://www.codeproject.com搜Printer Capture或Printer Hook或virtual printer
赵4老师 2011-12-22
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 silverbullet007 的回复:]
引用 5 楼 zhao4zhong1 的回复:

Windows下Hook打印文字相关API?
Printer: Printing Sample

Click to open or copy the files for the Printer sample.

The Printer sample shows how to print using both the CreateDC ……
[/Quote]
来自MSDN98
silverbullet007 2011-12-22
  • 打赏
  • 举报
回复
找到一个Virtual Printer SDK,可以输出txt文件,然后可将打印任务转移(Redirect)到物理打印机,但是价格太高了,光虚拟打印机驱动就895美元。
SmartPrinter也可以,但是使用任务转移后没有反应,可能是由于没有注册导致的。SmartPrinter价格为3950元
不知道有没有开源的和免费的虚拟打印机,可以输出txt文件,并能将打印任务转移(Redirect)到物理打印机?
silverbullet007 2011-12-22
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 zhao4zhong1 的回复:]

Windows下Hook打印文字相关API?
Printer: Printing Sample

Click to open or copy the files for the Printer sample.

The Printer sample shows how to print using both the CreateDC and the PrinterDlg methods……
[/Quote]

请问你这些文字来自哪里?
silverbullet007 2011-12-22
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 chayedanwc 的回复:]

通过驱动程序下发到打印机的数据全部都是图像,不存在你说的文字。
即使是用Word或Txt编辑一个纯文字的文档,通过打印机驱动程序最终到达打印机的数据全部都是图像,除非你可以将图像中的文字提取成文字,例如用OCR识别技术,另外,到达打印机的图像也不是我们通常理解的BMP位图,它是一种带有指令格式的图像数据,这种格式的图像只有对应的打印机才能识别。

例如EPSON的图像格式,图像按照点行进行……
[/Quote]

那能不能通过虚拟打印机输出txt文件,打印完成后将打印任务转移(Redirect)到物理打印机?有没有这样的虚拟打印机?
chayedanwc 2011-12-22
  • 打赏
  • 举报
回复
通过驱动程序下发到打印机的数据全部都是图像,不存在你说的文字。
即使是用Word或Txt编辑一个纯文字的文档,通过打印机驱动程序最终到达打印机的数据全部都是图像,除非你可以将图像中的文字提取成文字,例如用OCR识别技术,另外,到达打印机的图像也不是我们通常理解的BMP位图,它是一种带有指令格式的图像数据,这种格式的图像只有对应的打印机才能识别。

例如EPSON的图像格式,图像按照点行进行下发,指令为16 05 00 00 00 00 00,这几个简单的数据表示一个一个点行的数据,它有5个字节,使用16作为指令头,然后需要发送15 01,纵向位移1个点行。如果将里面的15指令和16指令全部过滤掉,再加上BMP图像的指令头,它就是一幅标准的BMP图片。来自驱动程序的数据全部都是这种特定格式的图片,你很难将里面的文字提取出来。
silverbullet007 2011-12-21
  • 打赏
  • 举报
回复
不知道可不可以从打印缓冲池中提取文字?
silverbullet007 2011-12-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zhao4zhong1 的回复:]

如果往打印机送的是字符的像素或图片,你能保证正确识别出对应啥文字吗?
[/Quote]

首先可以肯定打印的是文字,不是图片,因为使用虚拟打印机后输出的是文字
赵4老师 2011-12-21
  • 打赏
  • 举报
回复
如果往打印机送的是字符的像素或图片,你能保证正确识别出对应啥文字吗?
实验报告 实验名称:打印的操作过程 实验仪器:HP LaserjetM1319f MFP 实验目的:认识和了解打印的工作原理,掌握打印的使 用方法. 实验步骤:一、打印与电脑的数据连接 .首先正确关闭电源; .把USB借口的两端分别连接在电脑和打印的接口上; .打开电源开关,检查是否正确安装成功 二、打印驱动器程序的安装 .点击电脑屏幕右下角的"开始"\菜单\"打印和传真"; .在"打印和传真"文件夹中,双击"添加打印",进入"打印向导", 点击"下一步"; .选择"连接到这台计算机的本地打印",并将"自动检测并安装我的即插 即用打印"前面的勾去掉,点击"下一步"; .在"使用以下端口"中选择"LPT1:打印端口",点击"下一步"; .点击"下一步",在"是否希望将这台打印机设置为默认打印",选择 "是",点击"下一步"; .默认为"不共享这台打印",点击"下一步"; .根据自己的需要选择是否"要打印测试纸",打开一个Word文档,输入要 测试内容,选择"文件"\"打印"\"确定"; .点击"下一步",将会出现"正在完成添加打印向导"的提示界面。此时 ,选择"完成"。 实验小结: 本周我们打印的使用操作过程以及它的基本工作原理,并且我在互联网上我也更 多的了解到打印的一些相关知识。 打印(printer) 是计算机的输出设备之一,用于将计算机处理结果打印在相关介质上。衡量打印 好坏的指标有三项:打印分辨率,打印速度和噪声。 打印的种类很多,按打印元件对纸是否有击打动作,分击打式打印与非击打式 打印。按打印字符结构,分全形字打印和点阵字符打印。按一行字在纸上形 成的方式,分串式打印与行式打印。按所采用的技术,分柱形、球形、喷墨式 、热敏式、激光式、静电式、磁式、发光二极管式等打印。 因此我还了解到如果打印无法打印怎么办? 一、打印须联机 在大多数打印上都有一个"ONLINE"指示灯,通常为绿色的常亮状态。当该指示灯不 亮或处于闪烁状态,说明联机不正常。请检查打印电源开关是否打开、电缆是否 连接等。如果打印没有处于联机状态,自然是无法打印了。 二、重新开启打印   如果打印处于联机状态仍无法打印文档,此时你可以重新开启打印,不仅清除 了打印内存,还能解决不少的打印故障。 三、将打印设置为默认打印 单击Windows 7"开始"菜单,指向"设备和打印",单击打开"打印"窗口,右键单击打印图标 ,系统弹出快捷菜单,单击其中的"设置为默认打印"即可。将打印设置为默认 打印 四、检查纸装放置 检查打印进纸盒是否有打印纸、色带和其它必需品,硒鼓、粉盒、色带或墨粉是否 有效。 五、取消暂停打印。   打印处于暂停打印状态也导致不能打印,在"打印"窗口,右键单击在用的打印 机图标,然后单击以清除"暂停打印"选项前的对号" "。 六、卡纸 出现卡纸时,大部分情况下,关闭打印,轻轻将卡纸取出即可;根据打印屏幕或 者电脑屏幕上会出现处理卡纸的提示,按照提示一步一步操作,就能恢复正常打印 。(下图以HP机器为例进行演示) 卡纸操作演示: 七、打印头堵塞 打印头堵塞有三种方法进行解决,首先查看墨水,判断墨水是否用完,若用完,及时 更换新墨盒;用打印的喷嘴检查程序,看打印结果是否严重断线,可用内置的喷 头清洁程序来让堵塞喷头恢复正常;或是将墨盒取出来进行手工来清洗。 八、程序生成的输出不正确导致不能打印 要确定程序生成的输出能否正确,能够采用通过其他程序打印文档的方法验证,在" 记事本"或"写字板"中键入几行文字,然后单击"文件"菜单上的"打印"。如果不能够 打印测试文档,可能是你使用的程序有问题,请重新安装程序。 九、重新安装打印驱动程序。   有时,打印驱动程序可能被损坏,从而引发无法打印文档的错误。我们可以重新 安装合适的驱动程序,然后再打印。在"打印"窗口,右键单击打印图标,再单 击"删除设备"。如果系统提示"删除这台打印的专用文件",请单击"是"按钮;在 "设备和打印"窗口,双击"添加打印"图标,打开"添加打印向导",单击"下一 步"按钮,然后执行屏幕指令。 十、杀毒 不定期对电脑进行杀毒 检查是否存在病毒,用杀毒软件进行杀毒。 如经过上述检查还是无法打印,有可能是打印损坏,请将打印送修。 不管是激光打印还是喷墨打印,在进行搬动或剧烈移动时,必须先把打印关 闭,然后断开电源线缆,避免损坏机器。 根据科学的快速发展,在相比速印机的近一个基础上,我们可以通过对电脑的连接 直接打印所需要的文档,对其进行排版等一切操作。 紧跟着办公设备的逐渐完善,在企事业单位也带来了它便利的一面,为我们办公室 的工作人员节省了不少时间,而且

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧