簡體   English   中英

磁條印刷:從哪里開始?

[英]Magnetic stripe printing: Where to start?

這是與ID卡打印相關的WPF桌面應用程序。 我們嘗試添加的新功能之一是磁條編碼。 花了幾天后,我仍然不確定從哪里開始。 谷歌搜索更多新問題。 我將在這里對其進行總結。 我很高興收到專家的來信(即使有人可以回答一個/某些問題):

  1. 磁條式打印機是否也像普通打印機一樣工作(這意味着它們也可以打印文本和圖形嗎?或者我們是在第一遍中在其他普通打印機上打印卡,然后將其插入磁條式打印機中以在其上編碼磁數據)。第二遍)?
  2. 如果對Q1的回答為是,我如何在常規打印作業期間(通過WPF,使用PrintDialogFixedDocument等完成)將磁條數據發送到打印機。
  3. 我下載並檢查了Zebra打印機SDK。 看起來這些打印機除了磁條編碼外還支持文本/圖形打印,但是他們的SDK需要我調用其本機打印功能,這不適合WPF的標准打印模型。 如何克服呢?
  4. 另一個地方,我讀到磁條式打印機要求使用特定格式的簡單ASCII文本才能將其編碼到卡上,即使在記事本中也可以做到這一點。 如果是這樣,則對Q1的答案可能是否定的。 但是話又說回來,這種方法如何與常規WPF打印結合使用?

編輯

  1. 我還了解到 ,當將磁條字體放在文檔中時,最終會被編碼為磁條,而不是常規打印。 如果是這樣,它將非常適合WPF打印模型。 但是谷歌搜索並沒有為磁條字體返回太多有希望的結果。 也許這是特定品牌的功能。

我目前正在從事類似的WPF項目,該項目需要磁編碼以及ID卡上的圖像打印。 我發現只要主機上安裝了具有磁性編碼的打印機驅動程序,磁性編碼就非常簡單。 需要注意的一個重要方面是駕駛員使用的定界符。 可以為NULL,零或空格。 在對特定音軌(即音軌2而不是我們的音軌1)進行編碼時,這會起作用。 我使用NULL設置,該設置僅允許在作業中發送Track 2數據。 在Fargo打印機的打印機首選項(控制面板->硬件和聲音->設備和打印機->右鍵單擊打印機->打印機首選項)中可以找到此設置。 這是這些首選項的示例(請注意ASCII偏移字段):

證卡打印機首選項-磁性編碼

我不認為您必須為要使用的打印機使用SDK。 我使用的是Fargo打印機,但使用PrintDocument和PrintPage編寫了自己的打印功能,用於磁性編碼和圖像。

一個示例和快速測試是使用Notepad ++(或類似版本)將Track 2數據發送到打印機。 將其復制並粘貼到編輯器的第一行並進行打印(使用證卡打印機)。

~2;000099990000?

驅動程序應了解它是“跟蹤數據”這一事實,並進行相應處理,而無需您進行任何其他輸入。 您可能需要按照說明使用打印機首選項。

〜2; 表示軌道2,后跟12個字符的數據字符串,后跟末尾(?)。 有很多有關在線跟蹤數據和布局的文檔。 這是假設一個空定界符值(在軌道1和軌道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來執行打印作業。

我希望這有幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM