【问题标题】:Receipt printing in roll paper用卷纸打印收据
【发布时间】:2015-06-08 11:20:41
【问题描述】:

我在谷歌上搜索了很多,但没有找到我真正想要的。我得到以下代码,它将打印变量name。我有一台 Epson 点阵打印机和卷纸(无尽的连续纸)。

我的问题是,在打印 name 后,进纸的尺寸为 A4。我不想要进纸。此应用程序旨在打印收据,其中包含无限数据,需要完美打印(无分页符)。

各位聪明人能用这些代码为我指明正确的方向吗? 编辑此代码并更改场景..请进一步向下移动

private void pd_PrintPage(object sender, PrintPageEventArgs e)
{
  Font Heading2 = new Font("Times New Roman", 13);
  StringFormat sf = new StringFormat();
  sf.LineAlignment = StringAlignment.Near;
  sf.Alignment = StringAlignment.Center;
  //e.HasMorePages = false;
  PaperSize pkCustomSize1 = new PaperSize("First custom size", 100, 200);
  pd.DefaultPageSettings.PaperSize = pkCustomSize1;
  e.Graphics.DrawString(name.ToString(), Heading1, Brushes.Black, e.MarginBounds.Left + (e.MarginBounds.Width / 2), e.MarginBounds.Top, sf);
}

编辑 1:- @Adriano Repetti 建议这是与 Form feed in c# printing 的副本。我从上述问题中学到的是他想要添加表单提要。但我想删除表单提要

编辑 2:- 我通过谷歌搜索得到另一个提示,page Height 设置为等于line height 将停止喂食,这听起来很有希望。我也在努力解决这个问题。

编辑 3:- @Adriano Repetti 建议我使用 KB link 进行原始打印(直接打印二进制数据)。我搜索了一下,发现它的 c# better 等效 paste binpastie.org(提供是因为它很方便)。起初它听起来不错,它很好地停止了表格馈送。但最终我碰到了一些冰山。

  • 在我的代码中,我必须将一些打印引号对齐到 center 或对齐到 left`。为此,我只能选择使用 spacetabs。但是不能保证它的格式会很好,因为我们不能确定带有打印机的内置字体。(Refer:SO Question by @syncis
  • 其次,我将不得不将我的应用程序迁移到支持 unicode(本地语言支持) 的应用程序,至少在一个月左右的时间内。在那种情况下,原始打印将无济于事,我将不得不再次检查这些面孔。所以,为了避免这种情况,我最好留在 Graphics DrawString。为此,我将代码更改为。
//--------- // 开始按钮点击 //--------- PrintDocument pdoc = new PrintDocument(); pdoc.DefaultPageSettings.PaperSize.Height = 300; pdoc.Print(); //--------- //结束按钮点击 //---------
private void pd_PrintPage(object sender, PrintPageEventArgs e)
{
  Font Heading2 = new Font("Times New Roman", 13);

  // changed following statement to met with new **unicode** criteria
  //e.Graphics.DrawString(name.ToString(), Heading1, Brushes.Black, e.MarginBounds.Left + (e.MarginBounds.Width / 2), e.MarginBounds.Top, sf);

 TextRenderer.DrawText(e.Graphics, "My name in local language is വിനീത്", Heading2, new Point(0, 0), Color.Black);
}

针对当前的问题,我将问题扩展标签重新定义为 unicode 为。

How can print with TextRenderer.DrawText with unicode support without form feeding ? 我认为将纸张高度设置为行高可以解决我的问题。如果是这样,如何或建议我更好的方法来停止进纸。真是占用了我很多宝贵的时间……

编辑 4: 今天我发现了一件关于我的打印机的非常有趣的事情。我什至无法手动设置自定义纸张尺寸(不是通过编码..我的意思是控制面板->打印机和传真机->Epson LX-300+->属性->打印首选项->纸张/质量->高级->纸张尺寸- > BOOOOOM 未显示我的自定义纸张尺寸)。我正在使用爱普生 LX-300+ 打印机。大家认为它不支持自定义纸张尺寸吗?这会给我带来麻烦吗?

【问题讨论】:

  • 请参阅"Should questions include “tags” in their titles?",其中的共识是“不,他们不应该”!
  • 我不认为它是重复的。因为在Form feed in c# printing 尝试插入表单提要,而在这里我试图删除表单字段。
  • 对不起,我粘贴了错误的链接。 AFAIK 问题是 PrintDocument 将为每个页面添加一个换页符,并且所有逻辑都假设您每次都在打印一个页面。是的,您可以保留数据直到页面完成,或者以本文所述的正确(硬)方式进行(对于 VB.NET,但代码很容易翻译):support.microsoft.com/en-us/kb/322090
  • 感谢 @Adriano Repetti 提供 [KB 链接](support.microsoft.com/en-us/kb/322090)。我在单独的 VB 项目中运行代码,它就像是为我制作的一样执行。我将很快转换代码并发布更新。
  • 使用 PrintDocument 类是错误的做法。在 Windows 中打印是基于页面的,只要您使用打印机驱动程序,您总会得到换页。它也是出了名的慢,对于销售点应用程序来说太慢了。您需要绕过驱动程序并将命令直接发送到打印机,this KB article 显示如何。将“吃饭时间”问题至少乘以 pi 平方。

标签: c# unicode printing drawstring


【解决方案1】:

我自己找到了解决方案(对不起我的英语)正如 Hans Passant 所说(PrintDocument 是基于页面的。故事结束)你必须使用(e.HasMorePages = true;)


float cordenadaX;
float cordenadaY;

int totalPages;
int paginaAtual;
int indiceItem;
List<string> items;
public void ImprimeDanfeNFCe()
{
    totalPages = 1;
    paginaAtual = 1;
    indiceItem = 0;
    cordenadaX = 0;
    cordenadaY = 0;

    items = new List<string>();
    items.Add("Item1");
    items.Add("Item2");
    items.Add("Item3");
    (............)

    PrintDocument recordDoc = new PrintDocument();

    recordDoc.DocumentName = "xMarket danfe";

    recordDoc.PrintPage += new PrintPageEventHandler(imprimeDanfeReceipt);
    PrinterSettings ps = new PrinterSettings();
    ps.PrinterName = "My printer";
    recordDoc.PrinterSettings = ps;
    recordDoc.Print();
    recordDoc.Dispose();
}
void imprimeDanfeReceipt(PrintPageEventArgs e)    
{
   float pageHeight = e.MarginBounds.Height;

   string text = "";
   if (paginaAtual == 1)
   {
      text = "Cupom header";
      e.Graphics.DrawString(text, drawFontDanfeTitulo, drawBrush, new 
           RectangleF(cordenadaX, cordenadaY, width, height), 
           drawFormatCenter);
      cordenadaY += e.Graphics.MeasureString(text, drawFontDanfeTitulo).Height;
   }
   for (int i = indiceItem; i < items.Count; i++)
   {
       int indice = i + 1;
       //items[i] Is very important to not print same items again while print next page
       e.Graphics.DrawString(items[i], drawFontDanfeItems, drawBrush, 
           new RectangleF(cordenadaX, cordenadaY, width, height), drawFormatLeft);
       cordenadaY += e.Graphics.MeasureString(text, drawFontDanfeTitulo).Height;
       indiceItem++;
       //cordenadaY+100 is for the size of the footer
       if (cordenadaY+100 >= pageHeight)
       {
           paginaAtual++;
           e.HasMorePages = true;
           return;
       }
    }
   e.Graphics.DrawString("page footer", drawFontDanfeItems, drawBrush, 
       new RectangleF(cordenadaX, cordenadaY, width, height), drawFormatLeft);
   cordenadaY += e.Graphics.MeasureString(text, drawFontDanfeTitulo).Height;

}

【讨论】:

    猜你喜欢
    • 2011-05-20
    • 2018-01-31
    • 2020-04-03
    • 1970-01-01
    • 1970-01-01
    • 2012-08-29
    • 2013-07-05
    • 1970-01-01
    相关资源
    最近更新 更多