5

我想要完成的

要求:打印一张 A4 宽度和 A4 高度一半的收据并旋转打印,以便可以在连续 A4(CCP)上打印。

在此处输入图像描述

我总是得到什么

在此处输入图像描述

我试过的

RDLC 报告定义为 205 毫米 x 145 毫米,因此它应该很好地适合可用空间。
我试过以下

  • 打印到 A4 纸纵向
  • 打印到 A4 纸横向
  • 创建定义为 210 x 147 的自定义纸张尺寸并打印纵向和横向
  • 处理和设置为相同纸张大小PrintingBegin的事件ReportViewerDefaultPageSettings

没有任何帮助。我似乎记得在某处读过,如果报告高度小于宽度,打印输出会自动旋转为横向。不知道能不能关掉这个功能...

更新:页面尺寸为 208 毫米 x 147 毫米,边距为 12 毫米。报告正文为 173mm x 121mm

4

2 回答 2

2

前段时间打印时遇到了同样的问题,我想我应该分享对我有用的解决方案。如果您使用了替代路线,您也可以分享,我想看看什么对您有用。

有一个技巧,您需要做的是将报告创建为正方形,即宽度 = 210 毫米和高度 = 210 毫米但仅使用报告的前 145 毫米从上到下放置项目。

将底部 65mm 空间留空。

于 2017-06-02T18:04:00.570 回答
1

我要试一试。我的猜测是您正在使用一组用于打印的库,这些库在高层次上运行良好,但您应该使用更“手动”的东西。我爸爸拥有一家咖啡店,我制作了他的 POS 软件。我们的收据打印机只打印带有我要给你的代码的行。我猜以这种方式移动可能对你有用。

这种方法不打印图像,只打印文本,这一点很重要。

我的代码中的打印方法似乎与您的不同;它们是“字符敏感的”。这意味着,如果您需要 3 个空格键笔划的边距,您需要先写 3 个空格键笔划,然后是您的文本。

要运行此代码,您必须创建一个“.txt”,然后将该文本文件作为参数发送给打印类。我不确定您使用的是 c# 还是 VB,我的代码在 c# 中。

因此,首先,要在程序中的任何位置创建文本文件,您需要标题:

using System.IO;

然后,您将开始创建文本文件:

StreamWriter sw = new StreamWriter("receipt.txt");

这会在您当前的文件夹中创建一个文件 - 与您的 .exe 所在的文件夹相同。它还会覆盖旧文件,因此您不必担心以前是否存在同名文件。要写下收据行,您将使用:

sw.WriteLine("  the text is supposed to be written, you may use concatenations  ");

WriteLine 方法将一行文本写入文件,然后移至下一行。

完成写入后,您需要使用...关闭文件

sw.Close();

然后你需要打电话给我要给你的印刷课。假设您已经拥有它,您需要创建它的一个实例,如下所示:

PimpMyPrint p = new PimpMyPrint();

然后调用 PrintDoc 方法...

p.PrintDoc("receipt.txt");

再一次,您仍然需要一个包含所有必要方法的类。我不会在这门课上学分;它是来自西班牙的作家弗朗西斯科·哈维尔·塞巴洛斯的作品。Ceballos 先生是讲西班牙语的 SD 社区的知名作者,这来自他的书“Microsoft C# Curso de programación”。

所以这里是你需要添加的类:

using System;
using System.IO;
using System.Drawing;
using System.Drawing.Printing;

namespace SomeNamespace
{   
    class PimpMyPrint
    {
        private Font font;
        private StreamReader sr;

        public void PrintDoc(string textfile)
        {
            try
            {
                sr = new StreamReader(textfile);

                try
                {
                    font = new Font("Arial", 10);
                    PrintDocument pd = new PrintDocument();
                    pd.PrintPage += new PrintPageEventHandler(this.PrintPage);
                    pd.Print();
                }
                finally
                {
                    sr.Close();
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
        }

        private void PrintPage(object obj, PrintPageEventArgs ev)
        {
            float LinesPerPage = 0;
            float pos_Y = 0;
            int count = 0;
            float marginLeft = ev.MarginBounds.Left;
            float marginUP = ev.MarginBounds.Top;
            string line = null;

            float fontHeight = font.GetHeight(ev.Graphics);
            LinesPerPage = ev.MarginBounds.Height / fontHeight;

            while (count < LinesPerPage && ((line = sr.ReadLine()) != null))
            {
                pos_Y = marginUP + (count * fontHeight);
                ev.Graphics.DrawString(line, font, Brushes.Black, 0, pos_Y, new StringFormat());
                count++;
            }

            if (line != null)
                ev.HasMorePages = true;
            else
                ev.HasMorePages = false;
        }   
    }   
}   

我希望这对你有用,就像它对我有用!

于 2013-03-30T01:13:29.013 回答