打印到XPS文件,然后将其打印到打印机

Dmi*_*lov 6 c# printing richtextbox xps winforms

我试图打印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();
    }
Run Code Online (Sandbox Code Playgroud)

Kas*_*sen 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);
Run Code Online (Sandbox Code Playgroud)

另请记住,要使此代码正常工作,您需要添加对 System.Printing 和“ReachFramework”的引用。我花了比我想记得的时间更长的时间来找出为什么我无法访问打印作业。

根据我的经验,大多数打印机应该支持这一点。常见的,甚至可以在我们存储部门的奇怪的“条形码打印机”上运行。