1

这是一个与身份证打印相关的 WPF 桌面应用程序。我们尝试添加的新功能之一是磁条编码。花了几天后,我仍然不知道从哪里开始。我用谷歌搜索的次数越多,新问题就会不断出现。我将在这里总结它们。我很高兴收到专家的来信(即使有人可以回答一个/一些问题):

  1. 磁条打印机是否也可以像普通打印机一样工作(意味着它们也可以打印文本和图形,还是我们在第一遍中在其他常规打印机上打印卡片,然后将它们插入磁条打印机以将磁数据编码到它们上,在第二遍)?
  2. 如果对 Q1 的回答是肯定的,我如何在常规打印作业期间将磁条数据发送到打印机(通过 WPF、使用PrintDialog等完成FixedDocument)。
  3. 我下载并检查了 Zebra 打印机 SDK。看起来这些打印机除了磁条编码之外还支持文本/图形打印,但是他们的 SDK 需要我调用他们的本机打印功能,这不适合 WPF 的标准打印模型。如何克服这一点?
  4. 另一个地方,我读到磁条打印机需要特定格式的简单 ASCII 文本才能将它们编码到卡上,我什至可以从记事本中做到这一点。如果这是真的,那么 Q1 的答案可能是否定的。但话又说回来,这种方法如何与常规 WPF 打印结合使用?

编辑

  1. 我还了解到,有些磁条字体在放置在文档中时,最终会被编码到磁条上,而不是常规打印。如果这是真的,它将非常适合 WPF 打印模型。但是谷歌搜索并没有为磁条字体返回太多有希望的结果。也许这是品牌特有的功能。
4

1 回答 1

2

我目前正在从事一个类似的 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 来执行打印作业。

我希望这有帮助!

于 2017-04-12T15:10:45.077 回答