8

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

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

问题是:如何在不使用直接打印、转义码等的情况下使用 C# 将格式化的文档(预先打印的文具上的发票)打印到点阵打印机(Epson、Oki 和 Panasonic ......各种型号)。

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

4

8 回答 8

10

您可能应该使用报告工具来制作允许您或用户正确定位与预印文具相关的字段的模板。

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

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

第一种用法在 Windows 下大多被弃用,因为它没有提供太多控制输出的方式,而且每台打印机都有自己的特性,软件难以预测和定位页面上的内容(没有所见即所得)。

第二种只是使用图形页面范例,使文本和图形的定位独立于打印机的实际功能。
使用预印文具时,您的作业需要正确定位页面上的数据。
手动执行此操作会消耗资源,当然不建议在代码中创建布局,因为如果您的打印机、页面格式或打印的文具发生变化,您将无法更改代码。

最好的办法是只使用 .Net 提供的标准打印模型和一个报告工具,该工具允许您定义模型和模板来放置正确的文本和图形,然后从代码中驱动它。

Visual Studio 附带一个版本的 Crystal Reports,但还有其他更好的报告系统(例如,我使用developer express的那个),其中一些甚至是免费的。

于 2008-10-30T10:31:33.277 回答
5

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

  • 需要使用转义码和其他任何内容的点阵打印机报告,该报告保存在文本文件中,然后使用各种方法打印(type file.txt > lpt1或在代码中选择默认打印机并使用NOTEPAD /P file.txt) - 有关更多打印方法,请参阅此页面
  • 使用报告生成器工具(Crystal Reports、Report ManagerRLIB或任何可用的工具)的激光/喷墨打印机的另一份报告

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

于 2008-10-30T10:59:46.823 回答
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 On ii) n = 0 Off

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 开启

于 2009-02-23T07:46:39.397 回答
4

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

示例粗体字体 27,69

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

也许有点短:

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

于 2009-03-27T08:41:12.413 回答
1

看看System.Drawing.Printing命名空间。

于 2008-10-29T20:10:58.490 回答
0

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

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

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

于 2008-10-29T20:30:48.997 回答
0

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

我对打印的选择是不受管理的直接到打印机打印(使用 winspool.drv),这使我可以对打印机做任何我喜欢的事情,并让我可以轻松地排好队。VB.NET 示例或者我可以使用 GDI+ (System.Drawing.Printing),这很复杂,但可以与 XPS 和 PDF 打印机等非点阵打印机一起使用。

于 2008-10-30T07:28:05.410 回答
0

你可以参考这个http://www.codeproject.com/Articles/29709/Line-Printer-Class-in-C 希望有所帮助

于 2015-08-10T03:04:17.410 回答