5

達成したいこと

要件: A4 幅、A4 高さの半分のレシートを印刷し、A4 連続印刷 (CCP) に印刷できるように回転させて印刷します。

ここに画像の説明を入力

私がいつも得るもの

ここに画像の説明を入力

私が試したこと

RDLC レポートは 205mm x 145mm として定義されているため、使用可能なスペースにうまく収まるはずです。
私は次のことを試しました

  • A4用紙縦向きに印刷
  • A4用紙横に印刷
  • 210 x 147 として定義されたカスタム用紙サイズを作成し、縦向きと横向きに印刷する
  • PrintingBeginのイベントを処理し、同じ用紙サイズReportViewerに設定DefaultPageSettings

何も助けませんでした。レポートの高さが幅よりも小さい場合、印刷物は自動的に横向きに回転するということをどこかで読んだことを覚えているようです。その機能をオフにできるかどうかはわかりません...

更新:ページ サイズは 208mm x 147mm、余白はすべての辺で 12mm です。レポートの本文は 173mm x 121mm

4

2 に答える 2

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 に答える