c# - 用卷纸打印收据

标签 c# unicode printing drawstring

我在谷歌搜索了很多,没有找到我真正想要的。我得到了以下代码,它将打印变量 name .我有一台爱普生点阵打印机和卷纸( headless 连续纸)。
我的问题是,打印后 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# 更好 等效 paste binpastie.org (提供是因为它是一个方便的)。起初听起来不错,而且在停止表单喂养时效果很好。但最终我撞上了一些冰山。

  • 在我的代码中,我必须将一些打印引号与 对齐。中心或对齐到 `.为此我只能选择使用 空间标签 .但是不能保证它的格式会很好,因为我们不能确定打印机内置的字体。( Refer:SO Question by @syncis )

  • 其次,我必须将我的申请移至 unicode(本地语言支持)有能力的,至少用一个月左右。在那种情况下,原始打印无济于事,我将不得不再次查看这些面孔。所以,为了避免这种情况,我最好留在 图形拉绳 .为此,我将代码更改为。

  • //---------
    //点击开始按钮
    //---------
    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 作为。
    如何用打印TextRenderer.DrawText with unicode support without form feeding ? 我认为将纸张高度设置为行高将解决我的问题。如果是这样,如何或建议我停止进纸的更好方法。它真的占用了我很多宝贵的时间......
    编辑 4:今天我发现了一个关于我的打印机的非常有趣的事情。我什至不能手动设置自定义纸张尺寸(不是通过编码..我的意思是控制面板->打印机和传真->爱普生LX-300+->属性->打印首选项->纸张/质量->高级->纸张尺寸-> BOOOOOM 没有显示我的自定义纸张尺寸)。我正在使用爱普生 LX-300+ 打印机。大家认为它不支持自定义纸张尺寸吗?这给我带来了问题吗?

    最佳答案

    我自己找到了解决方案(对不起我的英语)正如 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;
    

    }

    关于c# - 用卷纸打印收据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30707804/

    相关文章:

    c# - 什么在空花括号 block 中插入空格?

    Python 字符串,默认编码和解码(UTF-8?)

    有人可以帮我解释一下这个递归函数吗?

    python - 在 Python3 中打印格式化的浮点列表

    asp.net - 关于生成可打印报告/发票的建议?

    javascript - 如何将javascript变量传递给服务器端asp.net

    c# - Asp.net MVC 路由不匹配某些文件扩展名

    vim - 在 Vim 中将字符转换为代码点

    c++ - C++ exe (MSVC++2010) 中的 Unicode 问题

    c# - 导出到 excel 多个工作表/标签