卷纸小票打印

4
我在Google上搜索了很多,但没找到我真正想要的内容。我得到了以下代码,将打印变量name。我购买了爱普生点阵打印机和滚筒纸(无限连续纸)。
我的问题是,在打印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建议这是与C#打印中的进纸符重复。我从上面的问题中学到的是他想要添加进纸符。但我想要移除进纸符编辑2: 通过谷歌搜索,我得到了另一个提示,即页面高度设置为行高将停止进纸,听起来很有前途。我也在努力弄清楚这一点。 编辑3: @Adriano Repetti提供了使用KB链接进行原始打印(直接打印二进制数据)的建议。我在谷歌上搜索了一下,发现它的C#更好的等效paste binpastie.org(因为它是一个方便的工具)。起初听起来不错,它可以很好地停止进纸。但最终我遇到了一些问题。
  • 在我的代码中,我必须将一些打印引号对齐到中心或对齐到左侧。我只有使用空格制表符的选项。但是我们无法确定打印机内置字体的格式是否正确。(参考:@syncis的SO问题
  • 其次,我必须将我的应用程序移动到至少具备Unicode(本地语言支持)能力的应用程序中,在一个月左右的时间内。在这种情况下,原始打印无法帮助我,我将不得不再次经历这些面孔。因此,为了避免这种情况,最好让我保持使用Graphics DrawString。为此,我改变了我的代码。
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

如何使用支持unicode的TextRenderer.DrawText进行打印而不需要形式上的进纸 我认为将纸张高度设置为行高将解决我的问题。如果是这样,请告诉我如何操作,或者建议一个更好的方法来停止纸张进纸。它真的耗费了我很多宝贵的时间......

编辑4:今天我发现了一件非常有趣的事情,就是我的打印机。我甚至无法手动设置自定义纸张大小(不是通过编程...我的意思是控制面板 -> 打印机和传真->爱普生LX-300+->属性->打印首选项->纸张/质量 ->高级 ->纸张大小-> BOOOOOM没有显示我的自定义纸张大小)。我正在使用爱普生LX-300+打印机。你们认为它不支持自定义纸张大小吗?这会导致我的问题吗?


请参见"问题标题中是否应包含“标签”?",共识是“不应该”! - user57508
1
我不认为这是重复的。因为在Form feed in c# printing中尝试插入换页符,而在这里我正在尝试删除表单字段。 - vinrav
1
抱歉,我贴错了链接。据我所知,问题在于PrintDocument会为每个页面添加一个换页符,并且它的所有逻辑都假定您每次打印一页。是的,您可以保留数据直到完成一页,或者按照本文所述的正确(困难)方式进行操作(针对VB.NET,但代码很容易翻译):https://support.microsoft.com/en-us/kb/322090 - Adriano Repetti
感谢@Adriano Repetti提供的KB链接。我在单独的VB项目中运行了代码,它就像是为我量身定制的一样执行。我将很快转换代码,并在此后发布更新。 - vinrav
使用PrintDocument类只是错误的方法。在Windows中打印是基于页面的,只要使用打印机驱动程序,您将始终获得换页符。它也非常慢,对于销售点应用程序来说太慢了。您需要绕过驱动程序并直接向打印机发送命令,此KB文章显示如何操作。将“吃饭时间”问题至少乘以π平方因子。 - Hans Passant
显示剩余8条评论
1个回答

0

我自己找到了解决方案(很抱歉我的英语),正如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;

}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接