在C#中如何进行点阵打印?

9

我正在尝试使用C#打印点阵打印机(各种型号),目前我正在使用Win32 API(您可以在网上找到很多示例)调用,直接从我的C#应用程序向打印机发送转义码。这很好用,但是 ...

我的问题是因为我正在生成转义代码,而不是依赖于Windows打印系统,所以无法将打印输出发送到任何“普通”打印机或PDF打印驱动程序之类的东西。(现在这会导致问题,因为我们正在尝试在使用Easy Print的2008终端服务器上使用该应用程序[它基于XPS])

问题是: 如何使用C#打印格式化文档(预印有序的发票)到点阵打印机(Epson、Oki和Panasonic ... 各种型号),而不使用直接打印、转义码等。

**仅澄清一下,我正在尝试使用GDI+(System.Drawing.Printing)等方法,但问题是很难使事情排列像旧代码一样。(旧代码直接将字符发送到打印机,绕过了Windows驱动程序。)有什么建议可以改进事情,使它们可以使用GDI +,但仍然像旧代码一样排列?


你能给我们提供打印到点阵打印机的示例链接吗? - Jitesh Patil
8个回答

10

您应该使用报表工具来创建模板,以便您或用户可以根据预打印的信纸正确定位字段。

使用点阵打印机,您基本上必须在以下两种模式中工作:

  • 行/列文本的简单打字机模式,您需要发送转义序列来管理打印机硬件中包含的少量字体,并且必须管理换行等特性;
  • 图形输出,其中页面被光栅化,打印机驱动程序仅驱动打印头和针输出点。

在 Windows 下,第一种用法大多已被淘汰,因为它没有提供控制输出的方式,而且每个打印机都有自己的特性,在页面上预测和定位事物变得笨拙和困难(没有所见即所得)。

第二种方法只是使用了一个图形页面范例,使得定位文本和图形独立于打印机的实际能力。
在使用预打印信纸时,您的任务是正确地将数据定位在页面上。
手工完成这项工作会消耗资源,不建议使用代码来创建布局,因为如果您的打印机、页面格式或打印信纸发生变化,您将受困于要更改的代码。

最好使用 .Net 提供的标准打印模型和报表工具,以便您可以定义模型和模板,在其中正确定位文本和图形,然后从代码中驱动它们。

Visual Studio 随附一个版本的 Crystal Reports,但还有其他更好的报表系统(例如我使用的来自 Developer Express 的报表系统),其中一些甚至是 免费的


谢谢,我不确定这是否能解决我的确切问题,但这可能是迄今为止最好的答案/解决方案。此外,我不知道FYIReporting。 - Dale

5

根据我的经验,对于同一份数据,使用两种报表更容易:

  • 一个报表用于点阵打印机,使用转义码和其他所需内容,并将其保存在文本文件中,然后使用各种方法进行打印(type file.txt > lpt1或在代码中选择默认打印机并使用NOTEPAD /P file.txt)- 有关更多打印方法,请参见此页面
  • 另一个报表用于激光/喷墨打印机,使用报表生成工具(如Crystal Reports,Report ManagerRLIB或其他可用工具)。

由于为正确的报表购买正确的打印机并不罕见,这种方法的优点在于让客户决定:点阵打印机用于A3/A4纸张格式的文本报表(通常用于会计部门),或者激光/喷墨打印机用于图形报表。


4
我不知道如何在C#中使用转义序列。但我有通用/纯文本打印机的所有转义序列。希望它有所帮助。
通用打印转义序列 1)设置行间距 a)1/8英寸 - 27,48 b)1/6英寸 - 27,50
2)选择草稿质量 a)27,120,0 / 27,120,48
3)信函质量 a)27,120,1 / 27,120,49
4)双倍高度 a)27,119,n i)n = 1 打开 ii)n = 0 关闭
5)双向打印 a)27,85,n i)0 - 双向 ii)1 - 单向
6)增加字符间距 a)27,32,n(每次增加n/12英寸)
7)选择粗体字体 a)27,69
8)取消粗体字体 a)27,70
9)选择斜体字体 a)27,52
10)取消斜体字体 a)27,53
11)选择 a)10cpi 27,8 b)12cpi 27,77 c)15cpi 27,103 d)18cpi 27,103
12)设置右边界 a)27,81,n
13)设置左边界 a)27,108,n
14)换页 a)12
15)压缩打印 a)0F 打开 b)12 关闭
16)双重打印 a)27,71
17)取消打印 a)27,72
18)下划线 a)27,45,0 关闭 b)27,45,1 打开
19)双倍宽度 a)27,84,0 关闭 b)27,84,1 打开

4

首先将序列命令转换为字符,然后传递给打印机。

例如,粗体字的命令为 27,69。

代码示例:

string.Format("{0}{1}",Convert.ToChar(27),Convert.ToChar(69));

也可以简写为:

string.Format("{0}{1}",(char)(27),(char)(69));


1

0

0

如果您的打印机需要安装驱动程序,那么您可以使用普通的Windows打印系统。大多数打印机,包括POS打印机,在Windows上都有可用的驱动程序。(大多数点阵打印机都是Epson兼容的。)一些POS打印机驱动程序也允许直接向打印机发送转义代码(使用特殊字体);您可能不需要这样的功能。

如果不是这种情况,那么您可以通过添加打印机向导来添加通用/纯文本打印机(驱动程序)。完成后,您可以为其配置某些命令(转义序列)-字体大小10/12/17,加粗开/关,下划线开/关,作业开始/停止,进纸和选择纸张大小。

我正在使用与FILE端口相关联的通用打印机来测试POS打印机的各种报告-查看文本文件以验证打印输出中的数字很容易。当然,对于格式化,需要特定的打印机驱动程序。


我正在尝试使用C#中的GDI+打印功能(System.Drawing.Printing),但问题在于它仍然不如直接将文本发送到打印机那样好...例如,我需要使用什么字体? - Dale
我认为这是正确的答案:您不想仅针对一个打印机进行操作,而是希望将其全部作为目标,所以最好像现在其他人一样进行打印,而不仅仅是发送字符到行式打印机(LPT)上。这样,您的打印机就成为了一个图形设备。 - Dave Van den Eynde
我认为文本打印机驱动程序是你最好的选择。你还应该考虑速度,使用矩阵打印机的图形模式打印要比使用转义码慢得多。不足之处在于与图形打印机的不兼容性,但对于预打印表格来说,使用另一台打印机并没有太大用处。 - Glenner003

0

看起来我想做的事情是不可能的。

打印的选择是非托管的直接到打印机打印(使用winspool.drv),这使我可以对打印机进行任何操作,并且可以轻松地将物品排列整齐VB.NET示例。或者我可以使用GDI +(System.Drawing.Printing),这很复杂,需要努力使事物排列整齐,但与非点阵打印机(如XPS和PDF打印机)兼容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接