RDLC打印在半A4上

时间:2013-03-18 21:53:40

标签: .net printing report reporting rdlc

我想要完成的事

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

enter image description here

我一直得到的

enter image description here

我尝试了什么

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

  • 打印到A4纸张肖像
  • 打印到A4纸质景观
  • 创建定义为210 x 147的自定义纸张尺寸并打印纵向和横向
  • 处理PrintingBegin的{​​{1}}事件并将ReportViewer设置为相同的纸张尺寸

没有任何帮助。我似乎记得在某处读取如果报告高度小于宽度,打印输出会自动旋转到横向。我不知道该功能是否可以关闭......

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

2 个答案:

答案 0 :(得分: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");

再一次,你仍然需要一个拥有所有必要方法的课程。 我不打算为此课程取得学分;这是来自西班牙的作家Francisco Javier Ceballos的作品。 Ceballos先生是讲西班牙语的SD社区的着名作家,这是他的书“Microsoft C#Cursodeprogramació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;
        }   
    }   
}   

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

答案 1 :(得分:1)

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

有一个技巧,你需要做的是创建一个正方形的报告,即宽度= 210毫米&amp;高度= 210mm但仅使用报告的第一个145mm从上到下放置物品。

将底部65毫米空间留空。