我目前正在从事一个类似的 WPF 项目,该项目需要磁编码以及身份证上的图像打印。我发现只要在主机上安装了磁编码打印机的驱动程序,磁编码就很简单了。需要注意的一个重要部分是驱动程序使用的分隔符。这可以是 NULL、零或空格。这在编码特定轨道(即轨道 2 但不是我们现在的轨道 1)时发挥作用。我使用 NULL 设置,它只允许在作业中发送 Track 2 数据。此设置可在 Fargo 打印机的打印机首选项中找到(控制面板 -> 硬件和声音 -> 设备和打印机 -> 右键单击打印机 -> 打印机首选项)。以下是这些首选项的示例(注意 ASCII 偏移字段):
我不认为您必须为您正在使用的打印机使用 SDK。我使用的是 Fargo 打印机,但使用 PrintDocument 和 PrintPage 编写了自己的打印功能,用于磁编码和图像。
一个示例和快速测试是使用 Notepad++(或类似工具)将 Track 2 数据发送到打印机。将其复制并粘贴到编辑器的第一行并打印(使用卡片打印机)。
~2;000099990000?
驱动程序应该了解它是 Track 数据这一事实并相应地处理它,而无需您提供任何更多输入。您可能需要按照说明使用打印机首选项。
〜2; 表示 Track 2 后跟 12 个字符的数据字符串,后跟结束标记 (?)。有大量关于在线跟踪数据和布局的文档。这是假设一个 NULL 分隔符值(在 Track 1 和 Track 2 之间)。
在卡片的两面打印可能很麻烦,但这似乎不在这个问题的范围内。我建议在您的 WPF 应用程序中使用 Windows 本机 PrintDocument 和 PrintPage 方法;无论如何,您下载的 SDK 很可能在后台使用这些方法。
PrintDocument/PrintPage 的示例:
private int PageCount { get; set; }
public void Print()
{
PageCount = 0;
PrintDocument pd = new PrintDocument
{
// Define your settings
PrinterSettings = {
Duplex = Duplex.Horizontal,
PrinterName = ConfigurationManager.AppSettings["PrinterName"]
}
};
Margins margins = new Margins(0, 0, 0, 0);
pd.OriginAtMargins = true;
pd.DefaultPageSettings.Margins = margins;
pd.PrintPage += new PrintPageEventHandler(this.PrintPage);
PrintPreviewDialog ppd = new PrintPreviewDialog();
ppd.Document = pd;
// Uncomment to show a Print Dialog box
//if (ppd.ShowDialog() == DialogResult.OK)
pd.Print();
pd.Dispose();
}
private void PrintPage(object o, PrintPageEventArgs e)
{
PrintDocument p = (PrintDocument)o;
p.DefaultPageSettings.Landscape = true;
p.DefaultPageSettings.Margins = new Margins(0, 0, 0, 0);
p.DefaultPageSettings.PaperSize = new PaperSize("YourPaperSizeName", 340, 215);
p.OriginAtMargins = true;
o = p;
e.PageSettings.PrinterSettings.DefaultPageSettings.Landscape = true;
e.PageSettings.Landscape = true;
// Do Print First Side (MAG ENCODE)
if (PageCount == 0)
{
// Do Side 1 Stuff
// If Two-Sided Printing: true
e.HasMorePages = true;
//If no more, set above to false and PageCount = 0, else...
PageCount++;
}
else
{
// Do Print on Other Side
// STUFF
// STUFF
// Since only two sides/card printing: false
e.HasMorePages = false;
PageCount = 0;
}
}
同样,磁编码不应该是特定品牌的,您不应该仅仅依靠他们的 SDK 来执行打印作业。
我希望这有帮助!