磁条印刷:从哪里开始?

Posted

技术标签:

【中文标题】磁条印刷:从哪里开始?【英文标题】:Magnetic stripe printing: Where to start? 【发布时间】:2017-02-22 13:15:12 【问题描述】:

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

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

编辑

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

【问题讨论】:

我认为这取决于您拥有什么样的打印机。从this 示例中,我可以说有打印机在两面打印并一次性编码条纹。当我过去使用斑马打印机(用于标签打印)时,我记得我们将特定的斑马 ASCII 文本发送到 com 端口以在标签上打印图像和文本……但那是 10 年前的事了。恕我直言,我不认为您适合标准打印模型。 @Reniuz:感谢您的意见。我的办公桌上现在没有特定型号。我正在寻找一种适用于所有/大多数磁条打印机的通用方法,就像适用于所有扫描仪的 TWAIN 库一样。也请参阅我的编辑。 【参考方案1】:

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

我希望这会有所帮助!

【讨论】:

感谢您付出了这么多努力。仅此一项就值得+1。我会在早上尝试将其放入我的打印模块中,然后返回我的发现。 不客气!如果您有任何问题,我会尽力提供帮助。我知道我的解释有点罗嗦,所以如果需要的话,我可以把它分解成更小的部分。我对 WPF 开发非常陌生(在磁编码方面更是如此),所以对我来说也是一次冒险。 好的。现在我正在积极研究它,您是否使用 WinForms 打印引擎?我的 WPF 打印类似乎没有任何 PrintPage 事件。 你好,doNET!我不确定我是否完全理解你的问题。这是我的 using 语句: using System;使用 System.Configuration;使用 System.Diagnostics;使用 System.Drawing;使用 System.Drawing.Printing;使用 System.Windows;您可以简单地创建一个 PrintUtility.cs 类并添加上面的代码来创建一个 Print() 方法和 PrintPage(object o, PrintPageEventArgs e) 方法。这是您应该编写的仅有的两种方法。 我终于明白了 WPF 中的打印是如何工作的。我会尽快发布详细的答案。谢谢你和我在一起。是的,您没有使用 WPF 的本机打印功能。这里的工作方式略有不同。

以上是关于磁条印刷:从哪里开始?的主要内容,如果未能解决你的问题,请参考以下文章

印刷电路板(PCB)基础

谁知道印刷常说LAB值是怎么解释?

印刷设计工作中的经验和教训

上游纸价涨势汹汹,包装印刷企业面临生死考验

全新印刷版《DevOps 三十六计》图书等你来拿

印刷行业B2B电子商务网站精细化商机管理,驱动销售业绩增长