Windows字体渲染
我在写一个应用程序,它将数据流传送到打印机(从Redmon)作为输入。数据流将文本呈现为单色位图,打印机将使用该位图将其打印在纸张上。我打算解析这个数据流并理解打印机的文本。我的应用程序将分析来自任何Windows应用程序并进入打印机的数据。Windows字体渲染
我解析数据流的方式是匹配像素信息(逐字节),如果有完全匹配,我可以唯一标识一个字符。为此,我假设所有Windows应用程序使用相同的窗口渲染器来渲染字体的像素。因此,如果这些应用程序(包括基于java的应用程序)使用相同的字体和字体大小来打印文本,我总是会从任何应用程序中获取特定字符的相同字节序列。这是一个正确的假设吗?Windows是否为应用程序提供各种选项来呈现文本进行打印?
也有一个库,我可以使用单色位图数据进行字符识别吗?
注意:我使用的打印机是兼容ESC/POS的打印机。这些打印机的打印机驱动程序将要打印的数据作为单色位图发送。
我对ESC/POS打印机并不熟悉,但是如果您可以保证驱动程序始终将文本呈现为单色位图,则相同字体和大小的字符相同的机会非常高,但它们不是100 %。首先,您还需要考虑旋转,缩放和剪切。您需要考虑整个转换矩阵,而不仅仅是字体大小。
我能想到的还有至少两个其他故障点:1)文本用透明胶片覆盖,2)如果机器安装了具有相同名称的备用字体。例如,像Helvetica这样的常见字体可以从很多来源获得,而且它们之间的字符不会相同。第三种可能的失败是应用程序忽略了打印机是单色的并以彩色或灰度打印的事实。将彩色或灰度转换为单色将产生不同颜色的不同位图。
至于OCR软件,Wikipedia有一个很好的OCR SDK比较图表。
谢谢凯里!我认为我可以通过以下方式避免前两个失败点:1)我认为你的意思是像“水印”这样的东西,对吧?我将运行我的软件的应用程序不会打印任何透明胶片。 2)我可以设置机器使用像Helvetica情况下的Windows默认字体文件这样的常见来源的字体。我不确定第三种情况,我正在尝试查看运行我的软件的应用程序是否会打印单色打印机或彩色打印机。 – mabicha 2012-08-16 07:04:39
另外,你可以请我建议我一些来源(书籍,博客等),我可以得到更多的信息如何字体呈现在Windows打印机上工作? – mabicha 2012-08-16 07:07:35
对不起,我不知道Windows字体渲染有什么好的参考。简而言之,文本是由打印驱动程序呈现的。驱动程序可以使用线图将文本绘制为位图或多边形。现代字体几乎总是绘制为多边形,因为位图缩放非常差。但是,驱动程序可以告诉Windows它只生成位图文本,这是ESC/POS打印机必须执行的操作。渲染位图字体非常简单,相当于从字体中选择最接近所需大小的位图,然后将其贴到设备上,如果它不是完全匹配,则将其缩放。 – 2012-08-16 17:49:57
Brr,这是行不通的。因为其中之一,打印机驱动程序不会将位图发送到打印机。他们有自己的语言,便宜的有一个非常专有的语言。选择XPS打印机作为您的默认打印机,现在您可以轻松读取XPS文档。 – 2012-08-13 20:05:44
@HansPassant:感谢您的回复!其实我使用ESC/POS打印机驱动程序发送文本作为单色位图打印。如果打印应用程序是Notepad/Word/Notepad ++,我也可以成功扫描此位图数据。但是我想确保所有的Windows应用程序都能发送给定字体和字体大小的相同单色位图。 – mabicha 2012-08-14 07:18:13