6

RichTextBox のコンテンツを印刷しようとしましたが、プリンターに印刷するとバグが多すぎます。しかし、XPSファイルに(WindowsのXPSプリンターを介して)印刷し、このファイルをプリンターに印刷すると、すべて問題ありません。

では、これらすべてをプログラムで実行できますか?

ここに私の印刷方法があります:

 public int PrintRotate(bool rotate, PrintPageEventArgs e, int charFrom, int charTo)
    {
        //Calculate the area to render and print
        RECT rectToPrint;
        rectToPrint.Top = (int)(e.MarginBounds.Top * anInch);
        rectToPrint.Bottom = (int)(e.MarginBounds.Bottom * anInch);
        rectToPrint.Left = (int)(e.MarginBounds.Left * anInch);
        rectToPrint.Right = (int)(e.MarginBounds.Right * anInch);

        //Calculate the size of the page
        RECT rectPage;
        rectPage.Top = (int)(e.PageBounds.Top * anInch);
        rectPage.Bottom = (int)(e.PageBounds.Bottom * anInch);
        rectPage.Left = (int)(e.PageBounds.Left * anInch);
        rectPage.Right = (int)(e.PageBounds.Right * anInch);

        IntPtr hdc = e.Graphics.GetHdc();

        FORMATRANGE fmtRange;
        fmtRange.chrg.cpMax = charTo;               //Indicate character from to character to 
        fmtRange.chrg.cpMin = charFrom;
        fmtRange.hdc = hdc;                    //Use the same DC for measuring and rendering
        fmtRange.hdcTarget = hdc;              //Point at printer hDC
        fmtRange.rc = rectToPrint;             //Indicate the area on page to print
        fmtRange.rcPage = rectPage;            //Indicate size of page


        SetGraphicsMode(fmtRange.hdc, GM_ADVANCED);

        XFORM par = new XFORM();

        par = new XFORM();
        par.eM11 = 1;
        par.eM12 = 0;
        par.eM21 = 0;
        par.eM22 = 1;
        par.eDx = -e.PageSettings.Margins.Left / 100 * e.PageSettings.PrinterResolution.X;
        par.eDy = -e.PageSettings.Margins.Top / 100 * e.PageSettings.PrinterResolution.Y;
        ModifyWorldTransform(fmtRange.hdc, ref par, MWT_LEFTMULTIPLY);

        IntPtr res = IntPtr.Zero;

        IntPtr wparam = IntPtr.Zero;
        wparam = new IntPtr(1);

        //Get the pointer to the FORMATRANGE structure in memory
        IntPtr lparam = IntPtr.Zero;
        lparam = Marshal.AllocCoTaskMem(Marshal.SizeOf(fmtRange));
        Marshal.StructureToPtr(fmtRange, lparam, false);

        //Send the rendered data for printing 
        res = SendMessage(Handle, EM_FORMATRANGE, wparam, lparam);

        //Free the block of memory allocated
        Marshal.FreeCoTaskMem(lparam);

        //Release the device context handle obtained by a previous call
        e.Graphics.ReleaseHdc(hdc);

        //Return last + 1 character printer
        return res.ToInt32();
    }
4

1 に答える 1

1

私はこのような問題を抱えていて、最終的に.XPSファイルを作成してからプリンターに送信しました。

あなたの質問から、リッチ テキスト ボックスを xps ファイルに印刷するプロセスについて何も知らないので、xps ファイルに「印刷」するプロセスが既にあるようです。私のシナリオでは、ms office を使用せずにドキュメントを印刷する必要があったため、最終的に XPS ファイルを作成し、コードで編集してから、プリンターに送信しました。

これは、xps ファイルを直接プリンターに送信するために使用するコードです。

LocalPrintServer localPrintServer = new LocalPrintServer();
var queue = localPrintServer.GetPrintQueue("NameOfPrinter");
PrintSystemJobInfo xpsPrintJob = queue.AddJob("name of print job", "my/xps/path.xps",false);

また、このコードを機能させるには、System.Printing と "ReachFramework" への参照を追加する必要があることにも注意してください。印刷ジョブにアクセスできなかった理由を突き止めるのに、思い出すよりも時間がかかりました。

私の経験では、ほとんどのプリンターがこれをサポートしているはずです。一般的なものであり、保管部門の奇妙な「バーコードプリンター」でも機能します。

于 2015-02-26T11:54:53.183 に答える